16.4. Реализация шаблона Модель-Представление-Контроллер в веб-приложениях
В веб-приложениях на Java технологически разделение ролей в соответствии с шаблоном Модель-Представление-Контроллер происходит следующим образом:
-
контроллер — это обычно сервлет;
-
модель — это набор классов, реализующих логику приложения;
-
представление — это набор страниц-шаблонов (например, JSP-страницы или страницы на языке шаблонов Velocity).
Пошагово, выполнение кода веб-приложения от момента получения запроса до возвращения результата, укладывается в следующую схему:
-
Сервлет получает запрос.
-
Сервлет выполняет некоторую обработку, в т. ч. обращается к модели, инициируя необходимые изменения, либо запрашивая необходимые данные.
-
Сервлет сохраняет результаты, которые необходимо отобразить в переменной request (или session) с помощью метода setAttribute и вызывает с помощью RequestDispatcher JSP-страницу.
-
JSP-страница генерирует HTML-документ, используя переданые ей данные
-
и отсылает ответ.
Интерфейс RequestDispatcher имеет два метода:
-
include добавляет содержимое ресурса (в данном случае, JSP-страницы) в ответ, генерируемый сервлетом;
-
forward перенаправляет выполнение запроса на ресурс, который и генерирует ответ.
Существуют специализированные библиотеки, помогающие реализовать шаблон Модель-Представление-Контроллер для веб-приложений. Примеры таким библиотек: 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.
- Раздел 16. Многоуровневые и многослойные приложения. Шаблон проектирования Модель-Представление-Контроллер
- 16.1. Многоуровневые приложения
- 16.2. Многослойные приложения
- 16.3. Шаблон проектирования Модель-Представление-Контроллер
- 16.4. Реализация шаблона Модель-Представление-Контроллер в веб-приложениях
- Раздел 17. Базы данных в веб-приложениях
- 17.1. Основные понятия баз данных
- 17.2. Системы управления базами данных
- 17.3. Язык запросов sql
- Транзакции
- 17.4. Доступ к базам данных из Java
- Пример: база данных студентов
- Поддержка транзакций
- 17.5. Объектно-реляционная проекция
- Лекция 18. Безопасность Интернет-приложений
- 18.1. Аутентификация и авторизация
- 18.2. Понятие безопасности Интернет-приложений
- 18.3. Классы атак сетевого уровня Сниффинг пакетов
- Подмена ip-адреса
- Отказ в обслуживании
- Сетевая разведка
- 18.4. Криптографические технологии
- 18.5. Уязвимости уровня приложений
- Уязвимости системы аутентификации
- Уязвимости системы авторизации
- Атаки на стороне клиента
- Выполнение кода на сервере
- Разглашение информации
- Злоупотребление функциональными возможностями
- Наиболее распространенные уязвимости
- 18.6. Резюме