springMVC流程
1.客户端向服务器发送http请求,web服务器对http请求进行解析,得到一个url,如果匹配上了前端控制器DispatcherServlet的映射路径,就将请求交给前端控制器处理。
2.前端控制器调用相应的方法的到处理器映射器HandlerMapping对象,根据接收到的请求来获得Handler对象以及它对应的拦截器。这里只是获得了Handler对象,并不会操作它,在springMVC中,是通过处理器适配器HandlerAdapter对Handler进行调用,控制的。
3.前端控制器根据处理器映射器返回的Handler对象,选择一个合适的HandlerAdapter,创建其对象实例,,如果有拦截器,执行拦截器中的preHandle()方法。
4.处理器适配器将Handler执行完返回的一个ModelAndView对象返回给前端控制器。
5.这时这个ModelAndView对象还只是一个逻辑视图,并不是真正的物理视图,需要前端控制器将这个ModelAndView对象交给视图解析器ViewResolver,将逻辑视图转化成真正的物理视图,可以理解为是将视图路径补全,将ModelAndView对象加上视图解析器中配置的前缀和后缀,指向真正的物理视图。
6.前端控制器通过Model将ModelAndView对象中的数据进行解析,对view进行渲染,将最终的结果通过http响应给客户端。
前端控制器:WEB应用系统前端的一个入口控制器,所有的request请求都被发往该控制器统一处理,处理所有请求。前端控制器在WEB-INF下的web.xml中配置效果
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Archetype Created Web Application</display-name> <!-- 配置前端控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
此时,因为前端控制器的拦截路径已经设置为 / ,所以还需要在SpringMVC的配置文件中添加对静态资源访问的配置,<mvc:default-servlet-handler/>
原因是因为Tomcat中处理静态资源访问的servlet(default)的映射路径为/. 在启动项目的时候,在Tomcat中的web.xml是先加载的,项目的web.xml是后加载的,如果配置了相同的映射路径,后面的会覆盖前者. 也就是说,SpringMVC中的DispatcherServlet的映射路径覆盖了Tomcat默认对静态资源的处理的路径。 如果SpringMVC要配置为/,那么就得设置Dispatcherservlet对静态资源进行支持。
<mvc:default-servlet-handler/> 配置的作用是在 SpringMVC 上下文中定义一个DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 Tomcat默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。