
87
3. двухэтапное преобразование (two step view) предполагает использование двух стадий: вначале
на основе данных домена формируется логическая структура (включая поля ввода, верхние и
нижние колонтитулы, таблицы, переключатели и т.д.), которая затем трансформируется в код
HTML. Методам второго этапа известно, какие элементы входят в логическую структуру и как
визуализировать каждый из них. В этом
случае, при необходимости, глобальные изменения
внешнего вида Web-сайта могут быть осуществлены только переработкой второго этапа
преобразования, что повышает эффективность данного типового решения с точки зрения
удобства переработки графического интерфейса.
В большинстве случаев двухэтапное преобразование используется для обеспечения доступа к
web-контенту с помощью разнообразных обозревателей или когда необходимо поддерживать
нескольких вариантов
внешнего вида одного web-сайта, например, стационарной и «мобильной»
версий.
Контроллер MVC-модели выполняет обработку и диспетчеризацию HTTP-запросов.
Наибольшее распространение получили два следующих типовых решения:
1. при использовании паттерна «контроллер страниц» (page controller) задачи обработки HTTP-
запросов и принятия решения о ее перенаправлении разделяются между собой. Функциями
контроллера страниц являются:
a. сбор сведений для
выполнения запроса: анализ URL и извлечение данных, введенных
пользователем в соответствующие формы;
b. создание объектов модели и вызов их методов, необходимых для обработки данных.
При этом все необходимые данные должны быть переданы модели из HTTP-запроса;
c. определение представления, которое должно быть использовано для отображения
результатов и передача ему необходимой информации, полученной
от модели.
Контроллер страниц может быть реализован в виде сценария (CGI, сервлета и т.п.) или страницы
сервера (ASP, PHP, JSP и т.п.). Использование страницы сервера обычно предполагает сочетание
в одном файле контроллера страниц и представления по шаблону.
Как правило, контроллер страниц применяется для сайтов с достаточно простой логикой
котроллера, поскольку предполагает наличие отдельного
контроллера для каждой логической
страницы Web-сайта. Если сайт имеет сложную структуру, а также, если предъявляются
специальные требования к проверке безопасности, обеспечению интернационализации или
открытию специальных представлений для особых категорий пользователей, то использование
котроллеров страниц приводит к дублированию кода. Дублирование кода можно избежать двумя
способами: (i) посредством вынесения общей логики контроллеров в
служебные классы, которые
составят супертип слоя
5
; (ii) посредством использования типового решения контроллер
запросов.
2. контроллер запросов (front controller) предполагает использование единственного объекта,
предназначенного для обработки всех запросов, но включает в свой состав две части:
a. web-обработчик – объект, который выполняет фактическое получение POST- и GET-
запросов, поступивших на web-сервер. Он извлекает необходимую информацию из
URL и входных данных запроса, после чего
решает, какое действие необходимо
инициировать, и делегирует его выполнение соответствующей команде.
b. иерархия команд из числа которых web-обработчиком статически или динамически
выбирается необходимая команда для обработки поступившего запроса. Статический
выбор команды подразумевает проведение синтаксического анализа адреса URL и
применение условной логики, а динамический – извлечение некоторого стандартного
фрагмента адреса URL и динамическое создание экземпляра
класса команды.
Web-обработчик интерпретирует полученный адрес URL и создает отдельный объект для
дальнейшего обслуживания запроса. Таким образом удается централизовать деятельность по
обработке всех HTTP-запросов в рамках единого объекта и избежать необходимости изменения
конфигурации web-сервера в случае модификации функционала сайта.
Кроме того, контроллер запросов хорошо сочетается с типовым решением
перехватывающий фильтр, который
представляет собой декоратор
6
, выступающий в роли
5
Супертип слоя (layer supertype) используется тогда, когда все объекты соответствующего слоя имеют
некоторые общие свойства или поведение. В этом случае рекомендуется создать суперкласс для всех объектов
слоя и вынести в него все общие методы для того, чтобы не дублировать их в объектах слоя.
6
Декоратор – это паттерн, позволяющий динамически возлагать на объект новые функции.