快速业务通道

Spring源代码解析(四):Spring MVC - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
andler.getHandler())) {              triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);              return;            }            interceptorIndex = i;          }        }        //在执行handler之前,用HandlerAdapter先检查一下handler的合法性 :是不是按Spring的要求编写的。        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler ());        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());        // 这里取出执行链中的Interceptor进行后处理        if (mappedHandler.getInterceptors() != null) {          for (int i = mappedHandler.getInterceptors().length - 1; i >= 0; i--) {            HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i];            interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);          }        }      }      ........      // Did the handler return a view to render?      //这里对视图生成进行处理      if (mv != null && !mv.wasCleared()) {        render(mv, processedRequest, response);      }      ....... }

Spring源代码解析(四):Spring MVC(6)

时间:2011-03-29 javaeye jiwenke

我们很清楚的看到和MVC框架紧密相关的代码,比如如何得到和http请求相对应的执行 链,怎样执行执行链和怎样把模型数据展现到视图中去。

先看怎样取得Command对象,对我们来说就是Handler - 下面是getHandler的代码:

代码

protected HandlerExecutionChain getHandler(HttpServletRequest request, boolean cache) throws Exception {   //在ServletContext取得执行链 - 实际上第一次得到它的时候,我们把它放在 ServletContext进行了缓存。   HandlerExecutionChain handler =        (HandlerExecutionChain) request.getAttribute (HANDLER_EXECUTION_CHAIN_ATTRIBUTE);    if (handler != null) {      if (!cache) {        request.removeAttribute(HANDLER_EXECUTION_CHAIN_ATTRIBUTE);      }      return handler;    }    //这里的迭代器迭代的时在initHandlerMapping中载入的上下文所有的 HandlerMapping    Iterator it = this.handlerMappings.iterator();    while (it.hasNext()) {      HandlerMapping hm = (HandlerMapping) it.next();      .......      //这里是实际取得handler的过程,在每个HandlerMapping中建立的映射表进 行检索得到请求对应的handler      handler = hm.getHandler(request);      //然后把handler存到ServletContext中去进行缓存      if (handler != null) {        if (cache) {          request.setAttribute(HANDLER_EXECUTION_CHAIN_ATTRIBUTE, handler);        }        return handler;      }    }    return null; }

如果在ServletContext中可以取得handler则直接返回,实际上这个handler是缓冲了 上次处理的结果 - 总要有第一次把这个handler放到ServletContext中去:

如果在ServletContext中找不到handler,那就通过持有的handlerMapping生成一个, 我们看到它会迭代当前持有的所有的 handlerMapping,因为可以定义不止一个,他们在定 义的时候也

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号