锁定老帖子 主题:SPRING MVC的实现机制
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-20
最后修改:2011-12-21
DispatcherServlet:前端控制器,也是整个架构的核心,负责处理和分发请求。
在配置文件中我们看到了ViewResolver,HandlerAdapter,HandlerMapping的配置信息, 如果不看源码会有如下疑问:这些元素之间的调用关系为啥没在配置文件中体现出来; 我们看看DispatcherServlet的源码:
这段代码对应的活动图如下:(一共包含四个活动)
现在来具体看看这四个方法的具体实现: 1. getHandler 其实就是取 Controller的实现类,(对应的是STRUTS中的*Action); 这里的handlerMappings 就是我们在SPRING 配置文件中配置的 handlerMapping实现类的集合; 这个方法中采用循环的方式去解析客户的URL请求; protected Object getHandler(HttpServletRequest request) throws Exception {
2.getHandlerAdapter 方法类似的;handlerAdapters是配置在spring 配置文件中的handlerAdapter实现类的集合;也是一样的采用循环的方式去判断 handlerAdapter的实现类是否可以处理Controller的实现类,如何可以处理就返回该handlerAdapter的实现类;
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
3.ModelAndView mv = ha.handle(request, response, handler); 这一步由HandlerAdapter 的实现类 来执行handle(request, response, handler)方法; 我们来看一个具体的HandlerAdapter 的实现类HttpRequestHandlerAdapter ,他的handle方法:
注意到这个 handler的数据类型是Object ,通常写代码时我们都是继承Controller; 那么这个方法其实是调用Controller的实现类来处理request, response;
总结:第一个函数handlerMapping解析URL请求,指向具体的Controller实现类
第2,3函数,SPRING 调用具体的Controller实现类来执行用户请求;
为啥会有第二步? 因为不同的Controller实现类差异很大,这个时候SPRING框架采用Adapter适配器的模式,来屏蔽Controller实现类的差异;如何做的?
1.首先判断适配器是否可以处理该Controller 见supports(Object handler),
2.然后执行handle(HttpServletRequest , HttpServletResponse , Object ) ; 在该方法中进行强制类型转化成Controller实现类,然后执行该Controller实现类的handleRequest;
(为啥会有supports(Object handler)方法? 因为在第2步中会进行强制类型转化,如果没有第一步的判断,第二步就会报错!!)
@Override
4 . 第四步render(ModelAndView , HttpServletRequest , HttpServletResponse ) 又是循环查找ViewResolver 的实现类来处理
分析了这4个步骤后,我们会发现除了第3步,其他几步都是循环查找合适的ViewResolver,HandlerAdapter,HandlerMapping的实现类 ;而第三步其实是调用Controller实现类来处理请求;
讲的比较粗略。ViewResolver,HandlerAdapter,HandlerMapping的实现类可以直接翻看源码!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-12-21
最后修改:2011-12-21
发贴要有点含量,还有点让大家探讨的欲望,不然真水了
按照这个逻辑,一天发10个实现机制都可以 |
|
返回顶楼 | |
发表时间:2011-12-21
昨天网络不行,今天补充。呵呵
|
|
返回顶楼 | |
发表时间:2011-12-24
直接上源代码
|
|
返回顶楼 | |
发表时间:2011-12-24
DispatcherServlet 直接看JAR包中的这个类;贴源代码,要贴几页。看着烦
|
|
返回顶楼 | |
发表时间:2012-03-08
感觉还不错啊,条理挺清晰的
|
|
返回顶楼 | |
浏览 6209 次