Spring MVC 入门:构建 Web 应用的核心框架
Spring MVC 入门:构建 Web 应用的核心框架
一个基于 Spring 框架的强大 Web 开发模块。作为 Java 企业开发的热门选择,Spring MVC 以其灵活性、模块化和与 Spring 生态的无缝集成,深受开发者喜爱。本文将带你从零开始,基于 XML 配置方式搭建一个简单的 Spring MVC 项目,帮助初学者快速上手,同时为有经验的开发者提供复习和进阶建议。
Spring MVC 基于 MVC(Model-View-Controller)设计模式,适合构建 RESTful API 或传统的 Web 应用。本文基于 Spring 5.x(兼容 Spring 6),使用 Maven 构建,涵盖控制器、视图解析和静态资源处理等核心概念。让我们一步步实现一个简单的用户查询页面!
前置准备
开始之前,请确保开发环境准备好:
- JDK:推荐 JDK 8 或更高(本文使用 JDK 17 测试通过)。
- Maven:用于依赖管理,确保配置好环境变量。
- IDE:IntelliJ IDEA 或 Eclipse,方便代码调试。
- Web 服务器:内置 Tomcat 或 Jetty(本文用 Tomcat 9)。
- 项目结构:创建一个 Maven Web 项目,目录如下:
src ├── main │ ├── java │ │ └── com.example │ │ ├── controller │ │ ├── model │ │ └── service │ ├── resources │ │ └── applicationContext.xml // Spring 配置文件 │ └── webapp │ ├── WEB-INF │ │ ├── views // JSP 视图 │ │ └── web.xml // Servlet 配置 │ └── static // 静态资源(CSS, JS) └── test└── java
在 IDE 中创建 Maven Web 项目(archetype: maven-archetype-webapp),然后按以下步骤配置。
步骤 1: 引入 Maven 依赖
Spring MVC 需要核心的 spring-webmvc
模块,以及 Servlet API 支持。我们还引入 spring-context
确保 IoC 容器功能。以下是 pom.xml
配置:
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>spring-mvc-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><dependencies><!-- Spring MVC 核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.39</version></dependency><!-- Spring 核心依赖:IoC 容器 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.39</version></dependency><!-- Servlet API:Web 应用必需 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!-- JSP 支持:视图渲染 --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies><build><plugins><!-- Maven Tomcat 插件:运行 Web 应用 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path></configuration></plugin></plugins></build>
</project>
说明:
spring-webmvc
:包含 DispatcherServlet、控制器等核心组件。javax.servlet-api
:Servlet 规范,设为provided
避免打包到 WAR。jstl
:支持 JSP 页面动态渲染。- Tomcat 插件:便于本地运行,执行
mvn tomcat7:run
启动。 - 版本提示:Spring 6.x 需 JDK 17+,如用老项目,保持 5.x。
步骤 2: 配置 Web.xml 和 Spring MVC
Spring MVC 的核心是 DispatcherServlet
,它拦截请求并分发到控制器。我们需要配置 web.xml
和 Spring MVC 配置文件。
配置 web.xml
在 src/main/webapp/WEB-INF/web.xml
中配置 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"><!-- 配置 DispatcherServlet --><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:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 编码过滤器:处理中文乱码 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
要点:
DispatcherServlet
:Spring MVC 前端控制器,处理所有请求。contextConfigLocation
:指定 Spring 配置文件路径。CharacterEncodingFilter
:解决 POST 请求中文乱码问题。
配置 Spring MVC(applicationContext.xml)
在 src/main/resources/applicationContext.xml
中配置 MVC 组件:
<?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:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 扫描控制器包 --><context:component-scan base-package="com.example.controller"/><!-- 启用 MVC 注解支持 --><mvc:annotation-driven/><!-- 视图解析器:JSP --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean><!-- 静态资源处理 --><mvc:resources mapping="/static/**" location="/static/"/>
</beans>
解析:
<context:component-scan>
:扫描@Controller
注解的类。<mvc:annotation-driven>
:启用@RequestMapping
等注解。InternalResourceViewResolver
:将逻辑视图名映射为 JSP 文件(如user
映射为/WEB-INF/views/user.jsp
)。<mvc:resources>
:允许访问/static/
下的 CSS、JS 等。
步骤 3: 创建模型和控制器
模型类
定义简单的 User
模型(com.example.model.User
):
package com.example.model;public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}// Getters and Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
控制器类
创建 UserController
(com.example.controller.UserController
)处理请求:
package com.example.controller;import com.example.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping(value = "/list", method = RequestMethod.GET)public String listUsers(Model model) {// 模拟数据User user = new User("Alice", 25);model.addAttribute("user", user);return "user"; // 映射到 /WEB-INF/views/user.jsp}
}
说明:
@Controller
:标记为 Spring MVC 控制器。@RequestMapping
:映射 URL(如/user/list
)。Model
:传递数据到视图。
步骤 4: 创建 JSP 视图
在 src/main/webapp/WEB-INF/views/user.jsp
创建视图:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>User List</title><link rel="stylesheet" href="/static/css/style.css"/>
</head>
<body><h2>User Information</h2><p>Name: ${user.name}</p><p>Age: ${user.age}</p>
</body>
</html>
静态资源(可选)
在 src/main/webapp/static/css/style.css
添加样式:
body {font-family: Arial, sans-serif;margin: 20px;
}
h2 {color: #333;
}
步骤 5: 运行和测试
- 执行
mvn clean install
编译项目。 - 运行
mvn tomcat7:run
启动 Tomcat。 - 访问
http://localhost:8080/user/list
,应显示:User Information Name: Alice Age: 25
调试技巧:
- 404 错误:检查
web.xml
的 URL 映射或控制器路径。 - JSP 不渲染:确认视图解析器路径和 JSP 文件位置。
- 日志:添加
log4j
依赖查看详细日志。
进阶与最佳实践
- 注解优先:现代项目用
@RestController
替代 JSP,适合 REST API。 - Spring Boot 简化:用
@SpringBootApplication
自动配置,省去 XML。 - 拦截器:添加
HandlerInterceptor
处理认证、日志等。 - 异常处理:用
@ControllerAdvice
统一处理异常。 - 资源推荐:Spring 官网、书籍《Spring in Action》。实践多做 RESTful 示例。
总结
通过这个 Spring MVC 示例,你学会了配置 DispatcherServlet、控制器、视图解析器,并实现了一个简单的 Web 页面。XML 配置虽然稍显繁琐,但能帮助你理解 Spring MVC 的核心机制。