MVC体系结构

M - Model 模型:数据模型(pojo、vo、jo)+业务模型(业务逻辑)
V - View 视图:jsp、html
C - Controller 控制器:servlet
Spring MVC框架是一个应用于表现层的框架。
全名:Spring Web MVC,属于Spring Framework的后续产品。
通过一套注解,可以让一个简单的Java类型成为处理请求的控制器,无须实现任何接口,支持RESTful编程风格的请求。
表现层框架的主要职责就是处理前端HTTP请求
Spring MVC本质上是对servlet的封装,简化了servlet的开发。

  1. 接收请求。
  2. 返回响应,跳转页面。

与原生servlet不同,在Spring MVC中,全局只有一个servlet,接收所有请求。
image.png
实践:

  1. 配置DispatcherServlet前端控制器;
  2. 开发处理具体业务逻辑的Handler(@Controller、@RequestMapping);
  3. xml配置文件中,配置controller扫描和spring mvc三大件;
  4. 将xml文件路径告诉springmvc(DispatcherServlet)。

Spring MVC请求处理流程

image.png

  1. 用户请求发送至前端控制器DispatcherServlet;
  2. DispatcherServlet收到请求后,调用处理器映射器HandlerMapping;
  3. HandlerMapping根据请求Url找到具体的后端控制器Handler,生成处理器对象及处理器拦截器,返回给DispatcherServlet;
  4. DispatcherServlet调用处理器适配器HandlerAdapter去调用Handler;
  5. 执行Handler;
  6. Handler执行完成后给HandlerAdapter返回ModelAndView;
  7. HandlerAdapter向DispatcherServlet返回ModelAndView;
  8. DispatcherServlet请求视图解析器ViewResolver去进行视图解析,根据逻辑视图名来解析真正的视图;
  9. ViewResolver向DispatcherServlet返回View对象;
  10. DispatcherServlet进行视图渲染,即将ModelAndView对象中的模型数据填充到request域中;
  11. DispatcherServlet向用户响应结果。

Spring MVC九大组件

HandlerMappinig 处理器映射器

处理器Handler的具体表现形式可以是类,也可以是方法,如标注了@RequestMapping的方法可以看作是一个Handler。
HandlerMapping的作用就是找到请求相应的处理器Handler和Interceptor。
image.png

HandlerAdapter 处理器适配器

Spring MVC中的Handler是任意形式,而把请求交给Servlet的时候,方法结构是doService(HttpServletRequest req, HttpServletResponse resp)形式,HandlerAdapter的职责就是让固定的Servlet处理方法调用Handler来进行处理。
image.png

HandlerExceptionResolver 处理器异常解析器

用于处理Handler产生的异常情况,根据异常设置ModelAndView,之后交给渲染方法进行渲染,渲染方法会将ModleAndView渲染成页面。
image.png

ViewResolver 视图解析器

用于将String类型的视图名和Locale解析为View类型的视图。
会将程序返回的参数和数据填入模板中,生成html文件。

  1. 找到渲染所用的模板
  2. 找到渲染所用的技术,即找到视图的类型,如JSP。

默认情况下,Spring MVC会自动配置一个InternalResourceViewResolver,针对JSP类型视图。
image.png

RequestToViewNameTranslator 请求到视图名转换器

从请求中找到ViewName。
image.png

LocaleResolver 用户区域解析器

用于从请求中解析出Locale,如中国的Locale是zh-CN。
这个组件也是i18n的基础。(i18n:internationalization)
image.png

ThemeResolver 主题解析器

用来解析主题。
主题是样式、图片及它们所形成的显示效果的集合。
Spring MVC中一套主题对应一个properties文件,里面存放着与当前主题相关的所有资源,如图片、CSS样式等。
创建主题:准备好资源,新建一个“主题名.properties”文件并将资源设置进去,放在classpath下,就可以在页面中使用了。
Spring MVC中与主题相关的类有ThemeResolver、ThemeSource和Theme。

  • ThemeResolver负责从请求中解析出主题名。
  • ThemeSource根据主题名找到具体的主题。
  • Theme用来获取主题和具体的资源,是具体的主题的抽象。

image.png

MultipartResolver 多部分解析器

MultipartHttpServletRequest可以通过getFile()方法直接获得文件。
如果上传多个文件,可以调用getFileMap()方法得到Map这样的结构。
MultipartResolver将普通的请求包装成MultipartHttpServletRequest,使其拥有文件上传的功能。
image.png

FlashMapManager FlashMap管理器

FlashMap用于重定向时的参数传递。
重定向时没有传递参数这一功能,如果不想把参数写进Url,就可以通过FlashMap来传递。
在重定向之前,将要传递的数据写入请求(可以通过ServletRequestAttributes.getRequest()方法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE中,在重定向之后的Handler中,Spring就会自动将其设置到Model中。
FlashMapManager管理FlashMap。
image.png

Spring MVC如何接收请求参数

原生Servlet接收一个整型参数:

  1. String ageStr = request.getParameter("age");
  2. Integer age = Integer.parseInt(ageStr);

Spring MVC框架封装Servlet,简化了很多操作:

  1. @RequestMapping("xxx")
  2. public Strinig handle(Integer age) {
  3. System.out.println(age);
  4. }

参数绑定:取出参数值,绑定到handler方法的形参上。

默认支持Servlet API作为方法参数

绑定简单类型参数

八种基本数据类型及其包装类型。

绑定pojo类型参数

绑定pojo包装对象参数

绑定日期类型参数(需要配置自定义类型转换器)

RESTful风格请求支持

REST:Representational State Transfer。
REST描述了一个架构样式的网络系统,如web应用程序。

Ajax json交互

交互有两个方向:

  • 前端 -> 后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使用注解@RequestBody。
  • 后台 -> 前端:后台直接返回pojo对象,前端接收为json对象或者字符串,使用注解@ResponseBody。

Spring MVC高级技术

Inteceptor使用

处理multipart形式的数据

在控制器中处理异常

基于Flash属性的跨重定向请求数据传递