资讯专栏INFORMATION COLUMN

springMvc源码解读--AbstractUrlHandlerMapping

dendoink / 917人阅读

摘要:系列都是继承于,它是通过来进行匹配的,是将与对应的保存在一个中,在方法中使用从中获取,中实现了具体用从中获取的过程,而将的初始化则交给了具体的子类去完成。这里的就是定义在中的,另外还多带带定义了处理请求的处理器。

AbstractUrlHandlerMapping系列都是继承于AbstractUrlHandlerMapping,它是通过URL来进行匹配的,是将URL与对应的handler保存在一个map中,在getHandlerInternal方法中使用URL从map中获取handler,AbstractUrlHandlerMapping中实现了具体用URL从map中获取handler的过程,而将map的初始化则交给了具体的子类去完成。这里的map就是定义在AbstractUrlHandlerMapping中的handlerMap,另外还多带带定义了处理“/”请求的处理器rootHandler。

handler的入口是getHandlerInternal,具体实现如下:
/* Java

@Override
@Nullable
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
    String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);
    Object handler = lookupHandler(lookupPath, request);
    if (handler == null) {
        // We need to care for the default handler directly, since we need to
        // expose the PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE for it as well.
        Object rawHandler = null;
        if ("/".equals(lookupPath)) {
            rawHandler = getRootHandler();
        }
        if (rawHandler == null) {
            rawHandler = getDefaultHandler();
        }
        if (rawHandler != null) {
            // Bean name or resolved handler?
            if (rawHandler instanceof String) {
                String handlerName = (String) rawHandler;
                rawHandler = obtainApplicationContext().getBean(handlerName);
            }
            validateHandler(rawHandler, request);
            handler = buildPathExposingHandler(rawHandler, lookupPath, lookupPath, null);
        }
    }
    if (handler != null && logger.isDebugEnabled()) {
        logger.debug("Mapping [" + lookupPath + "] to " + handler);
    }
    else if (handler == null && logger.isTraceEnabled()) {
        logger.trace("No handler mapping found for [" + lookupPath + "]");
    }
    return handler;
}

*/
这里lookupHandler方法用于使用lookupPath从map中查找handler,不过很多时候不能从map中直接get到结果,因为很多handler都是用了pattern的匹配模式,如“/getData/*",这里的星号可以代表任意内容而不是真正的匹配URL中的星号,buildPathExposingHandler方法的作用是用于查找到的handler注册两个拦截器PathExposingHandlerInterceptor和UriTemplateVariablesHandlerInterceptor,这是两个内部拦截器,主要作用是将与当前URL实际匹配的pattern、匹配条件,和URL模版参数等设置到request的属性里,这样在后面的处理过程中可以直接从request属性中获取。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72597.html

相关文章

  • SpringMvc源码解读--AbstractUrlHandlerMapping系列

    摘要:定义了一个变量,将所有的和的对应关系放在里面,最后注册在父类里面,创建时通过重写调用方法完成的注册,内部又调用父类的方法将我们注册的的注册到之中。 SimpleUrlHandlerMapping定义了一个map变量,将所有的URL和handler的对应关系放在里面,最后注册在父类里面,SimpleUrlHandlerMapping创建时通过重写initApplicationConte...

    mj 评论0 收藏0
  • springMvc源码解读--HandlerMapping

    摘要:它的作用是根据找到相应的处理器和接口里面只有一个方法只要使用就会返回一个,当然我们可以定义自己的实现类来实现。 HandlerMapping:它的作用是根据request找到相应的处理器handler和interceptors,HandlerMapping接口里面只有一个方法HandlerExecutionChain getHandler(HttpServletRequest req...

    VishKozus 评论0 收藏0
  • SpringMVC源码分析--HandlerMapping(二)

    摘要:由于抽象类重写了父类的方法,所以此时会调用的方法,在该方法中通过调用父类的方法,该方法通过模板方法模式最终调到类的方法。分析该类间接实现了接口,直接实现该接口的是抽象类,映射与请求。 概述 在前一章https://segmentfault.com/a/1190000014901736的基础上继续分析,主要完成SimpleUrlHandlerMapping类的原理。 本系列文章是基于Sp...

    Imfan 评论0 收藏0
  • SpringMVC源码分析--HandlerMapping(三)

    摘要:与类图对比,类继承自抽象类,其又继承自抽象类,再往上继承关系与一致。创建初始化上一章我们分析了的创建初始化过程,的创建初始化过程与一样,方法的入口在抽象类中的方法。至此,代码编写完毕。 概述 本节我们继续分析HandlerMapping另一个实现类BeanNameUrlHandlerMapping,从类的名字可知,该类会根据请求的url与spring容器中定义的bean的name属性值...

    fsmStudy 评论0 收藏0
  • spring-cloud-zuul原理解析(一)

    摘要:是开源的微服务网关,它可以和,等组件配合使用,网上也有很多如何使用的文章,我们也在生产环境使用了,所以读了下的源码,下面把它分享出来,与大家探讨下核心原理。 Zuul是Netflix开源的微服务网关,它可以和Eureka,consul,Ribbon,Hystrix等组件配合使用,网上也有很多如何使用zuul的文章,我们也在生产环境使用了,所以读了下zuul的源码,下面把它分享出来,与大...

    qingshanli1988 评论0 收藏0

发表评论

0条评论

dendoink

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<