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越小,优先级越高。

  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/dreamworlds/p/5396112.html
Copyright © 2011-2022 走看看