一、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就可以写成这样: