您的位置:首页 > 移动开发

springMVC源码分析--HandlerMapping(一)

2017-03-07 14:51 375 查看
HandlerMapping的工作就是为每个请求找到合适的请求找到一个处理器handler,其实现机制简单来说就是维持了一个url到Controller关系的Map结构,其提供的实际功能也是根据request请求来获取具体执行的包含Controller信息的HandlerAdapter。

HandlerMapping接口及实现类如下:

HandlerMapping 接口:接口中主要定义了一个getHandler方法,返回一个HandlerExecutionChain对象springMVC源码分析--拦截器HandlerExecutionChain(三)

AbstractHandlerMapping 抽象类:

(1)实现了接口的getHandler方法

(2)定义了getHandlerInternal方法,返回HandlerMethod

(3)定义了getHandlerExecutionChain方法,返回HandlerExecutionChain

通过上图我们可以看到接下来是两个抽象类及其子类AbstractHandlerMethodMapping和AbstractUrlHandlerMapping

一、AbstractHandlerMethodMapping系列是将具体的Method作为Handler来使用的,也是我们用的最多的,比如经常使用的@RequestMapping所注释的方法就是这种Handler,这种Handler是HandlerMethod

二、AbstractUrlHandlerMapping是通过url来进行匹配的,大致原理就是将url与对应的Handler保存在一个map中。

接下来我们会用多篇博客对整个HandlerMapping的实现类进行介绍。

在DispatcherServlet的doDispatch方法中实现如下:

[java] view
plain copy

 print?





protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {  

    HandlerExecutionChain mappedHandler = null;   

    ........  

    mappedHandler = getHandler(processedRequest);  

    ........              

}  

getHandler方法的操作就是选择HandlerMapping,调用getHandler(request)方法获得HandlerExecutionChain

[java] view
plain copy

 print?





protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {  

        for (HandlerMapping hm : this.handlerMappings) {  

            if (logger.isTraceEnabled()) {  

                logger.trace(  

                        "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");  

            }  

            HandlerExecutionChain handler = hm.getHandler(request);  

            if (handler != null) {  

                return handler;  

            }  

        }  

        return null;  

    }  

接口HandlerMapping定义的方法很简单就是一个getHandler方法,采用模板方法模式,很多实现是在子类中具体实现的。

[java] view
plain copy

 print?





/** 

 *handlerMapping的工作就是为了请求找到合适的处理器handler 

 *最常用的两个handlerMapping:BeanNameURLHandlerMapping:查找spring容器中和请求的url同名的bena 

 *SimpleUrlHandlerMapping:配置请求url和handler的映射关系 

 */  

public interface HandlerMapping {  

  

      

    String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";  

  

    String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";  

  

    String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";  

  

    String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";  

  

    String MATRIX_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".matrixVariables";  

  

    String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";  

  

    //获得HandlerExecutionChain  

    HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;  

  

}  



总结:我们简单的介绍了一下HandlerMapping及其实现类,简单来说HandlerMapping的实现机制就是根据request来获得HandlerExecutionChain,其实就是获取真正要执行的Controller或者某个具体的方法。HandlerMapping接口提供的唯一的方法就是HandlerExecutionChain getHandler(HttpServletRequest request)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: