一、Spring MVC 介绍
Spring MVC 属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring 的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2(一般老项目使用)等。
Spring web mvc 和 Struts2 都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图:

二、Spring MVC 架构
-
框架结构:一个中心、三个基本点(一个前端控制器、三大组件)
绿色部分由开发人员开发,红色部分框架已写好。
-
架构流程(重点)
1)、用户发送请求到前端控制器DispatcherServlet
;
2)、DispatcherServlet
收到请求后调用处理器映射器HandlerMapping
查询对应的处理器Handler
;
3)、处理器映射器根据请求url找到具体的处理器,生成处理器对象和处理器拦截器(如果有则生成)一并返回给前端控制器;
4)、前端控制器通过处理器适配器HandlerAdapter
调用具体的处理器;
5)、执行处理器 (Controller,也叫后端控制器);
6)、处理器执行完后返回ModelAndView
;
7)、前端控制器将ModelAndView
传给视图解析器请求解析视图;
8)、视图解析器解析完后返回view
对象给前端控制器;
9)、前端控制器对view
进行渲染视图(即将模型数据填充到视图中);
10)、前端控制器响应用户。
-
组件说明
以下组件通常使用框架提供实现
1)、DispatcherServlet
:前端控制器(核心)
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet
是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet
的存在降低了组件之间的耦合性。
2)、HandlerMapping
:处理器映射器
HandlerMapping
负责根据用户请求url找到Handler
即处理器,spring mvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3)、HandlerAdapter
:处理器适配器
通过HandlerAdapter
对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
下图是许多不同的适配器,最终都可以使用usb接口连接
4)、Handler
:处理器
Handler
是继DispatcherServlet
前端控制器的后端控制器,在DispatcherServlet
的控制下Handler
对具体的用户请求进行处理。由于Handler
涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler
。
5)、ViewResolver
:视图解析器
View Resolver
负责将处理结果生成View
视图,View Resolver
首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View
视图对象,最后对View
进行渲染将处理结果通过页面展示给用户。
6)、View
:视图
springmvc框架提供了很多的View
视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
-
默认加载的组件
我们没有做任何配置,就可以使用这些组件
因为框架已经默认加载这些组件了,配置文件位置如下图:
-
组件扫描器(重点)
使用组件扫描器省去在spring容器配置每个Controller类的繁琐。
使用<context:component-scan>
自动扫描标记@Controller
的控制器类,在springmvc.xml
配置文件中配置如下:
<!-- 配置controller扫描包,多个包之间用,分隔 -->
<context:component-scan base-package="cn.itcast.springmvc.controller" />
-
注解处理器映射器和处理器适配器
1)、配置处理器映射器
注解式处理器映射器,对类中标记了@ResquestMapping
的方法进行映射。根据@ResquestMapping
定义的url匹配@ResquestMapping
标记的方法,匹配成功返回HandlerMethod
对象给前端控制器。(HandlerMethod
对象中封装了url对应的方法Method)
从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping
的使用,推荐使用RequestMappingHandlerMapping
完成注解式处理器映射。
在springmvc.xml
配置文件中配置如下:
<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
2)、配置处理器适配器
注解式处理器适配器,对标记@ResquestMapping
的方法进行适配。
从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter
的使用,推荐使用RequestMappingHandlerAdapter
完成注解式处理器适配。
在springmvc.xml
配置文件中配置如下:
<!-- 配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
3)、注解驱动(代替上面两个步骤)(重点)
直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。
SpringMVC使用<mvc:annotation-driven>
自动加载RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
可以在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
<!-- 注解驱动 -->
<mvc:annotation-driven />
-
视图解析器(重点)
视图解析器使用SpringMVC框架默认的InternalResourceViewResolver
,这个视图解析器支持JSP视图解析
在springmvc.xml
配置文件中配置如下:
<!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" ->
"/WEB-INF/jsp/test.jsp" -->
<!-- 配置视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置逻辑视图的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 配置逻辑视图的后缀 -->
<property name="suffix" value=".jsp" />
</bean>
逻辑视图名需要在controller中返回ModelAndView
指定,比如逻辑视图名为ItemList,则最终返回的jsp视图地址:"WEB-INF/jsp/itemList.jsp"
最终 jsp 物理地址:前缀+逻辑视图名+后缀
网友评论