上篇博客讲了DispathcerServlet的流转过程以及它是如何工作的,从这篇博客开始就开始深入到DispatcherServlet的内部看看它的几个主要的组件。那么这一篇就从HandlerMapping这个组件开始学习。
public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping {  
    
    private final Map<String, Object> urlMap = new HashMap<String, Object>();  
  
    // 通过属性配置URL到Bean名的映射  
    public void setMappings(Properties mappings) {  
        CollectionUtils.mergePropertiesIntoMap(mappings, this.urlMap);  
    }  
  
    // 配置URL到Bean的映射  
    public void setUrlMap(Map<String, ?> urlMap) {  
        this.urlMap.putAll(urlMap);  
    }  
  
    public Map<String, ?> getUrlMap() {  
        return this.urlMap;  
    }  
  
    @Override  
    public void initApplicationContext() throws BeansException {  
        super.initApplicationContext();  
        // 初始化的时候注册处理器  
        registerHandlers(this.urlMap);  
    }  
  
    protected void registerHandlers(Map<String, Object> urlMap) throws BeansException {  
        // 如果配置的处理器映射为空,则警告  
        if (urlMap.isEmpty()) {  
            logger.warn("Neither 'urlMap' nor 'mappings' set on SimpleUrlHandlerMapping");  
        }  
        else {  
            // 对于没一个配置的URL到处理器的映射,如果URL不是以斜线(/)开头,则追加斜线开头,则注册处理器  
            for (Map.Entry<String, Object> entry : urlMap.entrySet()) {  
                String url = entry.getKey();  
                Object handler = entry.getValue();  
                // Prepend with slash if not already present.  
                if (!url.startsWith("/")) {  
                    url = "/" + url;  
                }  
                // Remove whitespace from handler bean name.  
                if (handler instanceof String) {  
                    handler = ((String) handler).trim();  
                }  
                registerHandler(url, handler);  
            }  
        }  
    }  
  
}  protected Object getHandlerInternal(HttpServletRequest request) throws Exception {  
    String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);  
            //查找符合匹配规则的handler。可能的结果是HandlerExecutionChain对象或者是null  
    Object handler = lookupHandler(lookupPath, request);  
            //如果没有找到匹配的handler,则需要处理下default handler  
    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();  
        }  
                    //在getRootHandler和getDefaultHandler方法中,可能持有的是bean name。  
        if (rawHandler != null) {  
            // Bean name or resolved handler?  
            if (rawHandler instanceof String) {  
                String handlerName = (String) rawHandler;  
                rawHandler = getApplicationContext().getBean(handlerName);  
            }  
            validateHandler(rawHandler, request);  
            handler = buildPathExposingHandler(rawHandler, lookupPath, lookupPath, null);  
        }  
    }  
            //如果handler还是为空,则抛出错误。  
    if (handler != null && this.mappedInterceptors != null) {  
        Set<HandlerInterceptor> mappedInterceptors =  
                this.mappedInterceptors.getInterceptors(lookupPath, this.pathMatcher);  
        if (!mappedInterceptors.isEmpty()) {  
            HandlerExecutionChain chain;  
            if (handler instanceof HandlerExecutionChain) {  
                chain = (HandlerExecutionChain) handler;  
            } else {  
                chain = new HandlerExecutionChain(handler);  
            }  
            chain.addInterceptors(mappedInterceptors.toArray(new HandlerInterceptor[mappedInterceptors.size()]));  
        }  
    }  
    if (handler != null && logger.isDebugEnabled()) {  
        logger.debug("Mapping [" + lookupPath + "] to handler '" + handler + "'");  
    }  
    else if (handler == null && logger.isTraceEnabled()) {  
        logger.trace("No handler mapping found for [" + lookupPath + "]");  
    }  
    return 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 PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";
 
    public abstract HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
 
}Spring学习总结(2.3)-Spring MVC:handlermapping
原文:http://blog.csdn.net/zhuojiajin/article/details/46292125