SpringMVC⼯作原理及其流程
本⽂介绍SpringMVC的基本原理,对于⼀个浏览器请求,SpringMVC的处理流程。
SpringMVC主要包含⼀下组件
DispatcherServlet-前端控制器
HandlerMapping-处理器映射
Controller-控制器
ViewResolver-视图解析器
View-视图
Spring的请求流程
SpringMVC的核⼼在于其请求流程,这是使⽤SpringMVC框架的基础,SpringMVC是⼀种基于Servlet的技术,它提供了核⼼控制器DispatcherServlet和相关的组件,并制定了松散的结构,以适合各种灵活的需求,下⾯结合流程图对SpringMVC做了⼀个简要的介绍 。
请求旅程的第⼀站是Spring的DispatcherServlet。与⼤多数基于Java的Web框架⼀样,Spring MVC所有的请求都会通过⼀个前端控制器(front controller)Servlet。前端控制器是常⽤的Web应⽤程序模式,在这⾥⼀个单实例的Servlet将请求委托给应⽤程序的其他组件来执⾏实际的处理。在Spring MVC中,DispatcherServlet就是前端控制器。
DispatcherServlet的任务是将请求发送给Spring MVC控制器(Controller)。控制器是⼀个⽤于处理请求的Spring组件。在典型的应⽤程序中可能会有多个控制器,DispatcherServlet需要知道应该将请求发送给哪个控制器。所DispatcherServlet以会查询⼀个或多个处理器映射(HandlerMapping) 来确定请求的下⼀站在哪⾥。处理器映射会根据请求所携带的URL信息来进⾏决策。
⼀旦选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器 。到了控制器,请求会卸下其负载(⽤户提交的信息)并耐⼼等待控制器处理这些信息。(实际上,设计良好的控制器本⾝只处理很少甚⾄不处理⼯作,⽽是将业务逻辑委托给⼀个或多个服务对象进⾏处理。)
控制器在完成逻辑处理后,通常会产⽣⼀些信息,这些信息需要返回给⽤户并在浏览器上显⽰。这些信息被称为模(Model)。不过仅仅给⽤户返回原始的信息是不够的——这些信息需要以⽤户友好的⽅式进⾏格式化,⼀般会是HTML。所以,信息需要发送给⼀个视图(View),通常会是JSP。
控制器所做的最后⼀件事就是将模型数据打包,并且标⽰出⽤于渲染输出的视图名。它接下来会将请求连同模型和视图名发送回DispatcherServlet 。这样,控制器就不会与特定的视图相耦合,传递给DispatcherServlet的视图名并不直接表⽰某个特定的JSP。实际上,它甚⾄并不能确定视图就是JSP。相反,它仅仅传递了⼀个逻辑名称,这个名字将会⽤来查产⽣结果的真正视图。
DispatcherServlet将会使⽤视图解析器(ViewResolver)来将逻辑视图名匹配为⼀个特定的视图实现,它可能是也可能不是JSP。
既然DispatcherServlet已经知道由哪个视图渲染结果,那请求的任务基本上也就完成了。它的最后⼀站是视图的实现(可能是JSP) ,在这⾥它交付模型数据。请求的任务就完成了。视图将使⽤模型数据渲染输出,这个输出会通过响应对象传递给客户端(不会像听上去那样硬编码) 。
可以看到,请求要经过很多的步骤,最终才能形成返回给客户端的响应。⼤多数的步骤都是在Spring框架内部完成的,也就是上图所⽰的组件中。
上⾯是我《Spring实战》上的解释,我感觉介绍还不够详细,后来有看到了⼀篇博>>客,写的⾮常详细,如下:
SpringMVC流程
根据以上SpringMVC⼯作原理图,对其⼯作流程作如下总结
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响应⽤户。
组件说明
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. 视图解析器ViewResolver(不需要⼯程师开发),由框架提供。
作⽤:进⾏视图解析,根据逻辑视图名解析成真正的视图(View)。
ViewResolver负责将处理结果⽣成View视图,ViewResolver⾸先根据逻辑视图名解析成物理视图名即具体的页⾯地址,再⽣成View视图对象,最后对View进⾏渲染将处理结果通过页⾯展⽰给⽤户。 SpringMVC框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
⼀般情况下需要通过页⾯标签或页⾯模版技术将模型数据通过页⾯展⽰给⽤户,需要由⼯程师根据业务需求开发具体的页⾯。
6. 视图View(需要⼯程师开发jsp…)。
View是⼀个接⼝,实现类⽀持不同的View类型(jsp、freemarker、pdf…)。
下边两个组件通常情况下需要开发:
Handler:处理器,即后端控制器⽤controller表⽰。
View:视图,即展⽰给⽤户的界⾯,视图中通常需要标签语⾔展⽰模型数据。
结语
看到这是不是觉得⾮常乱,我也这么觉得,刚开始学SpringMVC的时候,我就不太明⽩,原来背后的
原理这么复杂,这就是我写这篇博客的原因了。以后实际开发中多思考,学习⼀下相关的设计模式,对着源码慢慢消化吧!
参考springmvc常用标签
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论