16.SpringMVC组件解析和注解解析

一、SpringMVC组件解析

之前我们是从代码的角度来解析的,不全面,让我们站在SpringMVC的角度看看完整的环节是咋完成的:

(1)首先是一个请求发给前端控制器(DispatcherServlet)

(2)因为请求是一个http的url啊,前端控制器相当于项目经理,只是做调解作用,对于这个url,项目经理也不知道该不该让你访问。

所以前端控制器去找到一个能处理这个url的兄弟过来:处理器映射器HandlerMapping

(3)处理器映射器处理了这个url之后,会得到一大堆结果。为什么是一大堆?因为一个url过来,不是你想访问什么我就都能让你访问的,我在我的内部有我自己的校验,我会有一些过滤器拦截器对不对,我把这些过滤器拦截器和url都告诉项目经理:你想要访问这个url可以,但是前提是得经过这些过滤器和拦截器的考验。

所以处理器映射器HandlerMapping返回给前端控制器(项目经理)一个处理器执行链HandlerExecutionChain(日报,我这天做了啥,有啥成果)

(4)现在我们的前端控制器(项目经理)知道,你这个url想要访问要经过这么多过滤器拦截器的考验啊(即,知道这个处理器执行链HandleExecutionChain)。

知道了之后得安排程序员干活啊。 所以前端控制器(项目经理)找来了处理器适配器HandlerAdaptor(程序员)

(5)我们的处理器适配器HandlerAdaptor(程序员)一看,好家伙,项目经理来了这么一大串需求?那就干呗。

处理器适配器HandlerAdaptor(程序员)请求处理器Handler,可以理解成程序员写了相关的接口(Handler)来处理这些请求。处理完之后得到对应的一个叫ModelAndView的结果。

(6)程序员将收到的结果告诉前端控制器(项目经理),但是要知道,我们通过postman写接口,最后得到200的结果,我们看得懂,项目经理一知半解,用户哪懂啊。

于是前端控制器(项目经理)找来视图解析器ViewResolver(前端程序员),前端程序员一看,好家伙,一堆参数,那我就用我会的把你这个参数拼成页面吧。

(7)于是前端程序员通过各种比如H5,VUE之类的整了个视图(View对象),给到项目经理

(8)经理拿到没用啊,客户要用,于是经理把这些视图渲染成客户需要的看得懂的,发给客户,生成试图页面jsp

 

二、SpringMVC注解解析

之前项目里面一堆注解,都啥意思呢?下面我们看看:

(1)@RequestMapping:用于建立请求URL和处理请求方法之间的对应关系

*1)属性

value:指定请求url

method:指定请求方式,post,get

params:指定请求参数

    1)params={"name"}:请求参数必须要有name

    2)params={"money!100"}:参数中money不能是100

2)位置。这里有个注意点:

看这个success.jsp的位置。

如果我的return是这样的话,是访问不到的,因为返回的是当前目录下面的success.jsp,即/user/success.jsp

但是如果是这样就可以,表示整个项目下的success.jsp,即/success.jsp

 

(2)扫描组件

如果springmvc扫描了controller包下的。那么spring就不会去扫contorller下的了,当然其他的包spring还是会扫的。

扫描组件除了我们这个写法,还有一种写法,当然不推荐:

 

(3)转发和重定向

怎么看源码:

 

InternalResourceViewResolver的父类是UrlBasedViewResolver,我们看一下UrlBasedViewResolver打的源码:

在渲染最后jsp的时候,默认UrlBasedViewResolver使用的是转发,我们可以通过redirect:/success.jsp来让页面进行重定向

 
 

 

(4)渲染jsp的前缀和后缀

如果我们要返回该jsp的话,return的写法应该是:

但是每次返回都需要写一个路径和后缀未免也太麻烦了,我们可以在spring-mvc.xml中进行视图解析器的配置:

prefix表示前缀,suffix表示后缀,通过这个写法,我们可以重写UrlBasedViewResolver的prefix,suffix:

因此加了配置之后,我们对应的return就可以写成这样: