昔洛 的个人博客

Bug不空,誓不成佛

目录
第十一篇 Spring MVC 入门
/        

第十一篇 Spring MVC 入门

一、Spring MVC 概述

    Spring MVC 是 Spring 提供的一个实现了 Web MVC 设计模式的轻量级 Web 框架。它与 Struts 2 框架一样,都属于 MVC 框架,但其使用和性能等方面比 Struts 2 更加优异。
Spring MVC 具有如下特点:

  • 是 Spring 框架的一部分,可以方便地利用 Spring 所提供的其他功能。
  • 灵活性强,易于与其他框架集成。
  • 提供了一个前端控制器 DispatcherServlet,使开发人员无需额外开发控制器对象。
  • 可自动绑定用户输入,并能正确的转换数据类型。
  • 内置了常见的校验器,可以校验用户输入。如果校验不能通过,那么就会重定向到输入表单。
  • 支持国际化。可以根据用户区域显示多国语言。
  • 支持多种视图技术。它支持 JSP、Velocity 和 FreeMarker 等视图技术。
  • 使用基于 XML 的配置文件,在编辑后,不需要重新编译应用程序。

二、第一个 Spring MVC 应用

1.创建x项目,引入 JAR 包
在 Eclipse 中,创建一个新的项目,在项目中的 lib 目录中添加运行 Spring MVC 程序所需要的 JAR 包,并发布到类路径下,添加后的项目如图所示:
image.png
2.创建前端控制器
在 web.xml 中,配置 Spring MVC 的前端控制器 DispatcherServlet,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0" metadata-complete="true">
	<servlet>
		<!-- 配置前端过滤器 -->
		<servlet-name>springmvc</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<!-- 初始化时加载配置文件 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc-config.xml</param-value>
		</init-param>
		<!-- 表示容器在启动时立即加载 Servlet -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

在上述代码中,主要对 <servlet>和<servlet-mapping>元素进行了配置。在<servlet>中,配置了 Spring MVC 的前端控制器 DispatcherServlet,并通过其子元素<init-param>配置了 Spring MVC 配置文件的位置,<load-on-startup>元素中的 1 表示容器在启动时立即加载这个 Servlet;在<servlet-mapping>中,通过<url-pattern>元素的"/",会将所有 URL 拦截,并交由 DispatcherServlet 处理。

3.创建 Controller 类
在 src 目录下,创建一个 com.cn.controller 包,并在包中创建控制器类 FirstController,该类需要实现 Controller 接口,代码如下:

package com.cn.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/*
 * 控制器类
 */
public class FirstController implements Controller{
	@Override
	public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) {
		//创建 ModelAndView 对象
		ModelAndView mav = new ModelAndView();
		//向模型对象中添加数据
		mav.addObject("msg","这是我的第一个 Spring MVC 程序");
		//设置逻辑视图名
		mav.setViewName("/WEB-INF/jsp/first.jsp");
		//返回 ModelAndView 对象
		return mav;
	}
}

在上述代码中,handleRequest() 是 Controller 接口的实现方法,FirstController 类会调用该方法来处理请求,并返回一个包含书图名或包含视图名和模型的 modelAndView 对象。此示例向模型对象中添加了一个名称为 msg 的字符串对象,并设置返回的视图路径为 “/WEB-INF/jsp/first.jsp”,这样,请求就会被转发到 first.jsp 页面。

4.创建 Spring MVC 的配置文件,配置控制器映射信息
在 src 目录下,创建配置文件 springmvc-config.xml,并在文件中配置控制器信息,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
	<!-- 配置处理器 Handler,映射“/firstController”请求 -->
	<bean name="/firstController" class="com.cn.controller.FirstController" />
	<!-- 处理器映射器,将处理器 Handle 的 name 作为 url 进行查找 -->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
	<!-- 处理器适配器,配置对处理器中 handleRequest() 方法的调用 -->
	<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
	<!-- 视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>	
</beans>

上述代码中,首先定义了一个名称为 “/firstController” 的 Bean,该 Bean 会将控制器类 FirstController 映射到 “/firstController” 请求中;然后配置了处理器映射器 BeanNameUrlHandlerMapping 和 处理器适配器 SimpleControllerHandlerAdapter,其中处理器映射器用于将处理器 Bean 中的 name(即 URL)进行处理器查找,而处理器适配器用于完成对 FirstController 处理器中 handleRequest() 方法的调用。最后配置了视图解析器 InternalResourceViewResolver 来解析结果视图,并将结果呈现给用户。

5.创建视图(View)页面
在 WEB-INF 目录下,创建一个 jsp 文件夹,并在文件夹中创建一个页面文件 first.jsp,在该页面中使用 EL 表达式获取 msg 中的信息,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>入门程序</title>
</head>
<body>
	${msg}
</body>
</html>

6.启动项目,测试应用
将项目发布到 tomcat 后启动 Tomcat 服务器,在浏览器中访问地址 http://localhost:8080/项目名/firstController,其显示效果如下所示:
image.png

三、Spring MVC 的工作流程

Spring MVC 程序的执行情况可用下图展示:
image.png
按照图中所标注的序号,Spring MVC 程序的完整执行流程如下:
(1)用户通过客户端向服务器发送请求,请求会被 Spring MVC 的前端控制器 DispatcherServlet 所拦截。
(2)DispatcherServlet 拦截到请求后,会调用 HandlerMapping 处理器映射器。
(3)处理器映射器根据请求 URL 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。
(4)DispatcherServlet 会通过返回信息选择合适的 HandlerAdapter(处理器适配器)。
(5)HandlerAdapter 会调用并执行 Handler(处理器),这里的处理器指的就是程序中编写的 Controller 类,也被称之为后端控制器。
(6)Controller 执行完成后,会返回一个 ModelAndView 对象,该对象中会包含视图名或包含模型和视图名。
(7)HandlerAdapter 将 ModelAndView 对象返回给 DispatcherServlet。
(8)DispatcherServlet 会根据 ModelAndView 对象选择一个合适的 ViewResolver(视图解析器)。
(9)ViewResolver 解析后,会向 DispatcherServlet 中返回具体的 View(视图)。
(10)DispatcherServlet 对 View 进行渲染(即将模型数据填充至视图中)。
(11)视图渲染结果会返回给客户端浏览器显示。
在上述执行过程中,DispatcherServlet、HandlerMapping、HandlerAdapter 和 ViewResolver 对象的工作是在框架内部执行的,开发人员并不需要关心这些对象内部的实现过程,只需要配置前端控制器(DispatcherServlet),完成 Controller 中的业务处理,并在视图中(View)中展示相应信息即可。

没有什么代码的执行速度比空代码更快。
评论
歌名 - 歌手
0:00