0%

2.5 Spring MVC执行的流程 2.5.1 Spring MVC应用的开发步骤

2.5 Spring MVC执行的流程

下面将对开发Spring MVC应用的过程进行总结,以让读者对Spring MVC有一个大致的了解。

2.5.1 Spring MVC应用的开发步骤

下面简单介绍 Spring MVC应用的开发步骤。

1 定义前端控制器

web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求。由于Web应用是基于请求/响应架构的应用,所以不管哪个MVC Web框架,都需要在web.xml中配置该框架的核心ServletFilter,这样才可以让该框架介入Web应用。
例如,开发Spring MVC应用的第1步就是在web.xml文件中增加如下配置片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 定义前端控制器 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- springmvc-config.xml文件的路径 -->
<param-value>WEB-INF/springmvc-config.xml</param-value>
</init-param>
<!-- 项目启动时加载前端控制器 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 让spring mvc的前端控制器拦截的请求的模式 -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- 拦截所有的请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>

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框架中,控制器实际上由两个部分组成:

  1. 即拦截所有用户请求和处理请求的通用代码都由前端控制器DispatcherServlet完成,
  2. 而实际的业务控制则由Controller处理。业务控制:如调用后台业务逻辑代码,返回处理结果等

4 配置Handle

Java领域的绝大部分MVC框架都非常喜欢使用xml文件来进行配置管理,这在以前是一种思维定势。即配置哪个请求对应哪个Controller,从而让前端控制器根据该配置来创建合适的Controller实例,并调用该Controller的业务控制方法。
例如,可以采用如下代码片段来配置Handle:

1
2
<!-- 配置Handle,映射"/hello"请求 -->
<bean name="/hello" class="org.fkit.controller.HelloController"/>

Spring2.5之后,推荐使用注解来配置Handle:

1
2
3
4
5
6
7
8
9
10
package org.fkit.controller;
......
@Controller
public class HelloController
{
......
@RequestMapping(value = "/hello")
public ModelAndView hello(){......}
......
}

上面的配置片段指定如果用户请求URLhello,则使用org.fkit.controller.Hellocontroller来处理。现在几乎所有的MVC框架都使用”约定优于配置”的思想,也就是采用约定方式来规定用户请求地址和Handle之间的对应关系。

5 编写视图资源

Handle处理用户请求结束后,通常会返回一个ModelAndView对象,该对象中应该包含返回的视图名或视图名和模型,这个视图名就代表需要显示的物理视图资源。如果Handle需要把一些数据传给视图资源,则可以通过模型对象实现。

经过上面5个步骤,即可基本完成一个Spring MVC处理流程的开发,也就是可以执行一次完整的请求→响应过程。

原文链接: 2.5 Spring MVC执行的流程 2.5.1 Spring MVC应用的开发步骤