(三)Spring MVC与Web环境-Spring MVC的设计与实现

1.Spring MVC设计

在Spring MVC的使用中,我们在web.xml配置了一个DispatcherServlet,这个DispatcherServlet实现的是Sun的J2EE核心模式中的前端控制器模式,作为一个前端控制器,所有的Web请求都需要通过它来处理,进行转发、匹配、数据处理后,并转由页面进行展现。

其继承体系如下图:

                                                                  

DispatcherServlet会建立自己的上下文来持有SpringMVC的Bean对象,在建立这个自己持有的IoC容器时,会从ServletContext中得到根上下文作为DispatcherServlet持有上下文的双亲上下文。有了这个上下文,在对自己持有的上下文进行初始化,最后把自己持有的这个上下文保存到ServletContext中,供以后检索和使用。

2.DispatcherServlet的工作过程


一个是初始化部分,由initServletBean启动,通过initWebApplicationContext方法最终调用DispatcherServlet的initStrategies方法,在这个方法中,DispatcherServlet对MVC模块的其他部分进行了初始化,比如handlerMapping、ViewResolver等;另一个是对HTTP请求进行响应,作为一个servlet,web容器会调用Servlet的doGet和doPost方法,再经过FrameworkServelt的processRequest简单处理后,会调用DispatcherServlet的doService方法,在这个方法调用中封装了doDispatch。

3.MVC处理HTTP分发请求

Spring MVC提供了一系列的HandlerMapping实现,一般每一个handlerMapping可以持有一系列从URL请求到Controller的映射。在初始化完成时,在上下文环境中已定义的所有HandlerMapping都已经加载了,这些加载的handlerMapping被放在一个List中并被排序,存储着HTTP请求对应的映射数据。以SimpleUrlHandlerMapping为例,定义了一个map来持有一系列的映射关系。通过这些在HandlerMapping中定义的映射关系,即这些URL请求和控制器的对应关系,使Spring MVC应用可以根据HTTP请求确定一个对应的Controller。


在MVC框架初始化完成以后,对HTTP请求的处理是在doService()方法完成的。在doService()方法中调用doDispatcher()方法完成对请求的分发。包括准备ModelAndView,调用getHandler来响应HTTP请求,调用preHandle()来在执行请求前做一些前置处理,然后通过执行Handler的处理来得到返回的ModelAndView结果,调用postHandle()来在执行请求后做一些后置处理,最后把这个ModelAndView对象交给相应的视图对象去呈现。


猜你喜欢

转载自blog.csdn.net/qq_22866497/article/details/80534437