SpringMVC介绍
Spring web mvc 和Struts2都属于表现层的框架,它是Spring框架的一部分
SpringMVC处理流程
入门程序
创建工程
导入jar包
在web.xml中配置前端控制器DispatcherServlet
springmvc
org.springframework.web.servlet.DispatcherServlet
springmvc
*.action
在上面的url-pattern中拦截规则有如下:
- /* 表示拦截所有 jsp js png .css 会全部拦截
- *.action *.do 拦截以do action 结尾的请求
- / 拦截所有(不包括jsp) 包含 .js .png .css
创建springmvc.xml
创建pojo
public class Item {
// 商品id
private int id;
// 商品名称
private String name;
// 商品价格
private double price;
// 商品创建时间
private Date createtime;
// 商品描述
private String detail;
创建带参数的构造器
set/get。。。
}
创建ItemController
ItemController是一个普通的java类,不需要实现任何接口
需要再类上添加@Controller注解,将Controller交由Spring管理
在方法上面添加@RequestMapping注解 里面指定请求的url
@RequestMapping("/itemList.action")
public ModelAndView queryItemList() {
// 创建页面需要显示的商品数据
// 创建页面需要显示的商品数据
List list = new ArrayList<>();
list.add(new Items(1, "1华为 荣耀8", 2399f, new Date(), "质量好!1"));
list.add(new Items(2, "2华为 荣耀8", 2399f, new Date(), "质量好!2"));
list.add(new Items(3, "3华为 荣耀8", 2399f, new Date(), "质量好!3"));
list.add(new Items(4, "4华为 荣耀8", 2399f, new Date(), "质量好!4"));
list.add(new Items(5, "5华为 荣耀8", 2399f, new Date(), "质量好!5"));
list.add(new Items(6, "6华为 荣耀8", 2399f, new Date(), "质量好!6"));
//创建modelandview 模型视图对象
ModelAndView mav = new ModelAndView();
//设置视图跳转名称
mav.setViewName("WEB-INF/jsp/itemList.jsp");
//设置model数据
mav.addObject("itemList", list);
return mav;
}
启动测试
SpringMVC架构
框架结构
组件说明
以下组件通常由SpringMVC提供实现
前端控制器 DispatcherServlet
用户请求到达前端控制器,它就相当于MVC模式中的C,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispathcerServlet的存在降低了各个组件之间的耦合性
处理器映射器 HandlerMapping
HandlerMapping负责根据用户请求url找到Handler(处理器)springmvc提供了不同的映射器实现不同的映射方式。
Handler处理器
Handler是继DispathcerServlet前端控制器的后端控制器,在DispathcerServlet的控制下Handler对具体的用户请求进行处理 由于Handler涉及到具体的用户业务请求,所以一般情况需要自己开发Handler
HandlerAdapter 处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更对类型的处理器进行执行
ViewResolver 视图解析器
ViewResolver 负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给客户
View视图
springmvc框架提供了很多View视图类型的支持,包括:jstlView、freemarkerView、pdfView等
说明
在SpringMVC的各个组件中,处理器映射器,处理器适配器、视图解析器称为SpringMVC的三大组件
需要用户开发的组件是:Handler View
注解映射器和适配器
配置处理器映射器
注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。根据@RequestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。
HandlerMethod对象中封装URL对应的方法Method
从Spring3.1开始,废除了DefaultAnnotationHandlerMapping的使用 拓建使用RequestMappingHandlerMapping完成注解式处理器映射
在springmvc.xml配置文件中配置如下
配置处理器适配器
注解式处理器适配器,对标记@RequestMapping的方法进行适配
从Spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式适配器适配
在springmvc.xml配置文件中配置如下
注解驱动
直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载 SpringMVC使用
可以在springmvc.xml配置文件中使用
视图解析器
视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析
在springmvc.xml配置文件中配置如下
修改ItemController
// @RequestMapping:里面放的是请求的url,和用户请求的url进行匹配
// action可以写也可以不写
@RequestMapping("/itemList.action")
public ModelAndView queryItemList() {
// 创建页面需要显示的商品数据
List- list = new ArrayList<>();
list.add(new Item(1, "1华为 荣耀8", 2399, new Date(), "质量好!1"));
list.add(new Item(2, "2华为 荣耀8", 2399, new Date(), "质量好!2"));
list.add(new Item(3, "3华为 荣耀8", 2399, new Date(), "质量好!3"));
list.add(new Item(4, "4华为 荣耀8", 2399, new Date(), "质量好!4"));
list.add(new Item(5, "5华为 荣耀8", 2399, new Date(), "质量好!5"));
list.add(new Item(6, "6华为 荣耀8", 2399, new Date(), "质量好!6"));
// 创建ModelAndView,用来存放数据和视图
ModelAndView modelAndView = new ModelAndView();
// 设置数据到模型中
modelAndView.addObject("itemList", list);
// 设置视图jsp,需要设置视图的物理地址
// modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
// 配置好视图解析器前缀和后缀,这里只需要设置逻辑视图就可以了。
// 视图解析器根据前缀+逻辑视图名+后缀拼接出来物理路径
modelAndView.setViewName("itemList");
return modelAndView;
}
整合mybatis
整合目标:控制层采用SpringMVC 持久层采用mybatis
导入jar包
创建数据库配置文件db.properties
- db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://140.210.70.23:3306/springmvc?characterEncoding=utf-8
jdbc.username=appUser
jdbc.password=AA1122BB
web.xml
- 在web.xml加入Spring监听器 ContextLoaderListener 并指定Spring配置文件
- web.xml文件中配置SpringMVC的前端控制器
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
*.action
springmvc.xml
- 在springmvc中配置controller扫描包
- 视图解析器
- 注解驱动
applicationContext.xml
- spring配置文件中配置 数据库文件,连接池
- 配置mybatis的工厂并指定核心配置文件的位置
- 指定mapper动态代理开发的扫描
参数绑定
在开发中 需要从请求的参数中把请求的id取出来
id包含在Request对象中,可以从Request对象中取id
想获得Request对象需要再Controller方法的形参中添加一个参数即可。Springmvc框架会自动把Request对象传递给方法
jsp页面
修改
Controller
/**
* 通过id查询商品
*
* @param request
* @return
*/
@RequestMapping("/itemEdit")
public ModelAndView queryItemById(HttpServletRequest request) {
String strId = request.getParameter("id");
Items items = itemService.queryItemById(Integer.valueOf(strId));
//传递结果回页面
ModelAndView mva = new ModelAndView();
mva.setViewName("editItem");
//设置数据
mva.addObject("item", items);
return mva;
}
默认支持的参数类型
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值
- HttpServletRequest 通过request对象获取请求信息
- HttpServletResponse 通过response处理响应信息
- HttpSession 通过session对象得到session中存放的对象
Model/ModelMap
Model
除了ModelAndView之外,还可以使用Model来向页面传递数据
Model是一个接口,在参数里直接声明model即可
如果使用Model则可以不适用ModelAndView对象,Model对象可以向页面传递数据View对象则可以使用String返回值替代
不管是Model还是ModelAndView其本质都是使用Request对象向jsp传递数据
/**
* 根据id查询商品,使用Model
*
* @param request
* @param model
* @return
*/
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, Model model) {
// 从request中获取请求参数
String strId = request.getParameter("id");
Integer id = Integer.valueOf(strId);
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把结果传递给页面
// ModelAndView modelAndView = new ModelAndView();
// 把商品数据放在模型中
// modelAndView.addObject("item", item);
// 设置逻辑视图
// modelAndView.setViewName("itemEdit");
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
ModelMap
ModelMap是Model接口的实现类,也可以通过ModelMap向页面传递数据。
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap
* @param request
* @param model
* @return
*/
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, ModelMap model) {
// 从request中获取请求参数
String strId = request.getParameter("id");
Integer id = Integer.valueOf(strId);
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把结果传递给页面
// ModelAndView modelAndView = new ModelAndView();
// 把商品数据放在模型中
// modelAndView.addObject("item", item);
// 设置逻辑视图
// modelAndView.setViewName("itemEdit");
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
绑定简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。这样从Request取参数的方法就可以进一步简化
/**
* 根据id查询商品,绑定简单数据类型
*
* @param id
* @param model
* @return
*/
@RequestMapping("/itemEdit")
public String queryItemById(int id, ModelMap model) {
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
model.addAttribute("item", item);
return "itemEdit";
}
支持绑定的数据类型
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0
请求url:
http://localhost:8080/xxx.action?id=2&status=false
处理器方法:
public String editItem(Model model,Integer id,Boolean status)
@RequestParam
使用@RequestParam常用于处理简单类型的绑定
- value 参数名字,即入参的请求参数名字
required 是否必须 默认是true 表示请求中一定要有响应的参数 否则报错
default 默认值,表示如果请求中没有同名参数时的默认值
@RequestMapping("/itemEdit")
public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,
ModelMap modelMap) {
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
modelMap.addAttribute("item", item);
return "itemEdit";
}
绑定POJO类型
如果提交的参数很多,或者提交的表单中的内容很多的时候,可以使用简单类型接受数据,也可以使用pojo接收数据。
- 要求:pojo对象中的属性名和表单中的input的name属性一致
Controller
@RequestMapping(value = "/updateitem.action")
public String updateitem(Items items) {
itemService.updateItemsById(items);
return "success";
}
- 处理乱码问题
加入过滤器
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encoding
*.action
绑定包装POJO
创建包装的POJO QueryVo
package cn.probuing.springmvc.pojo;
/**
* @Auther: wxblack-mac
* @Date: 2018/8/28 17:45
* @Description:
*/
public class QueryVo {
private Items items;
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
}
jsp页面