前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springmvc源码解读

Springmvc源码解读

作者头像
爱撒谎的男孩
发布2019-12-31 16:35:02
3610
发布2019-12-31 16:35:02
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

1. 实现Controller的方式

1.1. 实现Controller

1.2. 实现HttpRequestHandler

1.3. 使用注解

2. @EnableWebMvc

3. DispatcherServlet

4. HandlerMapping

4.1. BeanNameUrlHandlerMapping

4.2. SimpleUrlHandlerMapping

4.3. RequestMappingHandlerMapping

5. HandlerExecutionChain

6. HandlerAdapter

7. 执行流程分析

实现Controller的方式

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

实现Controller

  • 使用Bean中的id指定路径,必须是以/开头
代码语言:javascript
复制
@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

  • 要求同上
代码语言:javascript
复制
@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

执行流程分析

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现Controller的方式
    • 实现Controller
      • 实现HttpRequestHandler
        • 使用注解
        • @EnableWebMvc
        • DispatcherServlet
        • HandlerMapping
          • BeanNameUrlHandlerMapping
            • SimpleUrlHandlerMapping
              • RequestMappingHandlerMapping
              • HandlerExecutionChain
              • HandlerAdapter
              • 执行流程分析
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档