Spring MVC:HandlerMapping

HandlerMapping 的類圖

  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 」 的視圖名稱。

相關文章
相關標籤/搜索