springmvc 源码分析(二)
2021-04-30 10:28
标签:hand 结果 集合 根据 image 多个 https bsp 地方 测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git 项目结构代码如下: 一: controller的三种实现方式: 1. 第一种是大家非常熟悉的,使用@Controller和@RequestMapping 浏览器测试第一个方法结果: 浏览器测试结果: 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,所以起个名称: 两种方式的返回值都不一样,用谁都不好,用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
2.第二种: 实现Controller 接口,并在beanName里写上url;
BeanNameUrlHandlerMapping;既然2种方式都是通过url查找一个controller,那么我们将他们抽象出来,提供一个父接口,HandlerMapping,要提供一个查找Handler的方法吧:参数只有HttpServletRequest request是两种方式都可以去到的吧,那么返回值呢?