Spring MVC 生命周期

spring mvc 生命周期

  1. 用户发起请求到前端控制器(DispatcherServlet)
  2. 前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
  3. 找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
  4. 前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工
  • HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
  • 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
  • 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
  • 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
  1. 处理器适配器去执行Handler
  2. Handler执行完给处理器适配器返回ModelAndView
  3. 处理器适配器向前端控制器返回ModelAndView
    (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
  4. 前端控制器请求视图解析器(ViewResolver)去进行视图解析
    根据逻辑视图名解析成真正的视图(jsp)
  5. 视图解析器向前端控制器返回View
  6. 前端控制器对视图进行渲染
    视图渲染将模型数据(在ModelAndView对象中)填充到request域
  7. 前端控制器向用户响应结果

代码示例

  1. 在WEB-INF/web.xml中加入如下代码:
<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*:spring-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping>

上述的配置的就是前端控制器DispatcherServlet,在servlet-mapping配置了*.html,意味着所有以.html结尾的请求多会通过这个servlet。
当dispatcherServlet启动时,会默认在WEB-INF目录下查找一个[servlet-name]-servlet.xml 的配置文件,上面我们通过显示指定了这个文件的位置,即在类路径底下的spring-servlet.xml。 如果我们没有指定配置文件的名称,Spring会在web应用的WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml的配置文件,如dispatcher-servlet.xml。

  1. 在类路径底下添加spring-servlet.xml文件
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" > 
    <context:component-scan base-package="com.xyzla.blog.h5.controller" /> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
        <property name="prefix" value="/WEB-INF/jsp/" /> 
        <property name="suffix" value=".jsp" /> 
    </bean> 
</beans> 

上面这个文件,我们定义了一个 context标签,这样的标签定义了以后,当spring在启动时,会加载com.pango.spring.helloworld.controller这个包下及子包下的所有的组件(这是包的自动扫描机制,即spring会将标有@Controller @Component等类加载到spring容器管理中)。

后面配置了bean标签,ViewResolver是一个试图解析器,就是springMVC生命周期中的第五步,当我们从后端控制器中返回的视图时,前端控制器就根据这一段配置来返回一个具体的视图,如后端控制返回的是一个hello,根据上面的配置,最后前端控制器会组并成这样的一个址:/web-inf/jsp/hello.jsp,然后从/web-inf/jsp/这个目录下面查找一个hello.jsp返回客户端。

  1. 在包底下写一个HelloWorldController的类
@Controller 
public class HelloWorldController{ 
    @RequestMapping(value="/hello") 
    public String sayHello(ModelMap modelMap){ 
        modelMap.put("sayHello", "hello world"); 
        return "/hello";  
    } 
}

Controller即声明这个类是一个控制器,上面第二部分我们说明了,只要加了@Controller标示的,spring会通过自动扫描机制,将这个类纳入spring容器管理中。 @RequestMapping(value=”/hello”),这个定义的就是一个请求路径,只要符合/hello路径的都会交给这个控制器的sayhello方法来处理。最后我们返回/hello的视图给客户端。

总结

MVC模式,它其实是观察者模式(Observer)(Pub/Sub), 策略模式(Strategy)和组合模式(Composite)的一个整合


Spring MVC 生命周期中涉及到相关类有

  • DispatcherServlet
  • HandlerMapping
  • HandlerExecutionChain
  • HandlerAdapter
  • HandlerExceptionResolver
  • ViewResolver
  • View
  • ModelAndView

Spring MVC Request Lifecycle

Spring MVC 工作流程图

SpringMVC的生命周期

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22