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的开发。
- 接收请求。
- 返回响应,跳转页面。
与原生servlet不同,在Spring MVC中,全局只有一个servlet,接收所有请求。
实践:
- 配置DispatcherServlet前端控制器;
- 开发处理具体业务逻辑的Handler(@Controller、@RequestMapping);
- xml配置文件中,配置controller扫描和spring mvc三大件;
- 将xml文件路径告诉springmvc(DispatcherServlet)。
Spring MVC请求处理流程

- 用户请求发送至前端控制器DispatcherServlet;
- DispatcherServlet收到请求后,调用处理器映射器HandlerMapping;
- HandlerMapping根据请求Url找到具体的后端控制器Handler,生成处理器对象及处理器拦截器,返回给DispatcherServlet;
- DispatcherServlet调用处理器适配器HandlerAdapter去调用Handler;
- 执行Handler;
- Handler执行完成后给HandlerAdapter返回ModelAndView;
- HandlerAdapter向DispatcherServlet返回ModelAndView;
- DispatcherServlet请求视图解析器ViewResolver去进行视图解析,根据逻辑视图名来解析真正的视图;
- ViewResolver向DispatcherServlet返回View对象;
- DispatcherServlet进行视图渲染,即将ModelAndView对象中的模型数据填充到request域中;
- DispatcherServlet向用户响应结果。
Spring MVC九大组件
HandlerMappinig 处理器映射器
处理器Handler的具体表现形式可以是类,也可以是方法,如标注了@RequestMapping的方法可以看作是一个Handler。
HandlerMapping的作用就是找到请求相应的处理器Handler和Interceptor。
HandlerAdapter 处理器适配器
Spring MVC中的Handler是任意形式,而把请求交给Servlet的时候,方法结构是doService(HttpServletRequest req, HttpServletResponse resp)形式,HandlerAdapter的职责就是让固定的Servlet处理方法调用Handler来进行处理。
HandlerExceptionResolver 处理器异常解析器
用于处理Handler产生的异常情况,根据异常设置ModelAndView,之后交给渲染方法进行渲染,渲染方法会将ModleAndView渲染成页面。
ViewResolver 视图解析器
用于将String类型的视图名和Locale解析为View类型的视图。
会将程序返回的参数和数据填入模板中,生成html文件。
- 找到渲染所用的模板
- 找到渲染所用的技术,即找到视图的类型,如JSP。
默认情况下,Spring MVC会自动配置一个InternalResourceViewResolver,针对JSP类型视图。
RequestToViewNameTranslator 请求到视图名转换器
从请求中找到ViewName。
LocaleResolver 用户区域解析器
用于从请求中解析出Locale,如中国的Locale是zh-CN。
这个组件也是i18n的基础。(i18n:internationalization)
ThemeResolver 主题解析器
用来解析主题。
主题是样式、图片及它们所形成的显示效果的集合。
Spring MVC中一套主题对应一个properties文件,里面存放着与当前主题相关的所有资源,如图片、CSS样式等。
创建主题:准备好资源,新建一个“主题名.properties”文件并将资源设置进去,放在classpath下,就可以在页面中使用了。
Spring MVC中与主题相关的类有ThemeResolver、ThemeSource和Theme。
- ThemeResolver负责从请求中解析出主题名。
- ThemeSource根据主题名找到具体的主题。
- Theme用来获取主题和具体的资源,是具体的主题的抽象。

MultipartResolver 多部分解析器
MultipartHttpServletRequest可以通过getFile()方法直接获得文件。
如果上传多个文件,可以调用getFileMap()方法得到Map
MultipartResolver将普通的请求包装成MultipartHttpServletRequest,使其拥有文件上传的功能。
FlashMapManager FlashMap管理器
FlashMap用于重定向时的参数传递。
重定向时没有传递参数这一功能,如果不想把参数写进Url,就可以通过FlashMap来传递。
在重定向之前,将要传递的数据写入请求(可以通过ServletRequestAttributes.getRequest()方法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE中,在重定向之后的Handler中,Spring就会自动将其设置到Model中。
FlashMapManager管理FlashMap。
Spring MVC如何接收请求参数
原生Servlet接收一个整型参数:
String ageStr = request.getParameter("age");Integer age = Integer.parseInt(ageStr);
Spring MVC框架封装Servlet,简化了很多操作:
@RequestMapping("xxx")public Strinig handle(Integer age) {System.out.println(age);}
参数绑定:取出参数值,绑定到handler方法的形参上。
默认支持Servlet API作为方法参数
绑定简单类型参数
八种基本数据类型及其包装类型。
绑定pojo类型参数
绑定pojo包装对象参数
绑定日期类型参数(需要配置自定义类型转换器)
RESTful风格请求支持
REST:Representational State Transfer。
REST描述了一个架构样式的网络系统,如web应用程序。
Ajax json交互
交互有两个方向:
- 前端 -> 后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使用注解@RequestBody。
- 后台 -> 前端:后台直接返回pojo对象,前端接收为json对象或者字符串,使用注解@ResponseBody。
