在还在好奇SpringMVC是怎么接收请求,让控制层执行的嘛?介绍了SpringMVC的执行流程,其中里面涉及了三个组件,那么这三个组件是干什么的呢?在哪用到了呢?在这节中简单介绍下springmvc三个组件的作用 及工作流程。
处理器映射器:
处理器映射器的作用:根据请求的url查找Handler。
在还在好奇SpringMVC是怎么接收请求,让控制层执行的嘛?中说的工程启动或执行第一次请求的时候就会加载解析我们定义的请求地址,他是如何解析的没有说。springmvc的处理器映射器就是来做这个的。
说明:SpringMVC执行initStrategies方法进行初始化的时候有两种方式:
1、在web.xml中配置了1 的时候工程启动的过程中就会执行,故工程启动时就会初始化处理器映射器、适配器等从而加载解析定义的所有的控制器方法及请求地址。
2、如果没有配置这个那么工程在启动完成之后核心控制器处理第一个请求的时候才会执行该方法之后的请求就不会再执行该方法了。
在核心处理器DispatchServlet中找到initStrategies方法,该方法的作用就是初始化加载所有东西。
继续跟踪到指定的处理器映射器执行的方法
当走完这个Map的时候查看debug下面的变量你就会发现惊奇的一幕:
这不就是我们在控制层中定义的请求地址和对应的执行方法吗。
所以在执行处理器映射器时就会准备这个Map对象同时会把所有RequestMapping注解全部读下来然后生成注解中的地址和方法的对应关系。
之后在核心处理器拦截到请求的时候就会先拿到处理器映射器,根据截取请求的地址从中拿出具体的执行方法,再通过反射执行该方法。
到这就可以明白为什么核心处理器拦截到请求时会先去找处理器映射器了。
这样做的好处就是防止每次使用的时候都去解析加载这些数据从而消耗资源,类似于连接池和SpringIOC容器也是相同道理。
处理器适配器:
处理器适配器的作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
我们指定核心控制器在拦截到请求后会先拿到处理器映射器和处理器适配器,为什么拿处理器映射器我们已经清楚了。那它为什么再去拿一个处理器适配器呢?具体是干什么呢?
举个例子:可以发现目前的笔记本上只有两三个USB插口,跟之前电脑相比少了许多各种的插口。那只有两三个USB插口就能支持所有的连接方式吗?答案肯定是可以的。因为不管以什么方式或接口连接笔记本电脑,都可以通过一个转换器来连接到电脑上的USB接口,从哪来的不关心,只需要到电脑这一端转换为USB就好了。
我们知道编写一个控制器类肯定不只是用@Controller注解这一种方式来实现。
比如说:
1、实现Controller接口重写handleRequest方法。
2、实现HttpRequestHandler接口重写handleRequest方法。
编写一个控制器类一共这有三种方法,但是执行的时候都是经过核心控制器DispatchServlet来完成的。
结合上面引用的那段话,可以将这三种不同方式创建的控制器看作是从不同地方过来的连接最后都是到DispatchServlet(这里看作是USB),那么从不同的连接到USB时肯定需要一个转换器才能连接到。
所以核心控制器在执行完处理器映射器后就要看是个什么方式的控制器,就需要根据适配器去执行handle(此时适配器就相当于转换器)。
来看,DispatcherServlet中的doDispatch方法:
此时ha代表的就是一个适配器,ha是一个接口其中会有实现类,而这每一个实现类基本上就是一个具体的适配器,每种方式编写的控制器类都会用ha不同的实现类来执行,以达到类似转换的目的。
视图解析器:
视图解析器的作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。视图对象是由视图解析器负责实例化。
在前几年早期的项目中使用SpringMVC的时候我们在控制层中的请求方法中都是返回一个字符串根据这个字符串找到具体的jsp页面,视图解析器就是在这个过程中使用的。
但是目前来看这种方式几乎已经背淘汰了,现在大部分的项目都是采用前后端分离异步请求的方式来获取数据。所以这里就不在做过多的介绍了。
好,本节对SpringMVC三大组件就先介绍到这里,下节继续介绍SpringMVC在执行的过程中是如何处理请求参数的。