springMVC 源码学习-请求映射原理

一、DispatcherServlet的继承关系

1、FrameworkServlet

        HttpServlet中的doGet等方法在FrameworkServlet之中重写了,都是调用该方法:

         在这个方法内部调用doServlce的方法

         这个doService的方法在FrameworkServlet中是一个抽象方法,说明是交给它的子类去重写的即就是DispatcherServlet。

2、DispathcerServlet

        这也是SpringMVC的核心组件,用来处理请求,重写(实现了)doService方法。

         在doService方法中,最核心的是调用doDispatch来做转发等操作。

2.1 doDispatch

        随便写了个控制器测试 :

        

        当发送/car请求时候,在doDispatch中获取到请求

        在request变量中就有请求路径。

 

        之后执行到这一步:

        在这一步执行完之后就找到了所对应的控制器及上面的 Car()  方法。

2.2 mappedHandler的确定

        this.getHandler方法:

   @Nullable
    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        if (this.handlerMappings != null) {
            Iterator var2 = this.handlerMappings.iterator();

            while(var2.hasNext()) {
                HandlerMapping mapping = (HandlerMapping)var2.next();
                HandlerExecutionChain handler = mapping.getHandler(request);
                if (handler != null) {
                    return handler;
                }
            }
        }

        其中handlerMappings初始就有5个:

        主要的目的就是 在这五种类型的处理器选取能够匹配当前请求的handler。

        spring中的web项目启动的过程中MVC就会扫描所有的Controller并且解析其中的注解,全部保存到handlerMappings中。

        

         执行完这行代码后可以在 mapping变量中的看到:

         说明标注注解@RequestMapping的方法都已经被注册了。

        之后SpringMVC经过对比找到了请求路径为/car的控制器及其方法,之后返回handler即可。

HandlerExecutionChain handler = mapping.getHandler(request);

        确定handler的过程:首先是匹配url,比如有好几个/car的请求路径但是方法不同。

        然后再一个一个确认请求方法,最终返回所对应的handler。也就是mapping,getHandler中的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值