我们直到,Spring MVC 查找 handler 是通过一个 handlerMapping 的来查找对应的 handler 的

  1. for (HandlerMapping mapping : this.handlerMappings) {
  2. // 关键代码:获取 handler
  3. HandlerExecutionChain handler = mapping.getHandler(request);
  4. if (handler != null) {
  5. return handler;
  6. }
  7. }

那么为什么,会存在多个 HandlerMapping 呢?

Spring MVC 默认提供了两种注册 handler 的方式,第一个是 RequestMappingHandlerMapping,另一个是 BeanNameUrlHandlerMapping,这个两个 mapping 都可以完成 handler 的实现
image.png

RequestMappingHandlerMapping

这个是我们最长使用的类型,就是使用 @Controller 或 @RequestMapping 注解的处理类,放入 urlLookup 中

BeanNameUrlHandlerMapping

使用 beanName 声明 URL 形式的 bean,交给 BeanNameUrlHandlerMapping 处理,放入 handlerMap 中

那么什么是 beanName 类型的 handler 呢?

beanName 类型的 handler 有两种注册方式

1、实现 Controller 接口,使用 @Component 注解

  1. // BeanName 类型的 Controller
  2. @Component("/user.do")
  3. public class BeanNameController implements Controller {
  4. @Override
  5. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  6. System.out.println("------BeanNameController-------");
  7. return null;
  8. }
  9. }

2、实现 HttpRequestHandler 接口,使用 @Component 注解

  1. // BeanName 类型的 Controller
  2. @Component("/handler.do")
  3. public class HandlerController implements HttpRequestHandler {
  4. @Override
  5. public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  6. System.out.println("--------HandlerController-------");
  7. }
  8. }