转载

Springmvc源码解读

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

实现Controller

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

实现HttpRequestHandler

  • 要求同上
@Component(value = "/prod/test.do")
public class ProductControllerimplements 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
原文  https://chenjiabing666.github.io/2019/07/31/Springmvc源码解读/
正文到此结束
Loading...