DispatchServlet请求处理源码分析

来源:互联网 发布:手机网络斗牛作弊器 编辑:程序博客网 时间:2024/06/05 18:51

 1、Spring MVC框架核心控制器DispatchServlet拦截到请求后,调用doService进行请求处理:

a) 设置spring mvc框架中的相关对象到Request作用域中:

b) 调用doDispath()方法进行请求处理:

 

2、DispatchServlet对象doDispatch()进行请求处理:

a) 检查请求信息,如是否是文件上传请求等;

b) 调动getHandle()方法,遍历Spring Dispatch上下中注册的HandlerMapping对象,使用HandlerMapping处理器映射器根据url找到处理请求的Controller和处理方法。找到后就停止遍历,最终会返回一个HandlerExecutionChain对象。其中包括处理请求的Controller,处理方法,还有添加在该url上的拦截器(包括spring mvc默认添加的拦截器)

 


 

注意:

默认添加的拦截器有:

ConversionServiceExposingInterceptor:每次请求处理前添加Conversion Service对象到Request作用域里面。

ResourceUrlProviderExposingInterceptor:每次请求处理前添加Resource UrlProvider对象到Request作用域里面。

 

启用spring mvc功能,如<mvc:annotaion-drivern/>或者@EnableWebMvcspring会自动注册一些HandlerMapping对象,也可以手动配置。不同的handlerMapping实现,根据url映射到Controller的处理方法上的映射规则不一样,如:

BeanNameUrlHandlerMapping:根据urlBeanname进行映射找到处理器对象ControllerBeanname属性定义是已“/"开头,

RequestMappingHandlerMappingspring3.1后使用,也是根据注解@Controller@RequestMappingurl进行映射匹配对象的处理器Controller和处理方法。

c) 调用getHandlerAdapter()方法;遍历Spring Dispatch容器中的HandlerAdapter对象,查看每个HandlerAdapter对象能否支持上面找到controller(实际上并非Controller类型,是HandlerMapping对象返回的,不同的HandlerMapping返回的类型不一样)

 

 

 

Spring MVC定了不同的HandlerAdapter对象,能够适配不同Controller实现对象,如:

SimpleControllerHandlerAdapter:要求Controller控制器实现Controller接口,以及实现接口中的方法handleRequest()方法来处理请求,通常和处理映射器BeanNameUrlHandlerMapping或者SimpleUrlHandlerMapping联合使用。

RequestMappingHandlerAdapter:适配使用注解@Controller@RequestMapping标识的处理器,spring3.1后使用,替换了DefaultAnnotationHandlerAdapter,和RequestMappingHandler Mapping联合使用。

 

d) 请求预先处理,调用HandlerExecutionChain对象的applyPreHandle()预处理请求;遍历拦截该url的拦截器列表,执行preHandle()方法:

 

 

 

注意:拦截器列表中包括Spring MVC内置的拦截器。如:

ConversionServiceExposingInterceptorpreHandler()方法:

request.setAttribute(ConversionService.class.getName(), this.conversionService);

ResourceUrlProviderExposingInterceptorpreHandler()方法:

request.setAttribute(RESOURCE_URL_PROVIDER_ATTR, this.resourceUrlProvider);

e) 统一调用HandlerAdapterhandle()方法处理请求,并返回处理结果ModelAndView对象。

 


f) 解析返回的结果对象ModelAndView对象中的逻辑视图,没有则不解析

g) 请求后处理,调用HandlerExecutionChain对象的applyPOSTHandle()请求后处理;遍历拦截该url的拦截器列表,执行postHandle()方法:

h) 调用processDispatchResult()方法;处理请求处理结果,并返回相应数据。


 

1 0
原创粉丝点击