Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 модуль.docx
Скачиваний:
19
Добавлен:
02.11.2018
Размер:
186.24 Кб
Скачать

16.3. Шаблон проектирования Модель-Представление-Контроллер

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

В архитектуре MVC выделяются три слоя и разграничиваются их полномочия следующим образом:

  • Модель — данные и бизнес-логика приложения (слой модели или слой сервисов).

  • Представление — визуальное представление приложения (в случае веб-приложения, HTML-страницы), включая вспомогательные классы и файлы, используемые для отображения модели в некотором конкретном виде. Приложение может поддерживать несколько представлений, например: стандартный пользовательский интерфейс, упрощенный пользовательский интерфейс, XML-представление и др.

  • Контроллер — интерпретирует и обрабатывает запросы, приходящие от представления, инициирует необходимые изменения модели и передает управление подходящему представлению.

Шаблон постулирует, что модель, представление и контроллер — это отдельные компоненты, причем модель не должна зависеть ни от контроллера, ни от представления.

На приведенной схеме стрелками обозначены зависимости одного компонента шаблона от другого:

Главное в шаблоне Модель-Представление-Контроллер:

  • независимость модели от контроллера и представления;

  • отделение представления от контроллера.

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

Благодаря такому разделению возможно 1) поддерживать несколько представлений для одной модели; 2) не засорять модель интерфейсным кодом, не соответсвующим ее сущности; 3) оставить в коде представления только презентационную логику.

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

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

  • контроллер — это обычно сервлет;

  • модель — это набор классов, реализующих логику приложения;

  • представление — это набор страниц-шаблонов (например, JSP-страницы или страницы на языке шаблонов Velocity).

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

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

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

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

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

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

Интерфейс 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]