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原始碼解讀–AbstractUrlHandlerMappingSpringMVC原始碼APP
- SpringMVC多個檔案上傳實現SpringMVC
- SpringMVC 解析(三) Controller 註解SpringMVCController
- SpringMVC實現原理及解析SpringMVC
- 自定義SpringMVC部分實現SpringMVC
- 解讀並實現一個簡單的koa-router
- SVM實現多分類的三種方案
- SpringMVC請求對映handler原始碼解讀SpringMVC原始碼
- java中介面多個實現類,如何指定實現類,根據子類型別選擇實現方法Java型別
- 三次握手的誤解與錯誤類比 (RFC 解讀)
- SpringMVC實現引數校驗SpringMVC
- 搭建基於springmvc,ibatis的工程實現讀寫分離,配置分離SpringMVCBAT
- 聊聊如何通過自定義註解實現springmvc和sentinel整合SpringMVC
- 精盡Spring MVC原始碼分析 - HandlerMapping 元件(三)之 AbstractHandlerMethodMappingSpringMVC原始碼APP元件
- java 一個類實現兩個介面的案例Java
- Spring+SpringMVC+JDBC實現登入SpringMVCJDBC
- 【SpringMVC】RESTFul簡介以及案例實現SpringMVCREST
- 精讀《深入瞭解現代瀏覽器三》瀏覽器
- 教你SpringMVC RESTFul實體類建立及環境搭建SpringMVCREST
- 三個流程實現銷售漏斗
- 【React原始碼解讀】- 元件的實現React原始碼元件
- 從原始碼解讀Category實現原理原始碼Go
- SpringMVC 中 @ControllerAdvice 註解的三種使用場景!SpringMVCController
- VirtualView Android 實現詳解(三)—— 新增一個自定義控制元件ViewAndroid控制元件
- Ajax+SpringMVC實現跨域請求SpringMVC跨域
- SpringMVC重定向傳引數的實現SpringMVC
- SpringMVC中的攔截器Interceptor實現SpringMVC
- Note:SpringMVC入門程式 實現Control介面SpringMVC
- 開源 - Ideal庫 - Excel幫助類,TableHelper實現(三)IdeaExcel
- 自己實現三個API(getSiblings,addCLass,text)API
- 從零實現一個RPC框架系列文章(二):11個類實現簡單RPCRPC框架
- Bert文字分類實踐(一):實現一個簡單的分類模型文字分類模型
- @PropertySource 註解實現讀取 yml 檔案
- PostgreSQL 原始碼解讀(218)- spinlock的實現SQL原始碼
- Linklist程式碼實現以及程式碼解讀
- Axios 原始碼解讀 —— 原始碼實現篇iOS原始碼
- SpringMVC實現ajax上傳圖片實時預覽SpringMVC
- SpringMVC 實現支付寶支付功能(沙箱環境)SpringMVC