springMVC流程

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 继续处理。

posted @ 2019-10-05 12:52  二十六键  阅读(181)  评论(0)    收藏  举报