spring架构---spring-mvc运行原理解读

上来一张图,没图没真相:

1、  用户发送请求至前端控制器DispatcherServlet。

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、  DispatcherServlet调用HandlerAdapter处理器适配器。

5、  HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、  Controller执行完成返回ModelAndView。

7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、  ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

组件说明:

以下组件通常使用框架提供实现:

DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。

HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 

HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。

ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。

组件:
1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供
作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

4、处理器Handler(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。

6、视图View(需要工程师开发jsp...)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)


一次真正的客户端请求到服务器再到用户端的全过程描述:

首先用户在浏览器栏中输入一个网址如www.baidu.com这样的域名,首先DNS(ISPDNS服务器)会根据你的域名为你解析成你要访问的ip地址和某个端口(IP:端口)这样的形式,当你的请求以http协议到达服务器的端口后, tomcat会调用windows提供的方法对端口进行轮期询问,每当接受到新数据后,就将数据传输到tomcat上面,tomcat拿到数据后解析http协议拿到所需要的数据后根据你要访问的路径名进入到某个你正在运行的项目中,假如进入的项目是用spring-mvc来搭建的话,首先这个请求被一直运行的listener监听器拦截到,也就是你在web.xml中配置的这个:

监听器拦截到请求后又将他转发给 Dispatcher(前端控制器)也可以理解为spring-mvc中的"cpu"

其中大多数的操作由他来控制进行,DispatcherServlet拿到这个请求后,然后再调用HandlerMapping(处理器映射器)获取Handler,这里获取到的Handler是什么呢?我们知道在一个项目中后台有许多controller,dao,model,entity,service,utils,在这些后台逻辑实现中,我们为许多类和方法加了注解,如给controller里面一个方法加了@RequestMapping,这个项目在tomcat运行的时候spring就会通过

这个自动扫描将所有加过注解的方法用map结构存成key-value形式的键值对,key值存储该方法的访问路径,如

我这里的这个存储的路径就是 

http://Localhost:8080/shopping/views/hello(localhost是主机名,这里也可是ip地址,8080是端口名,不写默认8080端口,shopping为我的项目名).

value值里面存储的是该方法的类路径+方法名,如:

com.qcr.controllers.classification.Show.hello(胡写的 反正就是这个意思啊)

 然后通过比对key值获取到要执行的value值也就是要执行的类方法,返回给DispatcherServlet前端控制器, 然后DispatcherServlet调用HandlerAdapter处理器适配器来执行该Handler,通过反射和代理的方法, HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器),Controller执行完毕后返回一个ModelAndView,HandlerAdapter处理器适配器将controller执行结果ModelAndView返回给DispatcherServlet,DispatcherServlet再将ModelAndView传给ViewReslover视图解析器,ViewReslover解析后返回具体View,前端控制器对视图进行渲染,View生产一个httpResponse响应返回到Tomcat上面再又转发给客户端,至此整个请求在spring-mvc执行的过程全部结束.....

猜你喜欢

转载自blog.csdn.net/weixin_42504145/article/details/84074628