1. 概述

本文将快速构建一个基于 ServletJSP 的小型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层StudentStudentService
  • 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);
    }
}

关键逻辑解析

  1. 从请求中读取 id 参数
  2. 若存在 id,从Service获取 Student 对象
  3. 将数据存入 request 作用域
  4. 转发请求到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)提升效率,但理解基础实现原理依然重要。


原始标题:An MVC Example with Servlets and JSP