什么是 MVC 模式?
我们要理解 MVC 本身,MVC 是一种软件设计架构模式,旨在将应用程序分为三个相互关联的部分,以提高代码的可维护性、可重用性和可扩展性。

-
M - Model (模型):
- 职责: 负责数据和业务逻辑,它代表应用程序的状态和数据。
- 实体类、数据访问层、业务服务层等,它不关心数据如何显示或如何接收用户输入。
- 例如: 一个
User类,包含id,name,email等属性,以及一个UserService类,负责处理用户注册、登录等业务逻辑。
-
V - View (视图):
- 职责: 负责数据显示,它是用户看到并与之交互的界面。
- JSP (JavaServer Pages)、Thymeleaf、FreeMarker 模板等,它主要负责展示从 Model 传递过来的数据。
- 例如: 一个
userList.jsp页面,从 Controller 接收到用户列表数据,然后通过 HTML/JSTL 标签将它们渲染成表格。
-
C - Controller (控制器):
- 职责: 负责接收用户请求,调用 Model 处理业务逻辑,然后选择合适的 View 返回给用户,它是 Model 和 View 之间的协调者。
- Servlet 或框架提供的控制器类(如 Spring MVC 的
@Controller)。 - 例如: 一个
UserController,它有一个listUsers()方法,该方法调用UserService获取用户列表,然后将数据存入Model,并返回逻辑视图名(如 "userList"),由视图解析器找到对应的 JSP 页面进行渲染。
工作流程:

