springMVC的执行流程如图所示:
解析(对应上图):①客户端的所有请求都交给前端控制器DispatcherServlrt来处理,他会负责调用系统的其他模块来真正处理用户请求
②DispatcherServlet收到请求后,根据请求信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找到该请求的Handler(任何一个对象都可以作为请求的Handler)。
③如果匹配成功(找到对应的Handler)会返回这个Handler的处理链HandlerExecutionChain对象,在getHandler得到的HandlerExecutionChain对象里还包含了interceptor(拦截器)。
④-⑦:Spring会通过HandlerAdapter对该处理器进行封装。HandlerAdapter是一个适配器,它使用统一接口对Handler中的各种方法进行调用。Handler完成对用户的请求后,会返回一个ModelAndVIew对象给DispatcherServlet,ModelAndView顾名思义,包含了数据模型和相应的视图信息。
⑧-⑨:ModelAndView的视图的作用是逻辑视图,DispatcherServlet还要借助ViewResolver(视图解析器)完成从逻辑视图到真实视图的解析工作。
⑩之后:当得到真正的响应视图对象后,DispatcherServlet会利用视图对象对模型进行渲染。客户端得到响应,可能是一个普通的HTNML页面,也可能是XML或者JSON字符串,还可以是一张图片或者一个PDF文件。
注意
上面的图是springMVC的底层实现的流程,而通常情况下我们在编程中能接触到的过程如下:(springMVC封装了大量细节)
使用SpringMVC的程序必须在服务器启动时就加载org.springframework.web.servlet.DispatcherServl
(通过配置web.xml实现)
并且可以配置加载org.springframework.web.context.ContextLoaderListener
让spring容器完全接管网页的Bean(这步一并非必要,但大家都这么做参见ContextLoaderListener介绍)
常见的一个web.xml长这样
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring-mvc*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>