文章目录
SpringMVC介绍
Spring web mvc和Struts2都属于表现层的框架,SpringMVC是Spring提供的一个实现了WebMVC设计模式的轻量级Wen框架,它是Spring框架的一部分。
架构流程
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户
组件说明
以下组件通常使用框架提供实现:
-
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。 -
HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 -
Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。 -
HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
下图是许多不同的适配器,最终都可以使用usb接口连接 -
ViewResolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 -
View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开发的组件有handler、view
springmvc和struts2的不同
- springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。
- springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例,以方法为模板,请求访问时将方法复制的副本放入本地线程中,每次请求创建一个方法),struts2是基于类开发(每次请求创建一个类),传递参数是通过类的属性,只能设计为多例。
- Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。
核心配置
Controller层
1. 配置Springmvc.xml
SpringMVC核心配置文件
配置内容:
组件扫描器:Controller扫描自动扫描标记@Controller的控制器类 让Spring对页面控制层Controller进行管理
注解驱动:配置注解映射器和适配器,两者已废弃,用注解驱动代替
视图解析器:视图解析器用SpringMVC默认的,支持JSP视图的解析 配置前后缀 最终JSP物理地址 前缀+逻辑视图名+后缀
web.xml配置SpringMVC
包括 前端控制器 和核心配置文件 Springmvc.xml的路径
注解配置
@Controller注解类型
用于指示Spring类的实例是一个控制器。该注解在使用时不需要再实现Controller接口,只需要将@Controller注解加到控制器类上,然后通过Springmvc.xml中的组件扫描器扫描机制找到标注了该注解的控制器
@RequestMapping注解配置
里面放的是请求的url,和用户请求的url进行匹配
添加到方法上面
URL路径映射,@RequestMapping(value=“item”)或@RequestMapping("/item")
添加在类上面
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头
Controller方法返回值
-
返回ModelAndView
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。 -
返回void
在Controller方法形参上可以定义HttpServlet类型的request和response,使用request或response指定响应结果:
-
用request转发页面,如下:
request.getRequestDispatcher(“页面路径”).forward(request, response);
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response); -
可以通过response页面重定向:
response.sendRedirect(“url”)
response.sendRedirect("/springmvc-web2/itemEdit.action"); -
可以通过response指定响应结果,例如响应json数据如下:
response.getWriter().print("{“abc”:123}");
- 返回字符串
-
逻辑视图名
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp
return “itemList”; -
Redirect重定向
Contrller方法返回字符串可以重定向到一个url地址
如下商品修改提交后重定向到商品编辑页面。
@RequestMapping(“updateItem”)
public String updateItemById(Item item) {
// 更新商品
this.itemService.updateItemById(item);
// 修改商品成功后,重定向到商品编辑页面
// 重定向后浏览器地址栏变更为重定向的地址,
// 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
// 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数
return “redirect:/itemEdit.action?itemId=” + item.getId();
}
- forward转发
Controller方法执行后继续执行另一个Controller方法
如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。
@RequestMapping(“updateItem”)
public String updateItemById(Item item) {
// 更新商品
this.itemService.updateItemById(item);
// 修改商品成功后,继续执行另一个方法
// 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
// 转发并没有执行新的request和response,所以之前的请求参数都存在
return “forward:/itemEdit.action”;
}
//结果转发到itemEdit.action,request可以带过去
return “forward: /itemEdit.action”;
异常处理器
异常处理思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理
json数据交互
- @RequestBody
作用:
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。
传统的请求参数:
itemEdit.action?id=1&name=zhangsan&age=12
现在的请求参数:
使用POST请求,在请求体里面加入json数据
{
“id”: 1,
“name”: “测试商品”,
“price”: 99.9,
“detail”: “测试商品描述”,
“pic”: “123456.jpg”
}
@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象进行绑定
- @ResponseBody
作用:
@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
@ResponseBody注解实现将Controller方法返回java对象转换为json响应给客户端。
@RequestMapping(“testJson”)
public @ResponseBody Item testJson(@RequestBody Item item) {
return item;
}