文章目录
  1. 1. 实现Controller的方式
    1. 1.1. 实现Controller
    2. 1.2. 实现HttpRequestHandler
    3. 1.3. 使用注解
  2. 2. @EnableWebMvc
  3. 3. DispatcherServlet
  4. 4. HandlerMapping
    1. 4.1. BeanNameUrlHandlerMapping
    2. 4.2. SimpleUrlHandlerMapping
    3. 4.3. RequestMappingHandlerMapping
  5. 5. HandlerExecutionChain
  6. 6. HandlerAdapter
  7. 7. 执行流程分析

实现Controller的方式

  • 如何实现一个controller,在源码中其实将controller叫做handler,我们通常知道实现controller的方式就是在类上添加一个@Controller@RequestMapping注解,但是还有其他的方式定义一个controller

实现Controller

  • 使用Bean中的id指定路径,必须是以/开头
1
2
3
4
5
6
7
8
@Component(value = "/user/test.do")
public class UserController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("userController run.....");
return null;
}
}

实现HttpRequestHandler

  • 要求同上
1
2
3
4
5
6
7
@Component(value = "/prod/test.do")
public class ProductController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
System.out.println("prodController run .....");
}
}

使用注解

  • 经常使用,不再细说

@EnableWebMvc

  • 该注解使Spring MVC 开启高级功能的入口,主要的作用就是加载了一个配置类DelegatingWebMvcConfiguration,其中创建了MVC默认的一些组件,比如viewControllerHandlerMappingRequestMappingHandlerMappingBeanNameUrlHandlerMappingRequestMappingHandlerAdapter 等等。

DispatcherServlet

  • 一个用于分发请求的Servlet,一个请求进来之后,Servlet会根据HandlerMapping将请求转发给对应的Handler(controller)处理。
  • 其中重要的方法如下:
    • protected void doDispatch(HttpServletRequest request, HttpServletResponse response):执行分发的流程
    • protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response):渲染视图

HandlerMapping

  • 顾名思义,就是保存Handler和Mapping之间的对应的关系,当然这种关系是多种的,有uri to beanName,有uri to HandlerMethod,不同的对应关系有不同的实现类处理,因此就衍生了后续的三种实现类。

BeanNameUrlHandlerMapping

  • 见名思意,这种肯定是uri to beanName的实现,用于存储实现了ControllerHttpRequestHandler接口的Handler的映射关系

SimpleUrlHandlerMapping

  • 这种也是uri to Handler的实现,不过这种用于存储View-controllerResourceHttpRequestHandler的映射关系

RequestMappingHandlerMapping

  • 这种用于实现uri to HandlerMethod的关系,从名称可以看出,这种是用于使用@RequestMapping注解的

HandlerExecutionChain

  • 处理器执行链,其中存储了Handler和拦截器

HandlerAdapter

  • 简单的说就是执行的Handler的适配类,定义了三个方法,如下:
    • boolean supports(Object handler);:判断当前的HandlerAdapter是否支持这个Handler
    • ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;:执行Handler的方法
    • long getLastModified(HttpServletRequest request, Object handler);:获取请求都中的LastModified
  • 该接口有多个实现类,如下:
    • RequestMappingHandlerAdapter:匹配HandlerMethod
    • HttpRequestHandlerAdapter:匹配实现了HttpRequestHandler接口的Handler
    • SimpleControllerHandlerAdapter:匹配实现了Controller接口的Handler

执行流程分析

文章目录
  1. 1. 实现Controller的方式
    1. 1.1. 实现Controller
    2. 1.2. 实现HttpRequestHandler
    3. 1.3. 使用注解
  2. 2. @EnableWebMvc
  3. 3. DispatcherServlet
  4. 4. HandlerMapping
    1. 4.1. BeanNameUrlHandlerMapping
    2. 4.2. SimpleUrlHandlerMapping
    3. 4.3. RequestMappingHandlerMapping
  5. 5. HandlerExecutionChain
  6. 6. HandlerAdapter
  7. 7. 执行流程分析