Spring中存在兩種類型的handlers。第一種是 handler mappings(處理程序映射)。它們的角色定位與前面所描述的功能徹底相同。它們嘗試將當前請求與相應的 controller 以及其中的方法相匹配。第二種是 handler adapter(處理器適配器)。handler adapter 從 handler mappings 中獲取映射的 controllers 和方法並調用它們。這種類型的適配器必須實現org.springframework.web.servlet.HandlerAdapter 接口。下面就來介紹 handler mappings。(Spring 版本:5.18)web
① RequestMappingHandlerMapping:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,它的映射檢測是基於註解的,它會自動在Controller 裏面尋找@RequestMapping(...)等註解並解析。(注:在Spring5以前是使用DefaultAnnotationHandlerMapping,這個類在Spring5以後被移除了,一些項目在升級Spring版本時是可能會由於配置而報錯)spring
例如:mvc
1 <mvc:annotation-driven />
告知 Spring啓用註解驅動,而後 Spring 會自動爲咱們註冊 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter(這只是咱們關注的其中2個)。app
② SimpleUrlHandlerMapping:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,經過配置請求路徑和 Controller 映射創建關係,找到相應的 Controller。SimpleUrlHandlerMapping 是最靈活的 HandlerMapping 實現。它容許在bean實例和URL之間 或 bean名稱和URL之間進行直接和聲明性映射。url
例如:把請求「/simpleUrlWelcome」和「/*/simpleUrlWelcome」映射到 welcome 這個bean上。spa
1 @Configuration 2 public class SimpleUrlHandlerMappingConfig { 3 4 @Bean 5 public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { 6 SimpleUrlHandlerMapping simpleUrlHandlerMapping 7 = new SimpleUrlHandlerMapping(); 8 9 Map<String, Object> urlMap = new HashMap<>(); 10 urlMap.put("/simpleUrlWelcome", welcome()); 11 simpleUrlHandlerMapping.setUrlMap(urlMap); 12 13 return simpleUrlHandlerMapping; 14 } 15 16 @Bean 17 public WelcomeController welcome() { 18 return new WelcomeController(); 19 } 20 }
等效的 xml 配置方式:code
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 2 <property name="mappings"> 3 <value> 4 /simpleUrlWelcome=welcome 5 /*/simpleUrlWelcome=welcome 6 </value> 7 </property> 8 </bean> 9 <bean id="welcome" class="com.xxx.WelcomeController" />
或者:xml
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
2 <property name="mappings">
3 <props>
4 <prop key="/simpleUrlWelcome">welcome</prop>
5 <prop key="/*/simpleUrlWelcome">welcome</prop>
6 </props>
7 </property>
8 </bean>
③ BeanNameUrlHandlerMapping:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,經過定義的 beanName 進行查找要請求的Controller。BeanNameUrlHandlerMapping 是默認的 HandlerMapping 實現。BeanNameUrlHandlerMapping 將請求 URL 映射到具備相同名稱的bean,這個特定映射支持直接名稱匹配以及使用「*」模式的模式匹配。blog
例如:傳入URL「/ foo」映射到名爲「/ foo」的bean 。模式映射的一個示例是將請求從「/ foo *」映射到名稱以「/ foo」開頭的bean,例如「 / foo2 /」或「 / fooOne /」。接口
1 @Configuration 2 public class BeanNameUrlHandlerMappingConfig { 3 @Bean 4 BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() { 5 return new BeanNameUrlHandlerMapping(); 6 } 7 8 @Bean("/beanNameUrl") 9 public WelcomeController welcome() { 10 return new WelcomeController(); 11 } 12 }
等效的 xml 配置:
1 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> 2 <bean name="/beanNameUrl" class="com.xxx.WelcomeController" />
在這兩種配置中,都不須要爲 BeanNameUrlHandlerMapping 定義bean,由於 Spring MVC 提供了它。全部對「/ beanNameUrl」的請求都將由 DispatcherServlet 轉發到「 WelcomeController 」。WelcomeController 返回一個名爲「 welcome 」 的視圖名稱。