当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。
HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。
<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>
@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操作。
detectAllHandlerMappings 默认为true,如果只想加载自己指定的HandlerMapping,请使用下面的方式指定
如果这样指定,则Spring MVC 只会加载这个HandlerMapping,而不会加载配置的其它的HandlerMapping。
以SimpleUrlHandlerMapping 为例,简单分析下HandlerMapping
从SimpleUrlHandlerMapping 类结构中我们可以发现urlMap属性。这个urlMap中保存了xml中配置的映射关系,通过setMappings方法填充到urlMap中。
这个urlMap就充当了SpringMVC的路由功能。
每个HandlerMapping都会有一个这样的Map。
当用户请求时,真正的请求会执行到DispatcherServlet的doDispatch()方法。
迭代查找所有的HandlerMapping,如果找到则直接返回。
如果找不到Controller 则后台抛出异常或响应给前台 404。