springmvc 源码分析(二)

2021-04-30 10:28

阅读:486

标签:hand   结果   集合   根据   image   多个   https   bsp   地方   

测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git

项目结构代码如下:

技术图片

一: controller的三种实现方式:

     1. 第一种是大家非常熟悉的,使用@Controller和@RequestMapping

        技术图片

        浏览器测试第一个方法结果:

  技术图片

 

 


    2.第二种: 实现Controller 接口,并在beanName里写上url;
  技术图片

     浏览器测试结果:

           技术图片

 

           

 

     

    3. 第三种:实现HttpRequestHandler接口,并在beanName里写上url;

      技术图片

 

      浏览器测试结果:

技术图片

 

 总结:  第一种的请求参数是不确定的,随便我们自己定义 第二和第三种,请求参数是固定的,并且他们的url都是定义在请求路径上的,只是返回值不一样

二: 思考

       要执行一个方法,第一步:先找到该方法所在的类的对象,第二步: 调用该对象的指定方法:

      如何找到一个类的实例对象:

      我们在浏览器输入一个url,对应的controller就会被执行,那么肯定会在某个地方存在一个map集合,map集合的key就是url,value值又是什么呢? 对于第一种实现controller的方式(@RequestMapping 方式),value值至少要包含:

     @RequestMapping注解标注的方法对象 和 该方法所属的controller对象,一个controller可以有多个带有@RequestMapping 注解的方法;对于第二和第三种实现controller的方式,由于他们的对象只会有一个方法处理请求,url是beanName

     那么他们的map的value值就是HttpRequestHandler或Controller 接口的实现类的对象即可;因此 三种实现controller的方式,最终会有2种map对象进行存储,这2种对象存在不同的映射器中,我们暂且都叫它们做处理器映射器,也叫HandlerMapping;

     Handler 就是我们所说的controller;我们分别给这两种映射器起一个名字: @RequestMapping 方式的就叫做RequestMappingHandlerMapping,而实现HttpRequestHandler或Controller 接口的方式,因为url就是他们的beanName,所以起个名称:
  BeanNameUrlHandlerMapping;既然2种方式都是通过url查找一个controller,那么我们将他们抽象出来,提供一个父接口,HandlerMapping,要提供一个查找Handler的方法吧:参数只有HttpServletRequest request是两种方式都可以去到的吧,那么返回值呢?

   两种方式的返回值都不一样,用谁都不好,用Object 可以吧,当然可以,但如果我要在我的方法调用前后加上拦截器,这样Object就不合理了,那么久起个公共的名字吧,叫做处理器执行链条,这样可以加入很多的处理器: HandlerExecutionChain

 

   

  

  

 

 

   

    

   

  

   

 

    

   

    2.1: spring是如何根据url去找到对应的contoller的?

            

 

 

 

    2.2: spring 找到对应的controller后,是如何调用对应的方法的

 

   

  

  

 

 

 

 

 

 

      

 

springmvc 源码分析(二)

标签:hand   结果   集合   根据   image   多个   https   bsp   地方   

原文地址:https://www.cnblogs.com/yangxiaohui227/p/13229413.html


评论


亲,登录后才可以留言!