标签: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后,是如何调用对应的方法的
标签:hand 结果 集合 根据 image 多个 https bsp 地方
原文地址:https://www.cnblogs.com/yangxiaohui227/p/13229413.html