Spring DispatcherServlet 工作机制

来源:互联网 发布:怎么找网络水军 编辑:程序博客网 时间:2024/05/01 16:10

DispatcherServlet的主要工作就是将一个request分发到一个合适的处理器上,并将处理返回的ModelAndView绘制出来返回给客户端

一、init()方法初始化。

initFrameworkServet方法对根据名字我们很方面的看到对各个Spring MVC主要元素的初始化  

1.  initMultipartResolver();  //文件上传解释器

2.  initLocaleResolver();  //本地化信息解析器

3.  initThemeResolver();  //主题解析器处理器映射

4.  initHandlerMappings();  

5.  initHandlerAdapters();  

6.  initHandlerExceptionResolvers();  

7.  initRequestToViewNameTranslator();  

8.  initViewResolvers();  

 

二、doService()处理请求DispatcherServlet中无论是通过post方式还是get方式提交的request,最终都会交由doService()处理

1、 如果requestMultiPart,即文件上传的请求则将request解析并包装成MultipartHttpServletRequest

2、  mappedHandler = getHandler(request)根据request得到相应的处理器

3、  调用注册的所有拦截器的preHandle方法

4、  调用处理器    HandlerAdapter ha = newgetHandlerAdapter(mappedHandler.getHandler()); ModelAndView mv = ha.handle(req, res,mappedHandler.getHandler())//这里使用了adapter模式

5、  调用注册的所有拦截器的postHandle方法

6、  绘制mv

三、原理描述:

1、 DispatcherServlet把定义了的所有HandlerMapping都加载了放在一个List里待以后进行使用,这个链的每一个元素都是一个handlerMapping的配置,而一般每一个handlerMapping可以持有一系列从URL请求到Spring Controller的映射,比如SimpleUrl HandlerMaaping中就定义了一个map来持有这一系列的映射关系。 
DisptcherServlet通过HandlerMapping使得Web应用程序确定一个执行路径,就像我们在HanderMapping中看到的那样。

2、 而这些Handler和Interceptor需要我们定义HandlerMapping的时候配置好,比如对具体的 SimpleURLHandlerMapping,他要做的就是根据URL映射的方式注册Handler和Interceptor,自己维护一个放映映射的handlerMap,当需要匹配Http请求的时候需要使用这个表里的信息来得到执行链。这个注册的过程在IOC容器初始化SimpleUrlHandlerMapping的时候就被完成了,这样以后的解析才可以用到map里的映射信息,这里的信息和bean文件的信息是等价的。

3、 handlerMap是持有的一个HashMap,里面就保存了具体的映射信息: 而SimpleUrlHandlerMapping对接口HandlerMapping的实现是这样的,这个getHandler根据在初始化的时候就得到的映射表来生成DispatcherServlet需要的执行链

4、 mv = ha.handle(processedRequest, response,mappedHandler.getHandler());  这个就是对handle的具体调用!相当于Command模式里的Command.execute();理所当然的返回一个ModelAndView。

5、 这样就和我们前面的分析一致起来了:DispatcherServlet在解析视图名的时候就根据要求生成了视图对象,包括在InternalResourceView中需要使用的url和其他各种和HTTPresponse相关的属性都会写保持在生成的视图对象中,然后就直接调用视图对象的render来完成数据的展示。 
这就是整个Spring WebMVC框架的大致流程,整个MVC流程由DispatcherServlet来控制。MVC的关键过程包括: 
配置到handler的映射关系和怎样根据请求参数得到对应的handler,在Spring中,这是由handlerMapping通过执行链来完成的,而具体的映射关系我们在bean定义文件中定义并在HandlerMapping载入上下文的时候就被配置好了。然后 DispatcherServlet调用HandlerMapping来得到对应的执行链,最后通过视图来展现模型数据,但我们要注意的是视图对象是在解析视图名的时候生成配置好的。这些作为核心类的HanderMapping,ViewResolver,View,Handler的紧密协作实现了MVC的功能。

0 0
原创粉丝点击