前言
MVC是经典的软件架构设计模式,几乎在各个领域各种开发语言中,均采纳了这个思想。此刻博主突然想到了Thinking in xxx
系列设计书籍。换句话说,就是“各人自扫门前雪”
和“术业有专攻”
。当职责分配得当后,剩下的就是发挥各“人”
之所长了。
而SpringMVC继承了这一优良传统,沿袭了其中的核心思想。所以今天博主就来谈谈它是如何做到的,为什么可以引领风骚十几年。
Q:SpringMVC是如何工作的
Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet
来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。
其中,处理器是你的应用中注解了@Controller
和@RequestMapping
的类和方法,Spring为处理器方法提供了极其多样灵活的配置。Spring 3.0以后提供了@Controller注解机制、@PathVariable注解以及一些其他的特性,你可以使用它们来进行RESTful web站点和应用的开发。
“对扩展开放”是Spring MVC框架一个重要的设计原则,而对于Spring的整个完整框架来说,其设计原则是“对扩展开放,对修改闭合”
。这也是经典的开闭原则的实践之一。
1. SpringMVC交互图
Spring MVC框架,与其他很多web的MVC框架一样:请求驱动。
所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器,同时提供其他web应用开发所需要的功能。
2. DispatcherServlet(前端控制器)工作流
下图展示了SpringMVC的DispatcherServlet
处理请求的工作流,按序查看:
2.1 发送请求Request
DispatcherServlet
是springMVC的重要部分,位于中心。提供整个框架访问点,起到交换的作用,而且与Spring IoC容器集成。在实际开发中,只需要在web.xml中进行配置,其他组件由框架提供,配置示例如下:
2.2 处理映射HandlerMapping
HandlerMapping
负责根据用户请求request找到Handler(即处理器)。SpringMVC提供了实现了不同映射方式的多种映射器,例如:配置文件方式,实现接口方式,注解方式等。以下是在spring.xml中,使用自动扫描的形式:
2.3 处理适配HandlerAdapter
我们的controller类必须继承Controller(base class)或者添加注解@Controller
,前端控制器才会根据controller类对应的类型调用相应的HandlerAdapter
,处理客户端的request。
2.4 定义控制类controller
该controller返回一个ModelAndView:
2.5 视图解析View resolver
View Resolver
负责将处理结果生成View视图。其过程大致是先根据逻辑视图名解析成物理视图名(即具体的页面URL),再生成View视图对象,最后对View进行渲染,将处理结果通过页面展示给用户。大致配置如下:
2.6 视图View
编写JSP、excel、pdf等可向客户呈现的内容或页面,展示数据。
结语
博主通过一文对SpringMVC架构尝试解读,按运行时序解剖SpringMVC的每个关键步骤是“做什么的”
和“如何做的”
。相信你能够从中get到它的核心运行逻辑,并基于此搭建可靠的开发框架。