SimpleUrlHandlerMapping类详解 - HandlerMapping系列七

SimpleUrlHandlerMapping通过配置一套URL Pattern到处理器的映射而实现的。它使用配置的映射中的URL Pattern匹配请求中的URL,如果匹配成功,则使用匹配URL Pattern映射的Bean作为处理器返回。

SimpleUrlHandlerMapping源码

public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping {  
    private final Map urlMap = new HashMap();  
  
    // 通过属性配置URL到Bean名的映射  
    public void setMappings(Properties mappings) {  
        CollectionUtils.mergePropertiesIntoMap(mappings, this.urlMap);  
    }  
  
    // 配置URL到Bean的映射  
    public void setUrlMap(Map urlMap) {  
        this.urlMap.putAll(urlMap);  
    }  
  
    public Map getUrlMap() {  
        return this.urlMap;  
    }  
  
    @Override  
    public void initApplicationContext() throws BeansException {  
        super.initApplicationContext();  
        // 初始化的时候注册处理器  
        registerHandlers(this.urlMap);  
    }  
  
    protected void registerHandlers(Map urlMap) throws BeansException {  
        // 如果配置的处理器映射为空,则警告  
        if (urlMap.isEmpty()) {  
            logger.warn("Neither 'urlMap' nor 'mappings' set on SimpleUrlHandlerMapping");  
        }  
        else {  
            // 对于没一个配置的URL到处理器的映射,如果URL不是以斜线(/)开头,则追加斜线开头,则注册处理器  
            for (Map.Entry 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);  
            }  
        }  
    }  
}

SimpleUrlHandlerMapping是Spring MVC中适用性最强的Handler Mapping类,允许明确指定URL模式和Handler的映射关系。

SimpleUrlHandlerMapping两种声明方式

prop key方式,key是URL模式,属性值是Handler的ID或者名字。

<beans ...>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
        <props>
           <prop key="/welcome.htm">welcomeController</prop>
           <prop key="/*/welcome.htm">welcomeController</prop>
           <prop key="/helloGuest.htm">helloGuestController</prop>
         </props>
       </property>
    </bean>
    
    <bean id="welcomeController" 
        class="com.mkyong.common.controller.WelcomeController" />
        
    <bean id="helloGuestController" 
        class="com.mkyong.common.controller.HelloGuestController" />
</beans>

value方式,等号左边是URL模式,右边是Handler的ID或者名字。

<beans ...>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
        <value>
           /welcome.htm=welcomeController
           /*/welcome.htm=welcomeController
           /helloGuest.htm=helloGuestController
        </value>
       </property>
    </bean>
    
    <bean id="welcomeController" 
        class="com.mkyong.common.controller.WelcomeController" />
        
    <bean id="helloGuestController" 
        class="com.mkyong.common.controller.HelloGuestController" />
</beans>

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。