介绍了Spring MVC框架的概念、特征及核心功能,通过案例详细介绍了Spring MVC开发所需要的开发环境以及基本的开发步骤。
一、Spring MVC框架概述
Spring MVC是Spring框架的一个模块,是一个基于Java的实现了MVC设计模式的轻量级Web框架。它通过一套注解和接口,让简单的Java类成为处理请求的控制器,无需实现任何接口,同时支持REST风格的编程。
1. Spring MVC主要特征
-
清晰的职责分离:将控制器、模型对象、分派器以及处理程序对象的角色分开
-
灵活配置:支持基于XML和注解的配置方式
-
可重用的业务代码:可以使用现有的业务对象作为命令或表单对象
-
可定制的绑定和验证:支持类型转换和验证
-
强大的视图技术:支持JSP、Velocity、FreeMarker等多种视图技术
-
REST支持:原生支持REST风格的URL
-
国际化支持:内置国际化支持
-
主题支持:支持主题和外观的更改
2. MVC 与 Spring MVC
MVC 是一种广泛适用的设计模式,而 Spring MVC 是该模式在 Java Web 开发中的一种优秀实现。Spring MVC 通过提供丰富的功能和简化的开发方式,使开发者能更高效地构建 Web 应用程序,同时保持了 MVC 模式的核心优势。理解二者的关系有助于在不同场景下做出更合适的技术选择。
2.1 MVC 设计模式
1. 基本概念
MVC(Model-View-Controller)是一种软件架构设计模式,将应用程序分为三个核心组件:
-
Model(模型):处理数据和业务逻辑
-
View(视图):负责数据展示
-
Controller(控制器):处理用户输入,协调模型和视图
2. 典型工作流程
用户请求 → 控制器 → 调用模型 → 返回数据 → 控制器选择视图 → 视图渲染 → 响应给用户
2.2 Spring MVC 框架
1. 基本概念
Spring MVC 是基于 Java 的实现 MVC 设计模式的请求驱动型 Web 框架,属于 Spring Framework 的一部分。
2. 核心组件
组件 | 说明 |
---|---|
DispatcherServlet | 前端控制器,接收所有请求 |
HandlerMapping | 请求到处理器的映射 |
Controller | 实际处理请求的组件 |
ModelAndView | 封装模型和视图信息 |
ViewResolver | 视图解析器 |
3. 请求处理流程
用户发送请求 → DispatcherServlet
DispatcherServlet 查询 HandlerMapping → 找到对应 Controller
Controller 调用业务逻辑 → 返回 ModelAndView
DispatcherServlet 查询 ViewResolver → 解析视图
视图渲染 → 返回响应
3. Spring MVC 工作流程
3.1 Spring MVC 的请求执行顺序

