2.5 Spring MVC执行的流程
下面将对开发Spring MVC
应用的过程进行总结,以让读者对Spring MVC
有一个大致的了解。
2.5.1 Spring MVC应用的开发步骤
下面简单介绍 Spring MVC应用的开发步骤。
1 定义前端控制器
在web.xml
文件中定义前端控制器DispatcherServlet
来拦截用户请求。由于Web
应用是基于请求/响应架构的应用,所以不管哪个MVC Web
框架,都需要在web.xml
中配置该框架的核心Servlet
或Filter
,这样才可以让该框架介入Web
应用。
例如,开发Spring MVC
应用的第1步
就是在web.xml
文件中增加如下配置片段:
1 | <!-- 定义前端控制器 --> |
2 定义包含表单数据的JSP页面
如果需要以POST
方式提交请求,则定义包含表单数据的JSP
页面。如果仅仅只是以GET
方式发送请求,则无须经过这一步。
3 定义处理用户请求的Handle类
定义处理用户请求的Handle
类,该类可以实现Controller
接口或使用@Controller
注解来实现。这一步也是所有MVC
框架中必不可少的,因为这个DispatcherServlet
就是MVC中的C,也就是前端控制器,该控制器负责接收请求,并将请求分发给对应的Handle
类,该Handle
类负责调用后台业务逻辑代码来处理请求
可能有读者会产生疑问: Controller
并未接收到用户请求,它怎么能够处理用户的请求呢?MVC
框架的底层机制是:前端控制器DispatcherServlet
接收到用户请求后,通常会对用户请求进行简单预处理,例如解析、封装参数等,然后通过反射
来创建Controller
实例,并调用Controller
的指定方法来处理用户请求:
- 如果是实现
Controller
接口的Controller,则调用的是handlRequest
方法, - 如果是使用基于注解的控制器,则可以调用任意方法
这里又产生了一个问题:当Servlet
拦截用户请求后,它如何知道创建哪个Controller
接口的实例呢?有两种解决方案。
利用xml
配置文件:例如在xml
配置文件中描述hello
请求对应使用HelloController
类。这就可以让MVC
框架知道当接收到hello
请求时要创建哪个Controller
接口的实例。
利用注解:例如使用注解@Controller
描述一个类,并使用注解@RequestMapping(value="/hello")
描述hello
请求对应的方法。这样也可以让MVC
框架知道要创建哪个Controller
接口的实例并调用哪个方法处理请求。
根据上面的介绍不难发现,在Spring MVC
框架中,控制器实际上由两个部分组成:
- 即拦截所有用户请求和处理请求的通用代码都由前端控制器
DispatcherServlet
完成, - 而实际的业务控制则由
Controller
处理。业务控制:如调用后台业务逻辑代码,返回处理结果等
4 配置Handle
Java
领域的绝大部分MVC
框架都非常喜欢使用xml
文件来进行配置管理,这在以前是一种思维定势。即配置哪个请求对应哪个Controller
,从而让前端控制器根据该配置来创建合适的Controller
实例,并调用该Controller
的业务控制方法。
例如,可以采用如下代码片段来配置Handle
:
1 | <!-- 配置Handle,映射"/hello"请求 --> |
在Spring2.5
之后,推荐使用注解来配置Handle
:
1 | package org.fkit.controller; |
上面的配置片段指定如果用户请求URL
为hello
,则使用org.fkit.controller.Hellocontroller
来处理。现在几乎所有的MVC
框架都使用”约定优于配置”的思想,也就是采用约定方式来规定用户请求地址和Handle
之间的对应关系。
5 编写视图资源
当Handle
处理用户请求结束后,通常会返回一个ModelAndView
对象,该对象中应该包含返回的视图名或视图名和模型,这个视图名就代表需要显示的物理视图资源。如果Handle
需要把一些数据传给视图资源,则可以通过模型对象实现。
经过上面5个步骤,即可基本完成一个Spring MVC
处理流程的开发,也就是可以执行一次完整的请求→响应
过程。