SpringMVC之一:SpringMVC原理

 

Spring MVC工作流程图
 
图一

 

 
图二 

 

关键组件:

DispatcherServlet:前端控制器,与大多数基于Java的Web框架一样, Spring MVC所有的请求都会通过一个前端控制器(front controller)Servlet。前端控制器是常用 的Web应用程序模式,在这里一个单实例的Servlet将请求委托给应用程序的其他组件来执行 实际的处理。DispatcherServlet的任务是将请求发送给Spring MVC控制器(controller)。主要工作内容:
  1、查询处理器映射(handler mapping) 来确定请求的下一站在哪里(在典型的应用程序中可能会有多个控制器,DispatcherServlet需要知道应该将请求发送给哪个控制器。所以DispatcherServlet以会查询一个或多个处理器映射(handler mapping) 来确定请求的下一站在哪里。处理器映射会根据请求所携带的URL信息来进行决策。),将请求丢给controller。
  2、将controller返回的逻辑视图使用视图解析器(view resolver) 来解析匹配为一个特定的视图实现。
  3、将根据特定的视图的实现(可能是JSP) ,在这里dispatcherServlet交付模型数据,由该视图实现来渲染出的结果返回给客户端。
 controller:控制器是一个用于处理请求的Spring组件,主要工作是:
  1、将业务逻辑委托给一个或多个服务对象进行处理,接收服务对象的返回模型数据。
  2、将模型数据打包,并且标示出用于渲染输出的视图名。它接下来会将请求连同模型和视图名发送回DispatcherServlet 。
处理器映射(handler mapping) :配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),供DispatcherServlet调用查询,并以HandlerExecutionChain对象的形式返回。
ModelAndView:控制器在完成逻辑处理后,通常会产生一些信息,这些信息需要返回给用户并在浏览器上显 示。这些信息被称为模型(model)。不过仅仅给用户返回原始的信息是不够的——这些信息需 要以用户友好的方式进行格式化,一般会是HTML。所以,信息需要发送给一个视图(view), 通常会是JSP。
视图解析器(view resolver):将逻辑视图名匹配为一个特定的视图实现,它可能是也可能不是JSP。
Spring工作流程描述
      1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
      2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。 DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
      3.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
      HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
      数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
      4.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
      5.  根据返回的ModelAndView,DispatcherServlet 调用视图解析器(view resolver),视图解析器会选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;
      7. ViewResolver 结合Model和View,来渲染视图
      8. 将渲染结果返回给客户端。
 
posted on 2014-06-17 08:58  duanxz  阅读(1780)  评论(0编辑  收藏  举报