(1)用户向服务端发送一次请求,在满足**web.xml
文件中前端控制器的匹配规则** 的前提下,这个请求在 Tomcat 的解析下,会先到前端控制器 DispatcherServlet(也叫中央控制器)。如我们发出*.action
的请求,则只对以".action"结尾的请求路径进行处理。某些访问 JSP 的页面请求则不会被框架拦截处理。
(2)DispatcherServlet 作为框架的核心,通过处理器映射器 (框架提供 SimpleUrlHandlerMapping 类,也可能是其他的映射器类),从映射文件中根据请求路径找到对应的处理器类,并得到该类的实例对象。
(3)DispatcherServlet 通过处理器适配器(框架提供的一个类),对处理类的实例对象进行适配器处理以及参数绑定,并将请求转移到处理类中进行业务处理。
(4)处理类通过实现框架提供的 Controller 接口,最终完成适配功能。并在这里完成具体的业务逻辑功能,将数据和视图信息封装到 ModelAndView对象中,并返回给 DispatcherServlet 处理。
(5)DispatcherServlet 获取从处理器返回的 ModelAndView 对象后,交给视图解析器(框架中提供的功能类)解析,并显示在相应的视图中。
3.2 Spring MVC 框架的核心接口
(1)前端控制器(DispatcherServlet) :它也称为中央控制器,是整个请求响应的控制中心。组件的调用都由它统一调度。配置在 web.xml
文件中,随服务器启动而实例化。
(2)简单处理器映射器(SimpleUrlHandlerMapping) :根据用户访问的 URL 映射到对应的后端处理器 Handler
,并将该处理器的实例返回给前端控制器。
(3)处理器适配器(HandlerAdapter) :常用的有 SimpleControllerHandlerAdapter
,该功能组件在框架中默认运行。它用于封装参数数据,绑定视图等。
(4)视图解析器(ViewResolver) :常用的有 InternalResourceViewResolver
,在框架中该功能组件默认运行。它用于将 ModelAndView
逻辑视图解析为具体的视图(如 JSP)。
(5)后端处理器(Handler) :即由程序员编写的处理类,对用户具体请求进行处理,该类必须实现框架提供的 Controller
接口,才能作为处理器完成组件功能。
(6)处理器中使用的类(ModelAndView) :用于封装数据和视图信息,并返回给前端控制器。该类实现了对原生 Servlet
中 Request
对象的封装,因此可以作为域对象封装数据,并在视图中用 EL 表达式取出数据。
二、案例------Spring MVC框架实现模拟登录
案例说明:使用Spring MVC框架进行用户登录验证
1.新建web项目并引入依赖
XML
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<!-- spring基本依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0</version>
<type>maven-plugin</type>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.22.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.22.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>3.0.1</version>
<type>maven-plugin</type>
</dependency>
2. 配置Spring MVc的前端控制器
Spring MVC 框架通过前端控制器对符合匹配规则的客户端请求进行统一的拦截处理。这些匹配规则放置在 Spring MVC 的配置文件中,框架通过默认的路径去加载这些文件。
配置文件路径 :在 Webapp/WEB-INF/web.xml
中进行配置。
配置内容 :由于 Spring MVC 框架的前端控制器是一个 Servlet
,该 Servlet
在前面的支持 JAR 包中存在。其配置方式与 Servlet
的配置一致,具体代码如下。
XML
<?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">
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
<!-- 截所有请求并交由DispatcherServlet处理 -->
<!-- <url-pattern>/</url-pattern>-->
</servlet-mapping>
</web-app>
3. 配置 Spring MVC 的核心映射文件 springmvc-servlet.xml
文件路径 :在 Webapp/WEB-INF
目录下新建 springmvc-servlet.xml
。文件名来源于 web.xml
配置的前端控制器的名称与后缀 -servlet
,前端控制器在加载过程中会自动在该路径下寻找该映射文件。因此该文件的路径和文件名不能随意更改。如要更改,则需在 web.xml
中配置前端控制器时,修改其默认的映射文件路径和文件名,这里暂时不做讲解。
配置内容如下 :
(1)xml
文件中的约束
(2)配置访问路径与后台处理器之间的映射。该配置需要框架提供的映射类 SimpleUrlHandlerMapping
来完成请求路径的跳转。
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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.rainpet"></context:component-scan>
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<mvc:annotation-driven/>
<import resource="classpath:mybatisConfig.xml"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatisConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<property name="mapUnderscoreToCamelCase" value="true"/>
</bean>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描所有dao接口 -->
<property name="basePackage" value="org.rainpet.mapper"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 配置访问路径与后台处理器之间的映射 -->
<bean id="loginController" class="org.rainpet.LoginController"></bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.action">loginController</prop>
<!-- 配置了一个SimpleUrlHandlerMapping,将URL路径/login映射到loginController,用于处理登录请求 -->
<!-- <prop key="/login">loginController</prop>-->
</props>
</property>
</bean>
</beans>
4. 新建登录页面login.jsp和登录成功后的页面success,jsp
文件路径 :在 Webapp/
目录下新建 login.jsp、success,jsp
XML
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
<form action="/springMvc01/login.action" method="post">
用户名:<input type="text" name="userName"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
XML
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功</title>
</head>
<body>
<h1>登录成功</h1>
${userName}
</body>
XML
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>error</title>
</head>
<body>
<h1>error</h1>
${info}
</body>
5. 新建登录处理器LoginController.java
java
package org.rainpet;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
ModelAndView mav=new ModelAndView();
if(password!=null&&password.equals("123456")){
mav.addObject("userName","欢迎您:"+userName);
mav.setViewName("success.jsp");
}else {
mav.addObject("info","用户名或密码错误");
mav.setViewName("error.jsp");
}
return mav;
}
}
- 启动TomCat
浏览器地址栏输入http://localhost:8080/springMvc01/login.jsp,到登录界面,实现登录
