1. 概述
本文将快速构建一个基于 Servlet 和 JSP 的小型Web应用,实现经典的 MVC(Model-View-Controller)设计模式。在动手实现前,我们先简单理解MVC的核心思想和关键特性。
2. MVC模式简介
MVC是软件工程中用于分离业务逻辑与用户界面的经典模式。顾名思义,它包含三个核心层:
Model(模型层):定义应用的业务逻辑
Controller(控制层):管理应用流程
View(视图层):定义表现层
虽然MVC并非专为Web应用设计,但在Java Web开发中尤为契合:
- ✅ Model层:普通Java类(POJO)
- ✅ Controller层:Servlet
- ✅ View层:JSP页面
2.1 模型层(Model)
这是数据层,包含:
- 系统的业务逻辑
- 应用的状态表示
它完全独立于表现层。Controller从Model获取数据后传递给View。
2.2 控制层(Controller)
作为View和Model的桥梁:
- 接收View层的请求
- 处理请求(含必要验证)
- 将请求转发给Model层处理
- 获取处理结果后返回给View展示
2.3 视图层(View)
负责应用输出,通常是UI界面:
- 展示Controller从Model获取的数据
- 不直接与业务层交互
3. 基于Servlet和JSP的MVC实现
我们将创建以下组件:
- Model层:
Student
和StudentService
类 - Controller层:
StudentServlet
类 - View层:
student-record.jsp
页面
3.1 模型层实现
先创建 Student
实体类:
public class Student {
private int id;
private String firstName;
private String lastName;
// 构造方法、getter和setter省略
}
再实现业务逻辑类 StudentService
:
public class StudentService {
public Optional<Student> getStudent(int id) {
switch (id) {
case 1:
return Optional.of(new Student(1, "John", "Doe"));
case 2:
return Optional.of(new Student(2, "Jane", "Goodall"));
case 3:
return Optional.of(new Student(3, "Max", "Born"));
default:
return Optional.empty();
}
}
}
3.2 控制层实现
创建 StudentServlet
作为控制器:
@WebServlet(
name = "StudentServlet",
urlPatterns = "/student-record")
public class StudentServlet extends HttpServlet {
private StudentService studentService = new StudentService();
private void processRequest(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String studentID = request.getParameter("id");
if (studentID != null) {
int id = Integer.parseInt(studentID);
studentService.getStudent(id)
.ifPresent(s -> request.setAttribute("studentRecord", s));
}
RequestDispatcher dispatcher = request.getRequestDispatcher(
"/WEB-INF/jsp/student-record.jsp");
dispatcher.forward(request, response);
}
@Override
protected void doGet(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
关键逻辑解析:
- 从请求中读取
id
参数 - 若存在
id
,从Service获取Student
对象 - 将数据存入
request
作用域 - 转发请求到JSP页面
3.3 视图层实现
创建 student-record.jsp
作为视图:
<html>
<head>
<title>学生记录</title>
</head>
<body>
<%
if (request.getAttribute("studentRecord") != null) {
Student student = (Student) request.getAttribute("studentRecord");
%>
<h1>学生记录</h1>
<div>ID: <%= student.getId()%></div>
<div>姓名: <%= student.getFirstName()%></div>
<div>姓氏: <%= student.getLastName()%></div>
<%
} else {
%>
<h1>未找到学生记录</h1>
<% } %>
</body>
</html>
视图层特点:
- ⚠️ 仅从Controller获取数据
- ❌ 不直接访问业务层
- ✅ 专注数据展示
4. 总结
本文通过一个简单示例展示了如何用 Servlet + JSP 实现MVC模式。核心要点:
- Model层:纯Java类处理业务逻辑
- Controller层:Servlet控制请求流程
- View层:JSP专注数据展示
完整代码可在 GitHub仓库 获取。实际开发中建议结合现代框架(如Spring MVC)提升效率,但理解基础实现原理依然重要。