Лекция № 6. Типовые решения в WEB.

advertisement
Лекция № 6.
Типовые решения в WEB.
Типовые решения в WEB -приложениях.
Модель-вид-контролер (Model-View-Controller)
Распределяет обработку взаимодействия с пользовательским
интерфейсом между тремя участниками.
Первоначально это
Контроллер
Представление
типовое решение
появилось в конце 70-х
годов в качестве
инфраструктуры для
языка Smalltalk. Автором
решения является Тригве
Реенскауг (Trigve
Reenskaug)
Модель
Модель-вид-контролер (Model-View-Controller).
Принцип действия
В рамках этого типового решения подразумевается
выделение трех отдельных ролей:
1. Модель – это объект, представляющий некоторую
информацию о предметной области. В ООП наиболее
«чистой» формой модели является объект модели
предметной области. В качестве модели можно
рассматривать и сценарий транзакции, и модуль
таблицы , если они не содержат НИКАКОЙ логики,
связанной с пользовательским интерфейсом.
Модель-вид-контролер (Model-View-Controller).
Принцип действия
Вид (представление) отображает содержимое модели
средствами графического интерфейса. Функции вида
заключаются ТОЛЬКО в отображении информации на
экране.
3. Контроллер обрабатывает ВСЕ изменения
информации. Именно контроллер получает входные
данные от актера, выполняет операции над моделью и
оповещает виды об необходимости соответствующего
обновления.
В этом плане:
Графический интерфейс = виды + контроллер.
2.
Модель-вид-контролер (Model-View-Controller).
Принцип действия. Принципиальные разделения
Отделение вида от модели. Важно, так как:
1. Вид и модель относятся к совершенно разным сферам
разработки ПО. Разрабатывая вид – мы думаем о том, как
сделать работу актера наиболее удобной. При работе над
моделью основное внимание сосредоточено на бизнесправилах и, возможно, на механизмах взаимодействия с
уровнем постоянного хранения данных.
Заметим,
во-первых, для разработки этих классов применяются
разный АБСОЛЮТНО разные библиотеки. А,
во-вторых, в настоящий момент увы разработчики
обычно специализируются ТОЛЬКО в одной из этих
областей.
Модель-вид-контролер (Model-View-Controller).
Принцип действия. Принципиальные разделения
Обычно в рамках одного и того же приложения, в
зависимости от ситуации, одна и та же информация
должна отображаться РАЗНЫМИ способами. Если
разделить вид и модель, то можно спокойно
разрабатывать для одного и того же класса модели
несколько видов, точнее несколько разных (иногда
АБСОЛЮТНО разных) интерфейсов.
3. Объекты без визуального интерфейса просто напросто
легче тестировать, чем объекты с интерфейсом. Без
представлений можно легко оттестировать ВСЮ логику
домена обычными сценариями … В качестве
альтернативы попробуйте написать сценарии для логики с
интерфейсом.
2.
Модель-вид-контролер (Model-View-Controller).
Принцип действия. Принципиальные разделения
Ключевой момент этого разделения – НАПРАВЛЕНИЕ
зависимости: виды зависят от модели, а вот модель не
зависит от своих видов. Разработчики представления не
должны заботиться о том какие виды будут использоваться.
Плюсы:
Модель намного проще разрабатывать,
Можно легко добавлять новые виды и менять старые.
Минусы: проблема с толстым клиентом и MDI-интерфейсом
(или его аналогом). Окон-видов может быть МНОГО и на
экране одновременно могут находиться несколько видов
одной и той же модели. Актер меняет модель в рамках
одного вида нужно отображать эти изменения в других видах,
а модель не подозревает об их существовании. Чтобы
избежать в этом случае двунаправленной зависимости
используется типовое решение Observer. Виды будут
«наблюдателями» за моделью.
Модель-вид-контролер (Model-View-Controller).
Принцип действия. Принципиальные разделения
Отделение контроллера от вида. Не сильно важно, но:
Классический пример: Необходимо поддерживать
редактируемое и нередактируемое поведение для одного
вида. Это можно сделать, если для одного вида
определить пару контроллеров-стратегий, которые и будут
использоваться видом.
Необходимость этого разделения весьма полезна именно
в WEB приложениях, в приложениях с толстым GUI
интерфейсом такое деление обычно не проводится.
Представление данных в WEB.
Контроллер страницы (Page Controller)
Объект, который инкапсулирует запрос к конкретной Webстранице или выполнение конкретного действия на Web-сайте.
Модель
•Предоставляет логику
домена
•Обрабатывает адрес
URL и извлекает из него
входные данные,
Контроллер страницы
•Выбирает модель и
представление
Представление
•Отображает HTML код
Контроллер страницы (Page Controller).
Принцип действия.
Идея: Создается компонент, который играет роль
контроллера для каждой страницы Web-сайта.
Теоретически каждой странице свой контроллер,
практически не странице, а каждому действию.
Контроллер страницы может быть реализован в виде
сценария (сценария CGI, сервлета и т.д.) или
серверной страницы (ASP, JSP, PHP и т.д.) Во
втором случае обычно получается, что в рамках
одной серверной страницы необходимо использовать
представление по шаблону и контроллер страницы.
Это не есть хорошо.
Возможные решения проблемы: вспомогательные
объект, реализация обработчика и контроллера в
виде сценария.
Контроллер страниц необязательно должен быть
ОДНИМ классом.
Контроллер страницы (Page Controller).
Принцип действия.
Основные обязанности контроллер страниц:
 проанализировать адрес URL и извлечь данные,
