1.运行机制:
1.sevlet3.0后多了一个机制:多了一个ServletContainerInitializer配置文件
这个是3.0以后为我们提供的一种项目的初始化方式,当项目启动后,tomcat会自动寻找META-INF/services/
javax.servlet.ServletContainerInitializer,并读取该文件内容.并且内容中按照要求,就是编写一个实现ServletContainerInitializer接口的实现类,项目启动时,运行它的onStartup方法.
2.这个方法中的ServletContext参数,就代表我们的项目对象,所以可以通过它以编码的形式为我们的servlet项目设置filter,listener,servlet属性.
3.springmvc中就是在利用这个机制.他也实现了这个接口,在他的实现类中大致就是在寻找你的项目中所有实现了WebApplicationInitializer接口的方法,并且调用它的onStartup方法.
4.我们在mvc初始化类继承AbstractDispatcherServletInitializer类时,在项目启动时,就会帮我们创构建一个servlet,此时springmvc也就和servlet关联上了.
5.得到DispatcherServlet的步骤梳理:
1.tomcat软件启动
2.Servlet3.0后,tomcat会在项目类路径中寻找下图文件(名字必须一样)
3.在这个文件中配置了实现ServletContainerInitializer接口的实现类的全路径类名.
4.调用这个SpringServletContainerInitializer实现类的onstartUp方法.
5.这个方法里面就会去拉取项目中所有的WebApplicationInitializer接口的所有实现类,运行它们的onStarUp()方法.
6,就会找到我们自己写的springmvc初始化配置里,虽然我们没有实现onstartup方法,但是在父类中实现了.
7.接着就会创建一个名字叫做dispatchServlet的servlet(也就是创建一个前端控制器,所有请求都找他,然后由它分配给不同的方法)
上面的图是下面图中方法名所在的类名
8.在我们自己的实现类中,为这个servlet配置了路径为"/",所以在前端访问我们的资源的时候,都会先被springmvc创建的servlet拦截,然后由他来分配.
###此时我们就得到了DispatcherServlet,下面我们分析springmvc是如何找到我们controller层中的方法的!
1.创建spring容器
(1)请求访问的是servlet,所以最终请求会调用到springmvc创建的DispatcherServlet(前端控制器)中的doservice()方法中(是由父类一层一层调用过来的),我们配置了拦截请求的路径为"/",所以访问任何路径都会来执行这个方法.在这个方法中就会调用,this.doDispatch()方法,来具体处理我们的请求.
(2)当请求进入到this.doDispatch()方法中后,就会调用getHandler()方法,去寻找处理器(也就是去找与请求路径对应的方法,一个路径对应-一个方法,这个键值对就存放在一个map集合中,也就是处理器映射器.)
*处理器映射器会在创建spring容器的时候被创建好,本质就是一个map集合,键就是我们在controller层的类上和每个方法上的@RequestMapping注解中设置的请求路径,值就是对应的方法.
(3)执行完getHandler()方法后,就会执行this.getHandlerAdapter(处理器适配器).这里就会根据当前匹配到的处理器(方法)的要求(各种参数的要求…),为我们准备对应的处理器适配器,来适配我们各种各样的情况,给我们准备各种各样的参数.然后就会调用方法.
(4)然后就会调用方法,执行我们方法中的逻辑.
(5)执行完成后,就会判断你的方法有没有返回值,返回值是什么,有没有加@ResponseBody注解等判断,然后做出不同的处理.
总结:springmvc的流程就是,在项目启动时,首先会根据我们的配置类,创建一个spring容器,然后会为我们创建一个DispatcherServlet,并且把创建好的容器传进去.当有请求访问时,会先到达servlet中的doservice方法中,然后执行doDispatcher()方法,在这个方法中,就会具体处理我们的请求.首先去调用getHandler()方法,去spring容器中的处理器映射器中寻找与请求路径相对应的处理器,然后,在由处理器适配器,为对应的处理器准备它所需要的参数等东西,然后执行处理器中的具体逻辑,执行完成后,就会判断此处理器与返回值相关的东西.