快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
erMap = new HashMap();

而SimpleUrlHandlerMapping对接口HandlerMapping的实现是这样的,这个getHandler 根据在初始化的时候就得到的映射表来生成DispatcherServlet需要的执行链

代码

public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {    //这里根据request中的参数得到其对应的handler,具体处理在 AbstractUrlHandlerMapping中    Object handler = getHandlerInternal(request);    //如果找不到对应的,就使用缺省的handler    if (handler == null) {      handler = this.defaultHandler;    }    //如果缺省的也没有,那就没办法了    if (handler == null) {      return null;    }    // 如果handler不是一个具体的handler,那我们还要到上下文中取    if (handler instanceof String) {      String handlerName = (String) handler;      handler = getApplicationContext().getBean(handlerName);    }    //生成一个HandlerExecutionChain,其中放了我们匹配上的handler和定义好的拦 截器,就像我们在HandlerExecutionChain中看到的那样,它持有一个handler和一个拦截 器组。    return new HandlerExecutionChain(handler, this.adaptedInterceptors); }

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

时间:2011-03-29 javaeye jiwenke

我们看看具体的handler查找过程:

代码

protected Object getHandlerInternal(HttpServletRequest request) throws Exception {    //这里的HTTP Request传进来的参数进行分析,得到具体的路径信息。    String lookupPath = this.urlPathHelper.getLookupPathForRequest (request);    .......//下面是根据请求信息的查找    return lookupHandler(lookupPath, request); } protected Object lookupHandler(String urlPath, HttpServletRequest request) {    // 如果能够直接能在SimpleUrlHandlerMapping的映射表中找到,那最好。    Object handler = this.handlerMap.get(urlPath);    if (handler == null) {      // 这里使用模式来对map中的所有handler进行匹配,调用了Jre中的Matcher 类来完成匹配处理。      String bestPathMatch = null;      for (Iterator it = this.handlerMap.keySet().iterator(); it.hasNext ();) {        String registeredPath = (String) it.next();        if (this.pathMatcher.match(registeredPath, urlPath) &&                (bestPathMatch == null || bestPathMatch.length () <= registeredPath.length())) {          //这里根据匹配路径找到最象的一个            handler = this.handlerMap.get(registeredPath);          bestPathMatch = registeredPath;        }      }      if (handler != null) {        exposePathWithinMapping (this.pathMatcher.extractPathWithinPattern(bestPathMatch, urlPath), request);      }    }    else {      exposePathWithinMapping(urlPath, request);    }    //    return handler; }

我们可以看到,总是在handlerMap这个HashMap中找,当然如果直接找到最好,如果找 不到,就看看是不是能通过Match Pattern的模式找,我们一定还记得在配置 HnaderMapping的时候是可以通过ANT语法进行配置的,其中的处理就在这里。

这样可以清楚地看到整个HandlerMapping的初始化过程 - 同时,我们也看到了一个具 体的handler映射是怎样被存储和查找的 -

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号