在这篇快速文章中,我们将使用基本的 Servlet 和 JSP 创建一个实现模型视图控制器 (MVC) 设计模式的小型 Web 应用程序。
在我们继续实现之前,我们将探讨一下 MVC 的工作原理及其关键特性。
模型-视图-控制器 (MVC) 是软件工程中用于将应用程序逻辑与用户界面分离的模式。顾名思义,MVC 模式分为三层。
Model 定义应用程序的业务层,Controller 管理应用程序的流程,View 定义应用程序的表示层。
尽管 MVC 模式并非特定于 Web 应用程序,但它非常适合这种类型的应用程序。在 Java 上下文中,模型由简单的 Java 类组成,控制器由 servlet 组成,视图由 JSP 页面组成。
以下是该模式的一些关键特征:
让我们来看看每一层。
这是包含系统业务逻辑的数据层,也代表了应用程序的状态。
它独立于表示层,控制器从模型层获取数据并将其发送到视图层。
控制器层充当视图和模型之间的接口。它接收来自视图层的请求并处理它们,包括必要的验证。
请求进一步发送到 Model 层进行数据处理,处理完毕后,将数据发送回 Controller,然后显示在 View 上。
该层代表应用程序的输出,通常是某种形式的 UI。表示层用于显示 Controller 获取的 Model 数据。
为了实现基于 MVC 设计模式的 Web 应用程序,我们将创建Student和StudentService类——它们将充当我们的模型层。
S tudentServlet类将充当控制器,对于表示层,我们将创建student-record.jsp页面。
现在,让我们一层一层地编写这些层,并从Student类开始:
public class Student {
private int id;
private String firstName;
private String lastName;
// constructors, getters and setters goes here
}
现在让我们编写我们的StudentService来处理我们的业务逻辑:
public class StudentService {
public Optional 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();
}
}
}
现在让我们创建我们的控制器类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);
}
}
这个 servlet 是我们 Web 应用程序的控制器。
首先,它从请求中读取参数id 。如果提交了id ,则从业务层获取一个Student对象。
一旦从模型中检索到必要的数据,它就会使用setAttribute()方法将此数据放入请求中。
最后,控制器将请求和响应对象转发给 JSP,即应用程序的视图。
接下来,让我们编写我们的表示层student-record.jsp:
Student Record
<%
if (request.getAttribute("studentRecord") != null) {
Student student = (Student) request.getAttribute("studentRecord");
%>
Student Record
ID: <%= student.getId()%>
First Name: <%= student.getFirstName()%>
Last Name: <%= student.getLastName()%>
<%
} else {
%>
No student record found.
<% } %>
当然,JSP 是应用程序的视图;它从控制器接收它需要的所有信息,它不需要直接与业务层交互。
在本教程中,我们了解了 MVC 即模型视图控制器架构,并且我们专注于如何实现一个简单的示例。
像往常一样,这里提供的代码可以在 GitHub 上找到。