Этот материал — часть цикла “Введение в Enterprise-разработку”. Предыдущие статьи:
В этом материале мы познакомимся с тобой с такой штукой как MVC. Поговорим о том, что такое MVC, затронем историю его создания, разберемся с основными идеями и концепциями, заложенными в MVC, рассмотрим пошагово, как разбить приложение на модули Модель, Вид, Контроллер, а также напишем небольшое веб приложение на Spring-Boot, и на примере Spring-MVC посмотрим как данные передаются из Java кода в html страницы.
Чтобы понять этот материал, тебе нужно быть знакомым с шаблонами проектирования, особенно с Наблюдателем (Observer) и Фасадом (Facade). Быть знакомым с HTTP запросами и ответам, понимать основы html, знать, что такое аннотации в Java.
Усаживайся поудобнее, заваривай чай, готовь десерт, салат, второе и первое. Мы начинаем.
Из всего этого можно сделать вполне логичный вывод. Сложную систему нужно разбивать на модули.
Опишем кратко шаги, как можно добиться подобного разделения.
![Часть 7. Знакомство с паттерном MVC (Model-View-Controller) - 3]()
Итак, у нас появилось приложение из трех модулей, которые называются Модель, Вид и Контроллер.
Резюмируем:
![Часть 7. Знакомство с паттерном MVC (Model-View-Controller) - 6]()
- о сети;
- об архитектуре ПО;
- о протоколах HTTP/HTTPS;
- об основах Maven;
- о сервлетах (пишем простое веб-приложение);
- о контейнерах сервлетов.
![Часть 7. Знакомство с паттерном MVC (Model-View-Controller) - 1](https://cdn.javarush.com/images/article/06cb2597-79ad-4dba-842e-380150d549db/original.jpeg)
История создания MVC
Идеи MVC сформулировал Трюгве Реенскауг (Trygve Reenskaug) во время работы в Xerox PARC в конце 70-х годов. В те времена для работы с ЭВМ было не обойтись без ученой степени и постоянного изучения объемной документации. Задача, которую Реенскауг решал совместно с группой очень сильных разработчиков, заключалась в том, чтобы упростить взаимодействие рядового пользователя с компьютером. Необходимо было создать средства, которые с одной стороны были бы предельно простыми и понятными, а с другой — давали бы возможность управлять компьютером и сложными приложениями. Реенскауг работал в команде, которая занималась разработкой портативного компьютера "для детей всех возрастов" — Dynabook, а также языка SmallTalk под руководством Алана Кея (Alan Kay). Именно тогда и там закладывались понятия дружелюбного интерфейса. Работа Реенскауга совместно с командой во многом повлияла на развитие сферы IT. Приведем интересный факт, который не относится к MVC напрямую, но иллюстрирует значимость тех разработок. В 2007 году после презентации Apple iPhone, Алан Кей сказал: “Когда вышел Macintosh, в Newsweek спросили, что я о нем думаю. Я сказал: это первый персональный компьютер, достойный критики. После презентации Стив Джобс подошел и спросил: достоин ли iPhone критики? И я ответил: сделайте его размером пять на восемь дюймов, и вы завоюете мир”. Спустя 3 года, 27 января 2010 года, Apple представила iPad диагональю 9,7 дюйма. То есть Стив Джобс почти буквально следовал совету Алана Кея. Проект, над которым работал Реннскауг велся на протяжении 10 лет. А первая публикация об MVC от его создателей вышла в свет еще через 10 лет. Мартин Фаулер, автор ряда книг и статей по архитектуре ПО, упоминает, что он изучал MVC по работающей версии SmallTalk. Поскольку информации об MVC из первоисточника долго не было, а также по ряду других причин, появилось большое количество различных трактовок этого понятия. В результате многие считают MVC схемой или паттерном проектирования. Реже MVC называют составным паттерном или комбинацией нескольких паттернов, работающих совместно для реализации сложных приложений. Но на самом деле, как было сказано ранее, MVC — это прежде всего набор архитектурных идей/принципов/подходов, которые можно реализовать различными способами с использованием различных шаблонов... Далее мы попробуем рассмотреть основные идеи, заложенные в концепции MVC.Что такое MVC: основные идеи и принципы
- VC — это набор архитектурных идей и принципов для построения сложных информационных систем с пользовательским интерфейсом;
- MVC — это аббревиатура, которая расшифровывается так: Model-View-Controller.
![Часть 7. Знакомство с паттерном MVC (Model-View-Controller) - 2](https://cdn.javarush.com/images/article/85a08a31-57c0-4bab-b294-af2a6354ee42/original.jpeg)
Шаг 1. Отделить бизнес-логику приложения от пользовательского интерфейса
Ключевая идея MVC состоит в том, что любое приложение с пользовательским интерфейсом в первом приближении можно разбить на 2 модуля: модуль, отвечающий за реализацию бизнес-логики приложения, и пользовательский интерфейс. В первом модуле будет реализован основной функционал приложения. Данный модуль будет ядром системы, в котором реализуется модель предметной области приложения. В концепции MVC данный модуль будет нашей буковкой M, т.е. моделью. Во втором модуле будет реализован весь пользовательский интерфейс, включая отображение данных пользователю и логику взаимодействия пользователя с приложением. Основная цель такого разделения — сделать так, чтобы ядро системы (Модель в терминологии MVC) могла независимо разрабатываться и тестироваться. Архитектура приложения после подобного разделения будет выглядеть следующим образом:![Часть 7. Знакомство с паттерном MVC (Model-View-Controller) - 3](https://cdn.javarush.com/images/article/0745e48a-ddd0-4937-b039-18c644dd83d3/original.jpeg)
Шаг 2. Используя шаблон Наблюдатель, добиться еще большей независимости модели, а также синхронизации пользовательских интерфейсов
Здесь мы преследуем 2 цели:- Добиться еще большей независимости модели.
- Синхронизировать пользовательские интерфейсы.
Шаг 3. Разделение интерфейса на Вид и Контроллер
Продолжаем делить приложение на модули, но уже на более низком уровне иерархии. На этом шаге пользовательский интерфейс (который был выделен в отдельный модуль на шаге 1) делится на вид и контроллер. Сложно провести строгую черту между видом и контроллером. Если говорить о том, что вид — это то, что видит пользователь, а контроллер — это механизм, благодаря которому пользователь может взаимодействовать с системой, можно обнаружить некоторое противоречие. Элементы управления, например, кнопки на веб-странице или виртуальная клавиатура на экране телефона, это по сути часть контроллера. Но они так же видны пользователю, как и любая часть вида. Здесь скорее речь идет о функциональном разделении. Основная задача пользовательского интерфейса — обеспечить взаимодействие пользователя с системой. Это означает, что у интерфейса всего 2 функции:- выводить и удобно отображать пользователю информацию о системе;
- вводить данные и команды пользователя в систему (передавать их системе);
![Часть 7. Знакомство с паттерном MVC (Model-View-Controller) - 4](https://cdn.javarush.com/images/article/81ce3871-4556-4e91-9073-b099a4a0ee08/original.jpeg)
- Следуя принципам MVC, систему нужно разделять на модули.
- Самым важным и независимым модулем должна быть модель.
- Модель — ядро системы. Нужна возможность разрабатывать и тестировать ее независимо от интерфейса.
- Для этого на первом шаге сегрегации системы нужно разделить ее на модель и интерфейс.
- Далее, с помощью шаблона Наблюдатель, укрепляем модель в ее независимости и получаем синхронизацию пользовательских интерфейсов.
- Третьим шагом делим интерфейс на контроллер и вид.
- Все, что на ввод информации от пользователя в систему — это в контроллер.
- Все что на вывод информации от системы к пользователю — это в вид.
Немного о взаимосвязи Вида и Контроллера с Моделью
Когда пользователь вводит информацию через контроллер, он тем самым вносит изменения в модель. По крайней мере, пользователь вносит изменения в данные модели. Когда пользователь получает информацию через элементы интерфейса (через Вид), пользователь получает информацию о данных модели. Как это происходит? Посредством чего Вид и Контроллер взаимодействуют с моделью? Ведь не может быть так, что классы Вида напрямую используют методы классов Модели для чтения/записи данных, иначе ни о какой независимости Модели не может быть и речи. Модель представляет тесно связанный между собой набор классов, к которым, по-хорошему, ни у Вида, ни у Контроллера не должно быть доступа. Для связи Модели с Видом и Контроллером необходимо реализовать шаблон проектирования Фасад. Фасад модели будет той самой прослойкой между Моделью и интерфейсом, через которую Вид получает данные в удобном формате, а Контроллер изменяет данные, вызывая нужные методы фасада. Схематично, в итоге, все будет выглядеть так:![Часть 7. Знакомство с паттерном MVC (Model-View-Controller) - 6](https://cdn.javarush.com/images/article/c7839f08-cda3-43b3-8ebd-a80864bb965f/original.jpeg)
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