Перейти к основному содержимому

Пример MVC с сервлетами и JSP

· 4 мин. чтения

1. Обзор

В этой быстрой статье мы создадим небольшое веб-приложение, реализующее шаблон проектирования Model View Controller (MVC) с использованием базовых сервлетов и JSP.

Прежде чем перейти к реализации, мы немного рассмотрим, как работает MVC и его основные функции.

2. Введение в MVC

Model-View-Controller (MVC) — это шаблон, используемый в разработке программного обеспечения для отделения логики приложения от пользовательского интерфейса. Как следует из названия, шаблон MVC состоит из трех слоев.

Модель определяет бизнес-уровень приложения, Контроллер управляет потоком приложения, а Представление определяет уровень представления приложения.

Хотя шаблон MVC не является специфичным для веб-приложений, он очень хорошо подходит для этого типа приложений. В контексте Java Модель состоит из простых классов Java, Контроллер состоит из сервлетов, а Представление состоит из страниц JSP.

Вот некоторые ключевые особенности шаблона:

  • Он отделяет уровень представления от бизнес-уровня.
  • Контроллер выполняет действие по вызову модели и отправке данных в представление.
  • Модель даже не знает, что она используется каким-то веб-приложением или настольным приложением.

Давайте посмотрим на каждый слой.

2.1. Слой модели

Это уровень данных, который содержит бизнес-логику системы, а также представляет состояние приложения.

Это не зависит от уровня представления, контроллер извлекает данные из уровня модели и отправляет их на уровень представления.

2.2. Уровень контроллера

Уровень контроллера действует как интерфейс между представлением и моделью. Он получает запросы от уровня просмотра и обрабатывает их, включая необходимые проверки.

Запросы далее отправляются на уровень модели для обработки данных, и после их обработки данные отправляются обратно в контроллер, а затем отображаются в представлении.

2.3. Слой просмотра

Этот уровень представляет результат работы приложения, обычно некую форму пользовательского интерфейса. Уровень представления используется для отображения данных модели, полученных контроллером.

3. MVC с сервлетами и JSP

Чтобы реализовать веб-приложение на основе шаблона проектирования MVC, мы создадим классы 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<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();
}
}
}

Теперь давайте создадим наш класс Controller 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);
}
}

Этот сервлет является контроллером нашего веб-приложения.

Во- первых, он считывает идентификатор параметра из запроса. Если идентификатор отправлен, объект Student извлекается из бизнес-уровня.

Как только он получает необходимые данные из Модели, он помещает эти данные в запрос, используя метод setAttribute() .

Наконец, контроллер перенаправляет объекты запроса и ответа в JSP, представление приложения.

Далее давайте напишем наш слой презентации student-record.jsp :

<html>
<head>
<title>Student Record</title>
</head>
<body>
<%
if (request.getAttribute("studentRecord") != null) {
Student student = (Student) request.getAttribute("studentRecord");
%>

<h1>Student Record</h1>
<div>ID: <%= student.getId()%></div>
<div>First Name: <%= student.getFirstName()%></div>
<div>Last Name: <%= student.getLastName()%></div>

<%
} else {
%>

<h1>No student record found.</h1>

<% } %>
</body>
</html>

И, конечно же, JSP — это представление приложения; он получает всю необходимую информацию от контроллера, ему не нужно напрямую взаимодействовать с бизнес-уровнем.

4. Вывод

В этом руководстве мы узнали об архитектуре MVC, т.е. контроллера представления модели, и сосредоточились на том, как реализовать простой пример.

Как обычно, представленный здесь код можно найти на GitHub .