zoukankan      html  css  js  c++  java
  • Spring MVC请求处理流程

    从web.xml中 servlet的配置开始, 根据servlet拦截的url-parttern,来进行请求转发
     
    Spring MVC工作流程图
     
    图一
     
    图二 
     
    Spring工作流程描述
          1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
          2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
          3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
           4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
          HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
          数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
          数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
          数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
          5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
          6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
          7. ViewResolver 结合Model和View,来渲染视图
          8. 将渲染结果返回给客户端。
     
    Spring工作流程描述
        为什么Spring只使用一个Servlet(DispatcherServlet)来处理所有请求?
         详细见J2EE设计模式-前端控制模式
        Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler?
        符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。
     


     
    1. 当DispatcherServlet接到请求时,他先回查找适当的处理程序来处理请求。DispatcherServlet通过一个或者多个处理程序映射,将每个请求映射到处理程序中。处理程序映射配置在web应用程序的上下文中,是实现了HandlerMapping接口的Bean。它负责为请求返回一个适当的处理程序(也就是Controller)。处理程序映射通常根据请求的URL将请求映射到处理程序(Controller)。 
    2. 一旦DispatcherServlet选择了适当的控制器,它就会调用这个控制器来处理请求。 
    3. 控制器处理完请求后,会将模型和视图名(有时候是视图对象)返回给DispatcherServlet。模型包含了控制器要传递给视图进行显示的属性。如果返回的是视图名称,它会被解析成视图对象再进行呈现。绑定模型和视图的基本类是ModelAndView 
    4. 当DispatcherServlet接收到模型和视图名称时,它会将逻辑视图名称解析成视图对象再进行呈现。DispatcherServlet从一个或者多个视图解析器中解析视图。视图解析器配置在Web应用程序上下文中,是实现了ViewResolver接口的Bean。它的任务是根据逻辑视图名称返回试图对象。 
    5. 一旦DispatcherServlet将视图名称解析称为试图对象,它就会呈现视图对象,并传递控制器返回的模型。视图的任务是将模型属性展示给用户。 

    DispatcherServlet接到请求后如何映射到Controller呢? 
    在Spring MVC中,Web请求被Web应用程序上下文中声明的一个或者多个处理程序映射Bean(是吸纳了HandlerMapping接口的Bean)映射到Controller。Spring MVC提供了几种HandlerMapping实现: 
    1. BeanNameUrlHandlerMapping(默认情况),他根据Controller Bean名称中指定的URL模式将请求映射到处理程序上。 
    eg. <bean name="/welcome.htm" class="com.kevin.controller.WelcomeController">...</bean> 
    当你访问http://******/welcome.htm这个URL时,DispatcherServlet通过BeanNameUrlHandlerMapping映射就找到了WelcomeController。 
    2. ControllerClassNameHandlerMapping,它是按控制器类名称映射请求。 
    3. SimpleUrlHandlerMapping,用定制的映射定义来映射请求。 


    下面我们就来看一下Controller。 
     

    Controller接口是Spring MVC中所有控制器类的基本接口。通过实现这个接口,你可以创建自己的控制器。在handleRequest()方法中,可以随意地处理Web请求。 

    AbstractController:如果你想让控制器具备一些基本的特性,如过滤受支持的HTTP方法(GET,POST和HEAD),以及在HTTP响应中生成cache-control头部等,你可以让它扩展AbstractController类。 

    ParameterizableViewController:用来创建带有参数化视图的控制器。 

    SimpleFormController:它支持命令对象的概念(commandName),并且可以将表单域的值绑定到命令对象的同名属性上。 

    AbstractWizardFormController:为向导表单的处理定义了基本的任务。向导表单有多个单页,因此必须为向导表单控制器定义多个页面视图。然后这个控制器可以跨越所有这些表单页面来管理表单状态。向导表单会有多个动作,不像SimpleFormController只有单个提交动作。AbstractWizardFormController会根据特殊的请求参数决定用户的动作,通常是用提交按钮的名称来指定动作的。 
    _finished: 完成向导表单。 
    _cancel: 取消向导表单。 
    _targetx: 进入目标页面,这里的x是从0开始的页面索引。 

    MultiActionController:允许你将多个相关的动作分组到一个控制器中。 

    常见的视图类型: 
     

    几种常见的ViewResolver的解析: 
    1. InternalResourceViewResolver: 根据URL解析视图。通过添加前缀和后缀的方法,将每个视图名称都映射到一个URL上。 
    2. XmlViewResolver: 从XML配置文件中解析视图。将视图声明成Spring的Bean,并按他们的Bean Name进行解析。 
    3. ResourceBundleViewResolver: 从ResourceBundle中解析视图。 
    4. 用多个视图解析器解析视图, 需要注意的是,您需要为你配置的视图解析器配置解析的优先级。<property name="order" value="0"/> value越小,优先级越高。

  • 相关阅读:
    祝好,又十年
    关于简书的吐槽与思考还有杂七杂八负面情绪宣泄
    康威生命游戏———孤独会致命,拥挤也一样(转载)
    Bran的内核开发教程(bkerndev)-07 中断描述符表(IDT)
    Ubuntu安装QQ
    Bran的内核开发教程(bkerndev)-06 全局描述符表(GDT)
    Ubuntu安装scrcpy手机投屏和控制(Ubuntu用QQ微信的另一种方法)
    C、C++的Makefile模板
    C语言打印当前所在函数名、文件名、行号
    Bran的内核开发教程(bkerndev)-05 打印到屏幕
  • 原文地址:https://www.cnblogs.com/dreamworlds/p/5396112.html
Copyright © 2011-2022 走看看