- 用户通过浏览器发送请求(如访问
/users)。 - DispatcherServlet (前端控制器,Spring MVC 的核心) 接收请求。
- HandlerMapping (处理器映射器) 根据请求 URL 找到对应的 Controller 方法。
- Controller 调用 Model (Service/DAO) 处理业务逻辑,获取数据。
- Controller 将数据存入 Model 对象,并返回一个逻辑视图名。
- ViewResolver (视图解析器) 根据逻辑视图名找到实际的 View 文件。
- View 使用 Model 中的数据进行渲染,生成 HTML。
- DispatcherServlet 将最终的 HTML 响应返回给浏览器。
主流的 Java Web MVC 框架
虽然你可以用原生 Servlet 实现 MVC,但非常繁琐,现在业界几乎都使用成熟的框架来简化开发。
Spring MVC (最主流)
Spring MVC 是 Spring Framework 的一部分,是目前 Java Web 开发领域绝对的主流,它功能强大,生态完善,与 Spring Boot、Spring Security 等其他 Spring 项目无缝集成。
- 核心注解:
@Controller: 标记一个类为控制器。@RequestMapping: 映射 HTTP 请求到特定的处理方法(可以作用于类或方法上)。@GetMapping,@PostMapping,@PutMapping,@DeleteMapping:@RequestMapping的简化版,用于处理特定的 HTTP 方法。@RequestParam: 绑定请求参数到方法参数。@PathVariable: 绑定 URL 模板变量到方法参数。@ModelAttribute: 绑定请求参数到 Model 对象。@ResponseBody: 将方法的返回值直接作为 HTTP 响应体返回,常用于返回 JSON/XML 数据(开发 RESTful API 的核心)。@RequestBody: 将 HTTP 请求体中的 JSON/XML 数据绑定到方法参数的对象上。
Jakarta MVC (较新,由 Eclipse 基金会维护)
这是 Java EE(现在是 Jakarta EE)官方的 MVC 规范,旨在提供一个标准化的、轻量级的 MVC 解决方案,作为传统 JSF 的替代品,它更接近于传统的 Servlet API 编程方式。
- 特点: 语法更接近原生 Servlet,使用注解如
@Controller,@GET,@POST,@PathParam等。 - 现状: 虽然是官方标准,但目前社区和生态远不如 Spring MVC,采用率较低。
其他框架
- Struts 2: 曾经非常流行(尤其是 Struts 1 之后),但现在市场份额已经大幅下降,逐渐被 Spring MVC 取代。
- Play Framework: 一个现代化的、无状态的 Web 框架,强调“约定优于配置”,但在中国大陆使用较少。
对于新项目,首选 Spring MVC,通常与 Spring Boot 结合使用,可以极大地简化项目配置和部署。
一个典型的 Spring MVC 项目结构 (Maven)
一个标准的 Maven Java Web 项目结构如下:
my-web-app
├── src
│ ├── main
│ │ ├── java # Java 源代码
│ │ │ └── com
│ │ │ └── example
│ │ │ └── demo
│ │ │ ├── controller # 控制器层
│ │ │ │ └── HelloController.java
│ │ │ ├── model # 模型层 (实体类)
│ │ │ │ └── User.java
│ │ │ ├── service # 服务层 (业务逻辑)
│ │ │ │ └── UserService.java
│ │ │ └── DemoApplication.java # Spring Boot 启动类
│ │ │
│ │ ├── resources # 配置文件和静态资源
│ │ │ ├── application.properties # Spring Boot 配置文件
│ │ │ ├── static # 静态资源 (CSS, JS, images)
│ │ │ └── templates # 模板文件 (Thymeleaf, FreeMarker 等)
│ │ │ └── hello.html
│ │ │
│ │ └── webapp # 传统 Web 应用目录 (JSP 等)
│ │ ├── WEB-INF
│ │ │ └── views # JSP 文件存放地
│ │ │ └── welcome.jsp
│ │ └── index.html
│ │
│ └── test # 测试代码
│ └── java
│ └── com
│ └── example
│ └── demo
│ └── ...
│
├── pom.xml # Maven 项目构建文件
└── README.md
实践:使用 Spring Boot 创建一个简单的 MVC 项目
这里我们以最流行的 Spring Boot + Spring MVC + Thymeleaf 组合为例,创建一个“Hello, World!”项目。
步骤 1: 创建项目
使用 Spring Initializr (Web 官方项目生成器) 是最快的方式。
- Project: Maven Project
- Language: Java
- Spring Boot: 选择一个稳定版本 (如 3.x.x)
- Project Metadata: 填写 Group, Artifact, Name 等。
- Dependencies:
Spring Web: 提供 Spring MVC 和嵌入式 Tomcat 服务器。Thymeleaf: 强大的现代模板引擎,用于替代 JSP。Spring Boot DevTools: 开发时热部署工具。
点击 "Generate" 下载项目压缩包,并用你的 IDE (如 IntelliJ IDEA 或 Eclipse) 打开。
步骤 2: 编写 Controller
在 src/main/java/com/example/demo/controller 目录下创建 HelloController.java。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; // 用于向视图传递数据
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
// @GetMapping 表示处理 GET 请求,"/hello" 是请求的 URL 路径
@GetMapping("/hello")
public String hello(Model model) {
// 向 Model 中添加一个名为 "message" 的属性,值为 "Hello from Spring MVC!"
model.addAttribute("message", "Hello from Spring MVC!");
// 返回一个字符串 "hello",这个字符串会被 Thymeleaf 视图解析器
// 解析为 "templates/hello.html" 这个模板文件
return "hello";
}
}
步骤 3: 编写 View (Thymeleaf 模板)
在 src/main/resources/templates 目录下创建 hello.html 文件。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">Hello Page</title>
</head>
<body>
<h1>Welcome to our application!</h1>
<!-- 使用 Thymeleaf 的语法来显示 Controller 传来的 message 数据 -->
<p th:text="${message}"></p>
</body>
</html>
xmlns:th="http://www.thymeleaf.org": 声明 Thymeleaf 命名空间。th:text="${message}": 这是 Thymeleaf 的核心语法,意思是“将变量message的值显示在这个<p>标签内”。
步骤 4: 运行和测试
- 找到
src/main/java/com/example/demo/DemoApplication.java文件,右键点击 "Run"。 - Spring Boot 会启动一个内置的 Tomcat 服务器,默认运行在
8080端口。 - 打开你的浏览器,访问
http://localhost:8080/hello。 - 你将看到页面显示 "Welcome to our application!" 和 "Hello from Spring MVC!"。
进阶:开发 RESTful API
现代 Web 开发中,前后端分离是主流,后端通常只提供数据接口(API),前端负责渲染页面,这时,Controller 就不再返回视图名,而是直接返回 JSON 数据。
修改 Controller 以返回 JSON
假设我们有一个 User 实体类:
// src/main/java/com/example/demo/model/User.java
package com.example.demo.model;
public class User {
private Long id;
private String name;
private String email;
// 构造器、Getter 和 Setter 方法
// ...
}
修改 HelloController,添加一个提供用户信息的 API 端点:
// src/main/java/com/example/demo/controller/HelloController.java
package com.example.demo.controller;
import com.example.demo.model.User;
import org.springframework.web.bind.annotation.*;
// 使用 @RestController,它相当于 @Controller + @ResponseBody
// 标记为该类的所有方法都会返回 JSON/XML 数据,而不是视图名
@RestController
@RequestMapping("/api") // 为该控制器下的所有路径添加 /api 前缀
public class HelloController {
// ... 之前的 hello 方法可以保留或删除 ...
@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") Long id) {
// 模拟从数据库或服务层获取数据
User user = new User();
user.setId(id);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
// Spring Boot 会自动将 Java 对象转换成 JSON 格式并返回
return user;
}
}
测试 API
- 确保你的 Spring Boot 应用正在运行。
- 使用 Postman、Apifox 或浏览器访问
http://localhost:8080/api/users/1。 - 你将收到如下 JSON 响应:
{ "id": 1, "name": "John Doe", "email": "john.doe@example.com" }
| 特性 | 描述 |
|---|---|
| 核心模式 | MVC (Model-View-Controller),将业务逻辑、数据和表现层分离。 |
| 主流框架 | Spring MVC 是绝对的主流,通常与 Spring Boot 结合使用以简化开发。 |
| 核心组件 | DispatcherServlet (前端控制器)、HandlerMapping、Controller、Model、ViewResolver、View。 |
| 视图技术 | JSP (传统)、Thymeleaf (现代推荐,功能强大)、FreeMarker。 |
| API 开发 | 使用 @RestController 和 @ResponseBody (或直接使用 @RestController) 来返回 JSON/XML 数据,构建 RESTful API。 |
| 项目构建 | Maven 或 Gradle 是标准的构建工具。 |
掌握 Java Web MVC,特别是 Spring MVC,是成为一名合格 Java Web 开发者的必备技能,从理解其核心思想开始,通过动手实践(如创建一个项目、写一个 Controller、连接数据库等)来逐步深入,你会发现它其实非常清晰和强大。
