Spring MVC 框架的请求处理流程及体系结构

1.Spring MVC框架的请求处理流程

Model1的基础是JSP,它由JSP 和JavaBean组成,JSP从HTTP Request
中获得所需的数据,并进行业务逻辑的处理,然后将结果通过HTTPResponse返回给前端浏览器。从
中可见,Model1在一定程度上实现了MVC.即JSP将控制层和视图层合二为一,JavaBean为模型层。
其中JSP身兼多职,既要负责视图层的数据展示,又要负责业务流程的控制,结构较为混乱,并且
也不是我们所希望的松耦合架构模式,所以当业务流程复杂的时候并不推荐使用。

相比Model1,Model2是将控制层(Servlet)单独划分出来负责业务流程的
控制,接收请求,创建所需的JavaBean实例,并将处理后的数据再返回给视图层(JSP) 进行界面数
据展示。这样的结构清晰,效果明显优化很多,并且也是一个松耦合的架构模式,所以除非项目非
常简单,一般情况下建议使用JSP Model2。

                                                                         图1.1

MVC设计模式处理过程

(1) 首先视图提供系统与用户交互的界面,并发送用户输入给控制器。
(2) 控制器接收用户的请求,并决定应该调用哪个模型来进行处理。
(3) 模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)。
(4) 控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据.并通过视图呈现给
用户结果。

                                                                                                图 1.2

Spring MVC框架也是一个基于 请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(处理器)来进行处理。下面我们就详细地分析Spring MvC请求处理的流程步骤。
(1) 首先用户发送请求到前端控制器(DispatcherServlet), 前端控制器根据请求信自(如URl)来决定选择哪个页面控制器(Contoller) 来进行处理,并把请求委托给它,即Serlvet控制器控制逻辑部分(步骤1、2)。
(2) 页面控制器接收到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名) (步骤3、4、 5)。
(3) 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的真正视图,并把模型数据传入以便将视图渲染展示(步骤 6、7)。

(4) 前端控制器再次收回控制权,将响应结果返回给用户,至此整个流程结束(步骤8)。

2. Spring MVC框架的体系结构

                                                                               图 2.1                      

根据上述的请求处理流程,再深入了下Sping MWC框架的整体架构,如图2.1 所示。

在Spring MVC的框架模型中,我们可以发现从接收请求到返回响应,Spring MVC框架的众多组
件通力配合、各司其职地完成整个流程工作。在整个框架中,Spring MVC通过一个前端控制器
(DispatcherServlet) 接收所有的请求,并将具体工作委托给其他组件进行处理,DisatcerServlet 处于
核心地位,它负责协调组织不同组件完成请求处理并返回响应。根据Spring MVC处理请求的流程,
我们来分析下具体每个组件所负责的工作内容。
(1) 客户端发出HTTP请求,Web应用服务器接收此请求。若匹配DispatcherSrvlet的请求映射
路径(在web. xml中指定),则Web容器将该请求转交给DispatcherServlet处理。
(2)  DispatcherServlet接收到该请求后,将根据请求的信息(包括URL、请求参数、HTTP方法等)及HandlerMapping的配置(在<servletName>- servlet.xml中配置)找到处理请求的处理器
(Handler)。
(3) 当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler之后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler来干活的人,HandlerAdapter接口里一共有三个方法,如图2.2所示。

  • supports(Object handler )方法:判断是否可以使用某个Handler。
  • handle()方法:具体使用Handler干活。
  • getLastModified()方法:获取资源的Last—Modified。

注意   

Spring MVC中没有定义Handlr按口, 也没有对处理器做任何限制,
处理器可以任意合理的方式来表现。
换句话说,任何一个Object(如JavaBean、方法等)
都可以成为请求处理器(Handler),从HandlerAdapter的handle方法及可看出,
它是Object类型,这种模式给开发者提供了极大的自由度。

需要注意:文章描述中的请求处理器、前端控制器以及图中的Handler,我们都可以理解为Cortoller。

(4) 在请求信息到达真正调用Handler的处理方法之前的这段时间内,SpringMVC 还完成了很多工作,它会将请求信息以一定的方式转换并绑定到请求方法的入参中,对于入参的对象会进行数据
转换、数据格式化以及数据校验等。这些都做完之后,最后才真正地调用Handler的处理方法进行相应的业务逻辑处理。
(5)  处理器完成业务逻辑处理之后将返回一个ModelAndView 对象给DspatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息。
(6)  ModelAndView对象中包含的是” 逻辑视图名”,而非真正的视图对象。DispatcherServlet 会
通过ViewResolver将逻辑视图名解析为真正的视图对象View.当然,负责数据展示的视图可以为JSP.
XML、 PDF、JSON等多种数据格式,对此Spring MVC均可灵活配置。
(7) 当得到真实的视图对象View后. DipacherServlet会使用ModelAndview对象中的模型数据对View进行视图渲染。
(8)  最终客户端获得响应消息,根据配置,可以是普通的HTML页面,也可以是一个 XML或者JSON格式的数据等。
通过以上关于Spring MVC的请求处理流程以及它的框架模型的分析.我们不仅简单了解了Spring MVC 整体架构,还可以初步体会其设计的精妙之处。在后续的章节中,会围绕着它的整个体系结构
进行深入讲解,包括各个组件的分析、实际开发的运用经验总结等。


学习方法

由于Spring MVC结构比较复杂,故学习的时候也要掌握学习方法,
首先要明确Spring MVC是一个工具。既然是工具,那么我们就需要先掌握工具的使用方法,
不要陷入细节中,深入浅出,慢慢地通过实际运用来加深共的理解。 
学习过程中多跟踪代码,查看Spring MVC的源码才能对其有更深刻的理解。
发布了18 篇原创文章 · 获赞 2 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/csdn_life18/article/details/105209601