我们直到,Spring MVC 查找 handler 是通过一个 handlerMapping 的来查找对应的 handler 的
for (HandlerMapping mapping : this.handlerMappings) {// 关键代码:获取 handlerHandlerExecutionChain handler = mapping.getHandler(request);if (handler != null) {return handler;}}
那么为什么,会存在多个 HandlerMapping 呢?
Spring MVC 默认提供了两种注册 handler 的方式,第一个是 RequestMappingHandlerMapping,另一个是 BeanNameUrlHandlerMapping,这个两个 mapping 都可以完成 handler 的实现
RequestMappingHandlerMapping
这个是我们最长使用的类型,就是使用 @Controller 或 @RequestMapping 注解的处理类,放入 urlLookup 中
BeanNameUrlHandlerMapping
使用 beanName 声明 URL 形式的 bean,交给 BeanNameUrlHandlerMapping 处理,放入 handlerMap 中
那么什么是 beanName 类型的 handler 呢?
1、实现 Controller 接口,使用 @Component 注解
// BeanName 类型的 Controller@Component("/user.do")public class BeanNameController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("------BeanNameController-------");return null;}}
2、实现 HttpRequestHandler 接口,使用 @Component 注解
// BeanName 类型的 Controller@Component("/handler.do")public class HandlerController implements HttpRequestHandler {@Overridepublic void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("--------HandlerController-------");}}
