В паттерне «Модель — представление — контроллер» модель представляет данные приложения и связанную с ними бизнес-логику. Модель может быть представлена одним объектом или сложным графом связанных объектов. В приложении для платформы Java ЕЕ данные инкапсулируются в объектах предметной области, часто развертываемых в EJB-модуле. Данные передаются в БД и из нее в объектах передачи данных (ОТО), и к ним обращаются с помощью объектов доступа к данным (ОАО).
Представление — это наглядное отображение содержащихся в модели данных.Подмножество модели содержится в отдельном представлении, таким образом, представление действует в качества фильтра для данных модели. Пользователь взаимодействует с данными модели с помощью предлагаемого представлением наглядного отображения и обращается к бизнес логике, которая, в свою очередь, воздействует на данные модели.
Контроллер связывает представление с моделью и управляет потоками данных приложения. Он выбирает, какое представление визуализировать для пользователя в ответ на вводимые им данные и в соответствии с выполняемой бизнес-логикой. Контроллер получает сообщение от представления и пересылает его модели. Модель, в свою очередь, подготавливает ответ и отправляет ero обратно контроллеру, где происходит выбор представления и отправка ero пользователю.
Паттерн MVC логически охватывает клиента и промежуточный уровень многоуровневой архитектуры. В среде Java ЕЕ модель располагается в бизнес-слое, обычно в виде ЕJВ-модуля.
Контроллер и представление расположены на веб-уровне. Представление, вероятнее всего, будет создано из JavaServer Faces(JSF) или JavaServer Pages(JSP) с помощью языка выражений (EL). Контроллер обычно представляет собой сервлет, получающий НТТР-запросы от пользователя.
Часто MVC сочетается с другими паттернами, такими как «Команда» (или «Действие»), «Стратегия», «Компоновщик» и «Наблюдатель«.
Впервые этот паттерн упоминался еще до создания Интернета в современном виде, в статье, опубликованной в декабре 1979 года работавшим тогда в компании Xeror SmallTalk-программистом Трюгве Реенскауг.
И хотя элементы MVC этого паттерна были описаны более 35 лет назад, они удивительно точно соответствуют современному их использованию в веб-приложениях.
Следующий рисунок показывает пользователя, выполняющего запрос к контроллеру. Контроллер обрабатывает запрос путем обновления модели и визуализации нового представления, которое затем отправляется пользователю.
Паттерн MVC существует в множестве разных форм. Две наиболее известные обычно называются тип I и тип II.
Типы паттерна MVC:
- MVC тип I. Этот тип представляет собой странично-ориентированный подход,при котором представление и контроллер существуют в виде одной сущности, именуемой «представление — контроллер». При этом подходе логика контроллера реализуется в представлении, таком кaк JSF. Все выполняемые контроллером задания, включая извлечение атрибутов и параметров НТТР-запроса, вызов бизнес-логики и управление НТТР-сеансом, встроены в представление с помощью скриптлетов и библиотек тегов. Тип I сильно связывает формирование представления с последовательностью выполняемых приложением действий, затрудняя тем самым сопровождение.
- MVC тип II. Проблемы с сопровождением в типе I преодолены в типе II благодаря вынесению логики контроллера из представления в сервлет, при этом визуализация данных остается представлению.
Главное различие между типом I и типом II — в местонахождении логики контроллера: в типе I она в представлении, а в типе II — в сервлете.
Многие фреймворки, такие как Spring MVC, Struts, Grails и Wicket, реализуют свою собственную версию паттерна MVC типа II. Например, Spring MVC включает концепцию сервлета-диспетчера, взаимодействующего с НТТР-запросами и выполняющего делегирование контроллеру, а также содержит представление (и преобразователь представления) и обработчики.
Следующий рисунок демонстрирует диаграмму реализации паттерна MVC в Spring.
Диаграмма реализации паттерна MVC в Spring