SpringMVC三個HandlerMapping實現類解讀
目錄
1、前言
DispatchServlet需要通過url來找到對應的controller,而在SpringMVC中為我們完成這個工作的元件就是HandlerMapping。
而我們常見的No mapping found for HTTP request with URI……
錯誤也是因為HandlerMapping沒有找到對應handler,今天我們就來了解一下,SpringMVC中HandlerMapping的實現類。
2、HandlerMapping的實現類
在HandlerMapping的實現類中,除去抽象類、已棄用的實現類、子介面以及EmptyHandlerMapping空實現之外,我們可以得出三個實現類:
- BeanNameUrlHandlerMapping
- SimpleUrlHandlerMapping
- RequestMappingHandlerMapping
我們來逐一解讀一下這幾個類的作用。
2.1 BeanNameUrlHandlerMapping
該實現類可以把IOC容器中name以"/" 開頭的Bean註冊為handler
簡單介紹一下這個類的使用方式:在xml檔案中,我們只需要在配置bean的時候,加上name屬性就可以將handler註冊上去:
<bean name="/hello.html" class="com.zhengfa.controller.HelloController"/>
需要注意的是,name屬性必須帶上“/”字首,否則BeanNameUrlHandlerMapping是不會將其註冊進去的,關於這一點我們可以在原始碼中驗證:
protected String[] determineUrlsForHandler(String beanName) {
List<String> urls = new ArrayList<String>();
if (beanName.startsWith("/")) {
urls.add(beanName);
}
String[] aliases = getApplicationContext().getAliases(beanName);
for (String alias : aliases) {
if (alias.startsWith("/")) {
urls.add(alias);
}
}
return StringUtils.toStringArray(urls);
}
2.2 SimpleUrlHandlerMapping
該實現類需要我們在xml檔案中手動配置url與handler的對映,使用方式有點類似struts2:
<bean name="helloController" class="com.zhengfa.controller.HelloController"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<props>
<prop key="/hello.html">
helloController
</prop>
</props>
</property>
</bean>
2.3 RequestMappingHandlerMapping
這是最常用的HandlerMapping實現,通過它,我們可以使用註解的形式來標識url與handler的對映:
@Controller("/mvc")
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
3、SpringMVC中的預設配置
當我們沒有在xml檔案中配置任何HandlerMapping實現類時,SpringMVC會使用預設的實現類,該配置可以在DispatcherServlet.properties中找到:
在此處SpringMVC為我們引入了兩個預設實現類,一個是我們上面講過的BeanNameUrlHandlerMapping。
而另一個DefaultAnnotationHandlerMapping是已經棄用的實現類,在Spring3.1使用新的HandlerMapping 和 HandlerAdapter來支援@Contoller和@RequestMapping註解處理器
需要注意的是,如果我們在xml中配置了HandlerMapping,那麼預設的HandlerMapping就會失效。
相關文章
- SpringMVC原始碼系列:HandlerMappingSpringMVC原始碼APP
- SpringMVC多個檔案上傳實現SpringMVC
- SpringMVC原始碼總結(一)HandlerMapping和HandlerAdapter入門SpringMVC原始碼APPAPT
- Scala 中的集合(三):實現一個新的 Collection 類
- 一個分數類的實現——Rational類
- springMvc原始碼解讀–AbstractUrlHandlerMappingSpringMVC原始碼APP
- SVM實現多分類的三種方案
- 解讀並實現一個簡單的koa-router
- java中介面多個實現類,如何指定實現類,根據子類型別選擇實現方法Java型別
- SpringMVC 解析(三) Controller 註解SpringMVCController
- 一個類如何實現自殺?薦
- 自定義SpringMVC部分實現SpringMVC
- SpringMVC實現原理及解析SpringMVC
- 解讀Promise內部實現原理Promise
- java 一個類實現兩個介面的案例Java
- 精讀《深入瞭解現代瀏覽器三》瀏覽器
- 三個流程實現銷售漏斗
- SpringMVC請求對映handler原始碼解讀SpringMVC原始碼
- springmvc實現檔案上傳SpringMVC
- SpringMVC實現引數校驗SpringMVC
- 【React原始碼解讀】- 元件的實現React原始碼元件
- 從原始碼解讀Category實現原理原始碼Go
- 聊聊如何通過自定義註解實現springmvc和sentinel整合SpringMVC
- 搭建基於springmvc,ibatis的工程實現讀寫分離,配置分離SpringMVCBAT
- Andriod 實現一個類微信聊天介面 (二)
- 【SpringMVC】RESTFul簡介以及案例實現SpringMVCREST
- 用Flutter實現一個小說閱讀AppFlutterAPP
- 教你SpringMVC RESTFul實體類建立及環境搭建SpringMVCREST
- Bert文字分類實踐(一):實現一個簡單的分類模型文字分類模型
- @PropertySource 註解實現讀取 yml 檔案
- 兩個類,讓你再也不用實現onActivityResult()
- Java一個列舉類的2種實現。Java
- HashSet 實現類
- Spring+SpringMVC+JDBC實現登入SpringMVCJDBC
- Ajax+SpringMVC實現跨域請求SpringMVC跨域
- SpringMVC重定向傳引數的實現SpringMVC
- 總結-SpringMVC實現驗證碼介面SpringMVC
- SpringMVC的View模組用什麼實現?SpringMVCView