javascript
Spring mvc HandlerMapping 实现机制
概述
當DispatcherServlet接受到客戶端的請求后,SpringMVC 通過 HandlerMapping 找到請求的Controller。
HandlerMapping 在這里起到路由的作用,負責找到請求的Controller。
Spring MVC 默認提供了4種 HandlerMapping的實現
通過配置請求路徑和Controller映射建立關系,找到相應的Controller
通過 Controller 的類名找到請求的Controller。
通過定義的 beanName 進行查找要請求的Controller
通過注解 @RequestMapping(“/userlist”) 來查找對應的Controller。
HandlerMapping 的4種配置
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/userlist.htm">userController</prop></props></property> </bean><bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/><bean id="userController" name="/users" class="cn.com.infcn.web.controller.UserController"></bean>UserController
@Controller public class UserController extends AbstractController {@Override@RequestMapping("/userlist")protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)throws Exception {List<User> userList = new ArrayList<User>();userList.add(new User("zhangsan", 18));userList.add(new User("list", 16));return new ModelAndView("userList", "users", userList);} }HandlerMapping 4種訪問路徑
訪問方式: http://ip:port/project/userlist.htm
訪問方式: http://ip:port/project/user
注:類的首字母要小寫
訪問方式: http://ip:port/project/users
注:bean name屬性必須要以“/”開頭。
訪問方式: http://ip:port/project/userlist
注:@RequestMapping(“/userlist”)定義的路徑
HandlerMapping 初始化原理
繼續上一篇Spring mvc DispatchServlet 實現機制 初始化DispatchServlet的時候,執行了初始化HandlerMapping操作。
initHandlerMapping() 方法
1. 判斷detectAllHandlerMappings是否為true,如果為true,則加載當前系統中所有實現了HandlerMapping接口的bean。
2. 如果為false,則加載bean名稱為“handlermapping”的HandlerMapping實現類。
3. 如果還沒有找到HandlerMapping,則加載SpvingMVC 配置文件中,默認配置的HandlerMapping。
detectAllHandlerMappings 設置
detectAllHandlerMappings 默認為true,如果只想加載自己指定的HandlerMapping,請使用下面的方式指定
如果這樣指定,則Spring MVC 只會加載這個HandlerMapping,而不會加載配置的其它的HandlerMapping。
SimpleUrlHandlerMapping
以SimpleUrlHandlerMapping 為例,簡單分析下HandlerMapping
從SimpleUrlHandlerMapping 類結構中我們可以發現urlMap屬性。這個urlMap中保存了xml中配置的映射關系,通過setMappings方法填充到urlMap中。
這個urlMap就充當了SpringMVC的路由功能。
每個HandlerMapping都會有一個這樣的Map。
DispatcherServlet.doDispatch()
當用戶請求時,真正的請求會執行到DispatcherServlet的doDispatch()方法。
1. 通過getHandler() 方法去查找HandlerMapping中查找對應的Controller,并封裝成HandlerExecutionChain。
2. 如果找不到,則執行noHandlerFound() 方法。
getHandler() 方法
迭代查找所有的HandlerMapping,如果找到則直接返回。
noHandlerFound() 方法
如果找不到Controller 則后臺拋出異常或響應給前臺 404。
想了解更多精彩內容請關注我的公眾號
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的Spring mvc HandlerMapping 实现机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring mvc DispatchS
- 下一篇: Spring mvc ViewResol