В чем разница между Контроллером и Сервлетом?
Я не знаю, в чем основные различия между ними и какие преимущества имеют сервлет и контроллер.
Поделиться Источник 07 мая 2019 в 08:10
2 ответа
Я не знаю, в чем основная разница между ними.
Какие преимущества имеют сервлеты.
Чтобы ответить на это, вам нужно понять, для чего они были предназначены. В основном, их основная цель — отвечать на запросы динамическим и независимым (от других сервлетов) образом.
Они могут быть статичными.
Они могут управлять сессиями.
Они могут общаться с другими сервлетами.
Они легко переносимы.
Жизненный цикл сервлета обычно управляется контейнером, который упрощает работу.
Вопрос немного расплывчатый, и трудно ответить на него вкратце. Лучше бы вам получить практический опыт работы с обоими. Перед этим просмотрите материалы, которые я упомянул ниже.
Поделиться 07 мая 2019 в 08:26
Контроллер является частью шаблона Model-View-Controller:
Model-View-Controller (обычно известный как MVC) является архитектурным шаблоном, который обычно используется для разработки пользовательских интерфейсов, которые делят приложение на три взаимосвязанные части. Это делается для разделения внутренних представлений информации от способов, которыми информация представлена и принимается от пользователя.1 Шаблон проектирования MVC разделяет эти основные компоненты, позволяя эффективное повторное использование кода и параллельную разработку.
Сервлет может быть Контроллером
Контроллер выступает в качестве интерфейса между View и Model. Контроллер перехватывает все входящие запросы.
Модель представляет состояние приложения, т.е. данные. Она также может иметь бизнес-логику.
Но не обязательно (может выполнять «model»/»view» операции).
Разница между Servlet, Spring MVC и Spring Boot
Хотите начать писать веб-приложения на Java? Первым способом будет начать использовать фреймворк (набор библиотек, архитектур, шаблонов проектирования для минимизации повторяющегося кода), и один из популярных веб фреймворков на Java — это Spring MVC, который крутится под капотом у Spring Boot. Зачем нужен Spring Boot? Для начало нужно понять философию Spring. Под экосистемой Spring лежит очень много библиотек, но в проектах не все они нужны. И они спроектированы так, чтобы можно было их подключать гибко, не мешая друг другу. Но со временем, когда в проекте становится много библиотек и кода, то сконфигурировать их становится нетривиальной задачей. И хочется взять готовый шаблон, который работает вместе хорошо. Вот Spring Boot предоставляет возможность склеивать между собой много Spring библиотек легко и просто, в пару строчек кода или конфигурации. А под капотом у Spring MVC лежит Servlet API. Вы конечно же можете написать веб-приложение, используя только Servlet API, но объем кода, особенно повторяющегося, будет очень большим. И другой разработчик может не понять данный код из набора спагетти if’ов. Для полного понимания их разницы предлагаю просмотреть следующее короткое видео.
Аналог Spring @Controller в Java Servlet
Спринговые контроллеры ( @Controller ) позволяют обрабатывать множество URL — паттернов. А как быть с сервлетами, один сервлет на один url ? Спасибо.
Отслеживать
задан 15 дек 2016 в 19:32
115 2 2 серебряных знака 10 10 бронзовых знаков
Spring @Controller это надстройка над Servlet-ами. Spring устанавливает свой Servlet, который работает для всех url и перенаправляет запрос к конкретному контролёру. Учите мат.часть, вроде никто этого в секрете не держит и всё можно найти в той же документации по Spring-у. А уж по servlet-ам даже на русском материалов до. много короче ещё со времён первого появления этой технологии.
16 дек 2016 в 3:53
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Нет, сервлет — это приложение, которое ловит все внутри выделенного ему context path. Вам нужно сделать роутер, который будет разбирать url и вызывать соответствующий код (контроллер). Собственно, этим и занимается спринг, вы можете без труда повторить его основу, создав аналогичную аннотацию, сканируя в рантайме пакет с вашим приложением и находя соответствие текущего URL заданному в аннотации.
Отслеживать
ответ дан 15 дек 2016 в 20:05
36.1k 2 2 золотых знака 56 56 серебряных знаков 83 83 бронзовых знака
Собственно context вместе с contex path-ем выделяется действительно приложению. Но servlet != приложение. Это его составная часть. Их может быть много, может быть один.
Подход MVC
Самая популярная архитектура приложений, о которой знает каждый программист, — это MVC . MVC расшифровывается как Model-View-Controller .
Это не столько архитектура приложений, как архитектура компонентов приложения, но к этому нюансу вернемся попозже. Что же такое MVC?
MVC — это схема разделения данных приложения и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо.
- Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя свое состояние.
- Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели.
- Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений.
Эту модель придумали еще в 1978 (!) году. Да, проблемы с правильной архитектурой ПО были актуальны еще 50 лет назад. Вот как эта модель описывается диаграммой в оригинале:
Модель предоставляет данные и методы работы с ними: запросы в базу данных, проверку на корректность. Модель не зависит от представления (не знает как данные визуализировать) и контроллера (не имеет точек взаимодействия с пользователем), предоставляя доступ к данным и управлению ими.
Модель строится таким образом, чтобы отвечать на запросы, изменяя свое состояние, при этом может быть встроено уведомление “наблюдателей”. Модель, за счет независимости от визуального представления, может иметь несколько различных представлений для одной “модели”.
Представление отвечает за получение необходимых данных из модели и отправляет их пользователю. Представление не обрабатывает введенные данные пользователя.
Контроллер обеспечивает “связь” между пользователем и системой. Контролирует и направляет данные от пользователя к системе и наоборот. Использует модель и представление для реализации необходимого действия.
Определенная сложность есть с тем, что данная модель за десятки лет немного эволюционировала. То есть название осталось тем же, а назначение частей начало меняться.
Архитектура MVC в вебе
Идея, которая лежит в основе конструкционного шаблона MVC, очень проста: нужно четко разделять ответственность за различное функционирование в наших приложениях:
Model — обработка данных и логика приложения.
View — предоставления данных пользователю в любом поддерживаемом формате.
Controller — обработка запросов пользователя и вызов соответствующих ресурсов.
Приложение разделяется на три основных компонента, каждый из которых отвечает за различные задачи. Давай подробно разберем компоненты клиент-серверного приложения на примере.
Контроллер (Controller)
Пользователь кликает на различные элементы на странице в браузере, в результате чего браузер отправляет различные HTTP запросы: GET, POST или другие. К контроллеру можно отнести браузер и JS-код, которые работают внутри страницы.
Основная функция контроллера в данном случае — это вызывать методы у нужных объектов, управлять доступом к ресурсам для выполнения задач, заданных пользователем. Обычно контроллер вызывает соответствующую модель для задачи и выбирает подходящий вид.
Модель (Model)
Модель в широком смысле — это данные и правила, которые используются для работы с данными — вместе они составляют бизнес-логику приложения. Проектирование приложения всегда начинается с построения моделей объектов, которыми оно оперирует.
Допустим, у нас есть интернет-магазин, который торгует книгами, тогда человек — это только пользователь приложения или еще и автор книги? Эти важные вопросы должны быть решены во время проектирования модели.
Дальше идут наборы правил: что можно делать, что нельзя, какие наборы данных допустимы, а какие нет. Может ли книга быть без автора? А автор без книг? Может ли дата рождения пользователя быть в 300 году и тому подобное.
Модель дает контроллеру представление данных, которые запросил пользователь (сообщение, страницу книги, картинки, и тому подобное). Модель данных будет одинаковой, вне зависимости от того, как мы хотим представлять их пользователю. Поэтому мы выбираем любой доступный вид для отображения данных.
Модель содержит наиболее важную часть логики нашего приложения , логику, которая решает задачу, с которой мы имеем дело (форум, магазин, банк и тому подобное). Контроллер содержит в основном организационную логику для самого приложения (прямо как твой Project Manager).
Вид (View)
View обеспечивает различные способы представления данных, которые получены из модели. Он может быть шаблоном, который заполняется данными. Может быть несколько различных views и контроллер выбирает, какой подходит наилучшим образом для текущей ситуации.
Веб-приложение обычно состоит из набора контроллеров, моделей и видов (views). Контроллер может быть только на бэкенде, но также может быть вариант нескольких контроллеров, когда его логика размазывается и по frontend’у тоже. Хороший пример такого подхода — любое мобильное приложение.
Пример MVC в вебе
Допустим тебе нужно разработать интернет-магазин, который будет заниматься продажей книг. Пользователь может выполнять следующие действия: просматривать книги, регистрироваться, покупать, добавлять пункты к текущему заказу, отмечать понравившиеся книги и покупать их.
В твоем приложении должна быть модель , которая отвечает за всю бизнес-логику. Также нужен контроллер , который будет обрабатывать все действия пользователей и превращать их в вызовы методов из бизнес-логики. При этом один метод контроллера может вызвать много различных методов модели.
Также тебе нужны наборы views: список книг, информация об одной книге, корзина, список заказов. Каждая страница веб-приложения — это фактически и есть отдельный view, который отображает пользователю определенный аспект модели.
Давай посмотрим, что произойдет, если пользователь откроет список рекомендованных магазином книг для просмотра названий. Всю последовательность действий можно описать в виде 6 шагов:
- Пользователь кликает по ссылке «рекомендованы» и браузер отправляет запрос на, допустим, /books/recommendations.
- Контроллер проверяет запрос : пользователь должен быть залогинен. Или у нас должны быть подборки книг для незалогиненных пользователей. Затем контроллер обращается к модели и просит ее отдать список книг, рекомендованных пользователю N.
- Модель обращается в базу данных, достает оттуда информацию о книгах: популярные сейчас книги, книги, купленные пользователем, книги, купленные его друзьями, книги из его wish list. На основе этих данных модель строит список из 10 рекомендованных книг и возвращает их контроллеру.
- Контроллер получает список рекомендованных книг и смотрит на него. На этом этапе контроллер принимает решения! Если книг мало или список вообще пустой, то он запрашивает список книг для незалогиненного пользователя. Если сейчас идет акция, то контроллер может добавить в список акционные книги.
- Контроллер определяется с тем, какую страницу показать пользователю. Это может быть страница с ошибкой, страница со списком книг, страница поздравление о том, что пользователь стал миллионным посетителем.
- Сервер отдает клиенту страницу ( view ), выбранную контроллером. Она заполняется нужными данными (имя пользователя, список книг) и уходит к клиенту.
- Клиент получает страницу и отображает ее пользователю.
В чем преимущества такого подхода?
Самое очевидное преимущество, которое мы получаем от использования концепции MVC — это четкое разделение логики представления (интерфейса пользователя) и логики приложения (серверная часть).
Второе преимущество — это разделение серверной части на две: умная модель ( исполнитель ) и контроллер ( центр принятия решений ).
В предыдущем примере был момент, когда контроллер мог получить от модели пустой список рекомендованных книг и решал, что ему с ним делать. Теоретически эту логику можно было бы засунуть сразу в модель.
Сначала при запросе рекомендованных книг модель бы решала, что делать, если список пустой. Затем пришлось бы в это же место добавить код, что делать, если сейчас идет акция, затем еще разные варианты.
Потом оказалось, что админ магазина хочет посмотреть, как будет выглядеть страница пользователя без акции, или наоборот сейчас акции нет, а он хочет посмотреть, как будет отображаться будущая акция. А методов-то для этого нет. Поэтому и было решено отделить центр принятия решений (контроллер) от бизнес-логики (модель).
Помимо изолирования видов от логики приложения, концепция MVC существенно уменьшает сложность больших приложений. Код получается гораздо более структурированным, и, тем самым, облегчается поддержка, тестирование и повторное использование решений.
Понимая концепцию MVC, ты как разработчик осознаешь, где нужно добавить сортировку списка книг:
- На уровне запроса к базе данных.
- На уровне бизнес-логики (модели).
- На уровне бизнес-логики (контроллер).
- В представлении — на стороне клиента.
И это не риторический вопрос. Вот прямо сейчас и подумай: где и почему нужно добавить код по сортировке списка книг.
Классическая модель MVC
Взаимодействие между компонентами MVC реализуется по-разному в веб-приложениях и в мобильных приложениях. Это происходит из-за того, что веб-приложение — короткоживущее, обрабатывает один запрос пользователя и завершается, а мобильное приложение обрабатывает много запросов без перезапуска.
В веб-приложениях обычно используется «пассивная» модель, а в мобильных приложениях — «активная». Активная модель, в отличие от пассивной, позволяет подписываться и получать уведомления об изменении в ней. В случае с веб-приложениями этого не требуется.
Примерно вот так выглядит взаимодействие компонентов в различных моделях:
В мобильных приложениях (активная модель) активно используются события и механизм подписки на события. При таком подходе view ( вид ) подписывается на изменения модели. Затем, когда происходит какое-то событие (например, пользователь нажимает кнопку), вызывается контроллер . Он дает и модели команду на изменение данных.
Если какие-то данные изменились, то модель генерирует событие об изменении этих данных. Все view, которые подписались на это событие (для которых важно изменение именно этих данных), получают это событие и обновляют данные в своем интерфейсе.
В веб-приложениях все организовано немного по-другому. Основное техническое отличие — это то, что клиент не может получать сообщения со стороны сервера по инициативе сервера .
Поэтому контроллер в веб-приложении обычно не присылает view какие-либо сообщения, а отдает клиенту новую страницу, которая технически является новым view или даже новым клиентским приложением (если одна страница ничего не знает о другой).
В нынешнее время эта проблема частично решена с помощью таких подходов:
- Регулярный опрос сервера на счет изменения важных данных (раз в минуту или чаще).
- WebSocket’ы позволяют клиентку подписываться на сообщения сервера.
- Web-push-уведомления со стороны сервера.
- Протокол HTTP/2 позволяет серверу инициировать отправку сообщений клиенту.