logo
5 модуль

16.4. Реализация шаблона Модель-Представление-Контроллер в веб-приложениях

В веб-приложениях на Java технологически разделение ролей в соответствии с шаблоном Модель-Представление-Контроллер происходит следующим образом:

Пошагово, выполнение кода веб-приложения от момента получения запроса до возвращения результата, укладывается в следующую схему:

  1. Сервлет получает запрос.

  2. Сервлет выполняет некоторую обработку, в т. ч. обращается к модели, инициируя необходимые изменения, либо запрашивая необходимые данные.

  3. Сервлет сохраняет результаты, которые необходимо отобразить в переменной request (или session) с помощью метода setAttribute и вызывает с помощью RequestDispatcher JSP-страницу.

  4. JSP-страница генерирует HTML-документ, используя переданые ей данные

  5. и отсылает ответ.

Интерфейс RequestDispatcher имеет два метода:

Существуют специализированные библиотеки, помогающие реализовать шаблон Модель-Представление-Контроллер для веб-приложений. Примеры таким библиотек: Apache Struts, Spring MVC и Tapestry для Java, CakePHP и Symfony для PHP.

Следует обратить внимание на то, что сервлет не должен содержать логику обработки данных, являющуюся частью предметной области, или код для сохранения данных в СУБД. Сервлет включает только обслуживающие операции, такие, как обработка пришедших в запросе параметров, обращение к слою модели с передачей или получением нужных данных, выбор подходящего представления и отображение данных с помощью этого представления.

Представление, в свою очередь, не должно содержать никакой логики, кроме презентационной. При использовании JSP рекомендуется отказаться от написания кода в скриптлетах, так как они затрудняет восприятие и разработку шаблона, а использовать вместо этого библиотеки тегов. В рамках курса библиотеки тегов подробно не рассматриваются, поэтому для простоты используются скриптлеты.

Рассмотрим простой пример: пусть по запросу пользователя требуется вывести список студентов.

В этом случае, процедура получения списка студентов относится к бизнес-логике приложения, а в смысле термина шаблона Модель-Представление-Контроллер к модели, и, следовательно, должен существовать некий класс с методом, возвращающим список студентов (реализация метода нам в данном случае не важна). Например, это может быть сервисный класс:

public class Services {

public Collection<Student> getStudents() {

// реализация не важна

}

}

В качестве представления создадим JSP-страницу students.jsp, которая получает доступ к коллекции через обращение к объекту request и на основе ее осуществляет генерацию HTML-документа. Часть JSP-страницы, непосредственно относящаяся к выводу данных, может быть такой:

<% Collection<Student> students = (Collection<Student>) request.getAttribute("students"); %>

<ul>

<%for (Student student : students) {%>

<li><%=student.getFullName()%></li>

<%}%>

</ul>

Сервлет, выполняющий функцию контроллера, будет содержать следующую логику: запросить коллекцию объектов у сервисного класса, опубликовать ее в объекте request и передать управление странице students.jsp для генерации ответа. В приведенном фрагменте кода сервлета при возникновении исключительной ситуации управление передается другому представлению — странице error.jsp, которая выводит сообщение об ошибке.

String view = "students.jsp";

try {

Collection<Student> students = services.getStudents();

request.setAttribute("students", students);

} catch (ApplicationException e) {

view = "error.jsp";

request.setAttribute("error",

"Произошла ошибка. Обратитесь в службу сервиса.");

}

request.getRequestDispatcher(view).forward(request, response);

Архитектура MVC практически всегда применяется при реализации достаточно больших веб-приложений, в частности, ей следует большинство современных CMS.