которые актер вводил в соответствующие формы,
чтобы собрать все сведения необходимые для
выполнения действий.
 Создать объекты модели и вызвать их методы,
необходимые для обработки данных. Все нужные
данные из HTTP-запроса должны быть переданы
модели, чтобы ее объекты были ПОЛНОСТЬЮ
независимы от самого запроса.
Определить представление, которое должно быть
использовано для представления результатов, и
передать ему необходимую информацию,
полученную от модели.
Контроллер страницы (Page Controller).
Принцип действия.
Обратите внимание: одни адреса URL можно
обрабатывать с помощью серверных страниц, а
другое с помощью сценариев. Если логики
контроллера практически нет, то вполне сойдет
просто серверная страница, а если много … то
сценарий.
Назначение: Выбор способа обработки запросов:
контроллер страниц или контроллер запросов?
более прост в работе.
представляет собой естественный способ
структуризации (одна страница/ одно действие) один
контролер.
хорош для сайтов с простой логикой контроллера.
Простые страницы обрабатываются с помощью
серверных страниц, более сложные с помощью
вспомогательных объектов.
Представление данных в WEB.
Контроллер запросов (Front Controller)
Контроллер, который обрабатывает все запросы к Web-сайту.
Обработчик
Абстрактная команда
doGet()
doPost()
process()
Конкретная команда 1
process()
Конкретная команда 2
process()
Контроллер запросов (Front Controller).
Принцип действия.
Идея: Контроллер запросов обрабатывает все
запросы, поступающие на Web-сайт, распределяя их
выполнение посредством единственного объекта
обработчика. Этот класс реализует общее
поведение, которое может быть изменено
динамически с помощью декораторов . И, чаще
всего, состоит из двух частей:
Web-обработчик – это объект, который выполняет
фактическое получение POST или GET запросов ,
поступивших на Web-сервер. Он извлекает всю
необходимую информацию из адреса URL и входных
данных запроса, после чего решает какое действие
необходимо инициировать и задействует вторую
часть.
Иерархия команд.
Контроллер запросов (Front Controller).
Принцип действия.
:Конкретная команда
:Обработчик
Обработать HTTP-запрос get
doGet()
Создать на основе параметров запроса
process
Контроллер запросов (Front Controller).
Принцип действия.
Web-обработчик реализуется в виде класса, а не
страницы сервера, так как он не генерирует никаких
откликов.
Команды также являются классами, а не страницами
сервера. Более того они могут не знать о наличии
web-окружения, хотя они получают параметры HTTP.
Выбор команды можно делать статически или
динамически. Преимущества статики –
использование явного кода, проверки времени
компиляции и высокая гибкость написания адресов.
Динамический позволяет добавлять новые команды
не меняя кода, можно передавать имя команды в
качестве параметра или через файл настроек.
Контроллер запросов (Front Controller).
Назначение.
Web-сервер настраивается ТОЛЬКО на один
контроллер запросов, что значительно упрощает
конфигурирование.
2. Динамическое добавление команд без какихлибо изменений и переносимость.
3. Поведение контроллера можно легко менять
динамически, если использовать декораторы.
Последнее в принципе оба решения по написанию
контроллеров не конкуренты, т.е. можно в одном
приложении использовать ОБА, там где нужно.
1.
Download