當DispatcherServlet接受到客戶端的請求後,SpringMVC 經過 HandlerMapping 找到請求的Controller。
HandlerMapping 在這裏起到路由的做用,負責找到請求的Controller。web
<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="com.qunar.web.controller.UserController"></bean>
@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); } }
繼續上一篇Spring mvc DispatchServlet 實現原理 初始化DispatchServlet的時候,執行了初始化HandlerMapping操做。spring
detectAllHandlerMappings 默認爲true,若是隻想加載本身指定的HandlerMapping,請使用下面的方式指定mvc
若是這樣指定,則Spring MVC 只會加載這個HandlerMapping,而不會加載配置的其它的HandlerMapping。app
以SimpleUrlHandlerMapping 爲例,簡單分析下HandlerMappingide
從SimpleUrlHandlerMapping 類結構中咱們能夠發現urlMap屬性。這個urlMap中保存了xml中配置的映射關係,經過setMappings方法填充到urlMap中。url
這個urlMap就充當了SpringMVC的路由功能。spa
每一個HandlerMapping都會有一個這樣的Map。.net
當用戶請求時,真正的請求會執行到DispatcherServlet的doDispatch()方法。3d
迭代查找全部的HandlerMapping,若是找到則直接返回。code
若是找不到Controller 則後臺拋出異常或響應給前臺 404。