Контроллер и сервлет: в чем разница?
Один из ключевых вопросов, с которым сталкивается каждый начинающий Java-разработчик, — это понимание разницы между контроллером и сервлетом. Хотя оба эти термина связаны с веб-разработкой и широко используются при создании приложений, они отличаются друг от друга.
Сервлет — это программный компонент, который используется для создания динамических веб-страниц. Он является частью сервлет-контейнера и может отвечать на запросы, полученные от клиента. Однако, контроллер — это часть архитектурного шаблона проектирования, который используется для управления потоком данных между моделью и представлением.
В то время как сервлет направлен на обработку запросов и формирование ответов, контроллер возглавляет движение данных от модели к представлению и наоборот. По сути, контроллер — это связующее звено между представлением и моделью, благодаря чему эффективность работы приложения значительно повышается.
Таким образом, практически любое веб-приложение использует и сервлеты, и контроллеры, но для различных целей. Поэтому иметь четкое понимание различий между ними — это важная часть процесса изучения Java-разработки.
Контроллер и сервлет: что это?
Контроллер и сервлет являются элементами архитектуры веб-приложения, используемыми в Java-технологиях.
Контроллер выполняет функцию обработки запросов от пользователя и управления потоком данных внутри приложения. Он также может выполнять задачи авторизации и безопасности. Контроллер обладает бизнес-логикой и отвечает за правильное выполнение функций приложения.
Сервлет является Java-классом, который выполняет обработку HTTP-запросов и отвечает за генерацию HTML-страниц. Сервлет подключается к контроллеру, который управляет им и передает сведения о запросе. Сервлеты обладают возможностью обрабатывать все типы HTTP-запросов, что позволяет создавать динамические веб-страницы, изменяющиеся в соответствии с запросами пользователей.
В отличие от контроллера, который используется только в одном приложении, сервлеты могут быть использованы в различных приложениях и могут быть использованы для обработки большого числа запросов. Эти элементы взаимодействуют друг с другом, чтобы обеспечить эффективное и функциональное веб-приложение.
Что такое контроллер?
Контроллер — это один из ключевых элементов в архитектуре приложений, отвечающий за обработку запросов из веб-браузера и управление потоком работы приложения. Он получает данные от пользователя, определяет какой метод нужно выполнить из модели и выбирает представление, которое будет отображено на экране.
Контроллер содержит набор методов и операций, которые задействуются для обработки запросов от пользователя. Он также отвечает за валидацию переданных данных, обработку ошибок и управление состоянием приложения. Контроллер обеспечивает связь между представлением, моделью и базой данных, и позволяет реализовать логику приложения.
Контроллер может быть реализован как класс в языке программирования, а может быть использован как библиотечный компонент из фреймворков. В общем случае контроллеры позволяют создавать универсальные приложения, которые могут быть использованы в различных проектах и на разных платформах.
Что такое сервлет?
Сервлет – это класс Java, который используется для обработки запросов, полученных от клиента. Сервлеты используются в web-приложениях, чтобы создавать динамические страницы, которые могут обрабатывать запросы и возвращать ответы на основе данных, полученных из базы данных или других источников данных.
Сервлеты работают на сервере в среде Java Servlet Container, такой как Tomcat или Jetty. Когда клиент отправляет запрос к серверу, контейнер Servlet обрабатывает его, создает экземпляр сервлета и передает запрос сервлету. После обработки запроса сервлет возвращает ответ клиенту.
Сервлеты могут принимать и обрабатывать запросы типа GET и POST, иметь доступ к параметрам запроса, получать данные из сессии и управлять сессией пользователя. Сервлеты также могут генерировать HTML, XML, JSON и другие форматы ответов.
В отличие от контроллеров, сервлеты являются более низкоуровневыми, более гибкими и отвечают за то, чтобы обрабатывать непосредственно запросы от клиентов. Они могут использоваться как часть фреймворков, таких как Spring или Struts, но также могут быть написаны «с нуля» с использованием API Java Servlet.
Общие черты контроллера и сервлета
Контроллер и сервлет – два технологических уровня приложения, отвечающие за обработку запросов от пользователя. Их общей чертой является работа с входящими данными и генерация выходных данных.
С точки зрения архитектуры приложения, контроллер и сервлет – это компоненты, которые реализуют логику приложения.
Контроллер и сервлет взаимодействуют с различными уровнями приложения – базой данных, представлением и моделью данных, поэтому их переносимость и масштабируемость особенно важны.
- Контроллер и сервлет позволяют обрабатывать запросы с различных клиентских устройств, таких как компьютеры, смартфоны и планшеты.
- Контроллер и сервлет могут обрабатывать запросы как синхронно, так и асинхронно.
- Контроллер и сервлет имеют возможность обрабатывать ошибки путем обработки исключений.
В итоге, контроллер и сервлет обладают общими чертами – обработка запросов, работа с несколькими уровнями приложения, и совместимость с различными клиентскими устройствами, а также возможность асинхронной обработки запросов и обработка ошибок.
В чем разница между контроллером и сервлетом?
Контроллер и сервлет — два популярных способа управления запросами в веб-приложении. Однако у этих технологий есть существенные различия.
Контроллер — это прослойка между пользовательским интерфейсом и базой данных. Он отвечает за организацию запросов и обработку ответов на основе выделенных правил. Контроллер получает информацию от сервлетов и генерирует представление для отправки клиенту. Он также может использоваться для реализации бизнес-логики и контроля достоверности данных.
Сервлет — это компонент веб-приложения, который занимается обработкой запросов от клиентов. Сервлет получает запрос от контроллера, преобразует его в объект запроса, обрабатывает его и отправляет ответ обратно.
Одной из главных различий между контроллером и сервлетом является то, что контроллер управляет запросами на уровне приложения, тогда как сервлет занимается обработкой запросов на низком уровне, работая непосредственно с протоколом HTTP.
Контроллер и сервлет — необходимые компоненты веб-приложения. Оба позволяют разработчикам управлять запросами и манипулировать данными для создания функциональных веб-приложений.
Чем контроллер отличается от сервлета
Фреймворк Spring MVC обеспечивает архитектуру паттерна Model — View — Controller (Модель — Отображение (далее — Вид) — Контроллер) при помощи слабо связанных готовых компонентов. Паттерн MVC разделяет аспекты приложения (логику ввода, бизнес-логику и логику UI), обеспечивая при этом свободную связь между ними.
- Model (Модель) инкапсулирует (объединяет) данные приложения, в целом они будут состоять из POJO («Старых добрых Java-объектов», или бинов).
- View (Отображение, Вид) отвечает за отображение данных Модели, — как правило, генерируя HTML, которые мы видим в своём браузере.
- Controller (Контроллер) обрабатывает запрос пользователя, создаёт соответствующую Модель и передаёт её для отображения в Вид.
DispatcherServlet
Вся логика работы Spring MVC построена вокруг DispatcherServlet, который принимает и обрабатывает все HTTP-запросы (из UI) и ответы на них. Рабочий процесс обработки запроса DispatcherServlet’ом проиллюстрирован на следующей диаграмме:

Ниже приведена последовательность событий, соответствующая входящему HTTP-запросу:
- После получения HTTP-запроса DispatcherServlet обращается к интерфейсу HandlerMapping, который определяет, какой Контроллер должен быть вызван, после чего, отправляет запрос в нужный Контроллер.
- Контроллер принимает запрос и вызывает соответствующий служебный метод, основанный на GET или POST. Вызванный метод определяет данные Модели, основанные на определённой бизнес-логике и возвращает в DispatcherServlet имя Вида (View).
- При помощи интерфейса ViewResolver DispatcherServlet определяет, какой Вид нужно использовать на основании полученного имени.
- После того, как Вид (View) создан, DispatcherServlet отправляет данные Модели в виде атрибутов в Вид, который в конечном итоге отображается в браузере.
Конфигурирование
Вам будет необходимо связать (замапить) запросы, которые Вы хотите обработать при помощи DispatcherServlet, используя мапинг URL в файле web.xml. Ниже приведён пример объявления и мапинга DispatcherServlet’а HelloWeb:
Файл web.xml будет находиться в каталоге WebContent/WEB-INF. После инициализации HelloWeb, фреймворк попытается загрузить контекст приложения из файла с именем [servlet-name]-servlet.xml, находящегося в каталоге WebContent/WEB-INF. В нашем случае, это будет HelloWeb-servlet.xml.
Далее, тэг указывает, какие веб-адреса обрабатываются каким DispatcherServlet’ом. В нашем случае, все HTTP-запросы, заканчивающиеся на «.jsp», будут обработаны HelloWeb.
Если Вы не хотите использовать [servlet-name]-servlet.xml / WebContent/WEB-INF в качестве файла и директории по умолчанию, Вы можете настроить имя файла и директорию, добавив слушатель сервлета (servlet listener) ContextLoaderListener в web.xml, как показано ниже:
Теперь давайте проверим конфигурацию для HelloWeb-servlet.xml, размещённую в каталоге WebContent/WEB-INF:
Ниже приведены важные моменты в HelloWeb-servlet.xml:
- Файл [servlet-name]-servlet.xml будет использоваться для создания обозначенных бинов, с переопределением определений каждого бина, определённых с тем же именем в глобальной области.
- Тэг будет использован для для активации функции сканирования аннотаций Spring MVC, позволяющей использовать аннотации, такие как Controller, @RequestMapping и проч.
- Имена Видов (View) будут определяться при помощи InternalResourceViewResolver. В соответствии с указанным выше правилом, Вид с именем hello будет реализован по адресу /WEB-INF/jsp/hello.jsp
Определение Контроллера
DispatcherServlet отправляет запрос контроллерам для выполнения определённых функций. Аннотация @Controllerannotation указывает, что конкретный класс является контроллером. Аннотация @RequestMapping используется для мапинга (связывания) с URL для всего класса или для конкретного метода обработчика.
Аннотация Controller определяет класс как Контроллер Spring MVC. В первом случае, @RequestMapping указывает, что все методы в данном Контроллере относятся к URL-адресу «/hello». Следующая аннотация @RequestMapping(method = RequestMethod.GET) используется для объявления метода printHello() как дефолтного метода для обработки HTTP-запросов GET (в данном Контроллере). Вы можете определить любой другой метод как обработчик всех POST-запросов по данному URL-адресу.
Вы можете написать вышеуказанный Контроллер по-другому, указав дополнительные атрибуты для аннотации @RequestMapping следующим образом:
Атрибут «value» указывает URL, с которым мы связываем данный метод (value = «/hello»), далее указывается, что этот метод будет обрабатывать GET-запросы (method = RequestMethod.GET). Также, нужно отметить важные моменты в отношении приведённого выше контроллера:
- Вы определяете бизнес-логику внутри связанного таким образом служебного метода. Из него Вы можете вызывать любые другие методы.
- Основываясь на заданной бизнес-логике, в рамках этого метода Вы создаёте Модель (Model). Вы можете добавлять аттрибуты Модели, которые будут добавлены в Вид (View). В примере выше мы создаём Модель с атрибутом «message».
- Данный служебный метод возвращает имя Вида в виде строки String. В данном случае, запрашиваемый Вид имеет имя «hello».
Создание Вида (JSP)
Spring MVC поддерживает множество типов Видов для различных технологий отображения страницы. В том числе — JSP, HTML, PDF, Excel, XML, Velocity templates, XSLT, JSON, каналы Atom и RSS, JasperReports и проч. Но чаще всего используются шаблоны JSP, написанные при помощи JSTL.
Давайте напишем простой Вид «hello» в /WEB-INF/hello/hello.jsp:
В данном случае, переменная $ выводит тот самый атрибут, установленный нами в Контроллере. Внутри Вида Вы можете отобразить любое количество атрибутов.
Примеры реализации фреймворка Spring MVC
Основываясь на приведённых выше концепциях, предлагаю выполнить несколько важных уроков, которые в дальнейшем помогут нам создавать приложения Spring Web:
Spring MVC Hello World Example
Пример, разъясняющий написание простейшего приложения Hello World.
Spring MVC Form Handling Example
В этом примере объясняется, как написать приложение Spring Web с помощью форм HTML, отправить данные контроллеру и отобразить обработанный результат.
Spring Static Pages Example
Получаем доступ к статическим страницам вместе с динамическими.
От Hello World до Spring Web MVC и при чём тут сервлеты

Веб-конфигурация для примера конфигурирования в Java стиле:
Данный пример описан в документации Spring Framework: «1.11. MVC Config».
Здесь мы регистрируем ViewResolver, который будет помогать определить, как находиться jsp страницы. Второй метод обеспечивает включение «Default servlet».
Контроллер HelloController для описания маппинга запросов на определённый JSP
Здесь мы использовали аннотацию @Controller, описанную в документации в главе «1.4. Annotated Controllers».
Когда использовать Servlet или @Controller
Мне нужно прояснить несколько вещей. Я искал ответ на этот вопрос, но не могу найти хороший ответ на свои конкретные вопросы (например, этот вопрос грыз ответ: Разница между сервлетом и веб-службой ).
Насколько я понимаю, существуют разные способы реализации «обработки запросов», также известной как «Контроллер», в «ориентированном на MVC» веб-приложении, два из которых:
- Сервлет , специфичный для Java (то есть тот, который вы создаете, щелкнув новый -> Сервлет, например, в eclipse), используемый в качестве «контроллера». Этот расширяется HttpServlet , и вы используете такие методы, как doGet и doPost т.д.
- Аннотированный @Controller класс Spring MVC (да, с использованием файла DispatcherServlet ). С этим вы используете @RequestMethod GET / POST etc.
Теперь к моим вопросам.
- Когда вы используете тот или иной?
- Есть ли какие-либо общие преимущества использования одного метода над другим?(Например, один метод рекомендуется по сравнению с другим в целом?)
[EDIT] : Ключевые слова с акцентом
Если вы студент, заинтересованный в изучении языка, я бы пока остановился на сервлетах. Можно написать веб-приложение, используя только сервлеты, но на практике вы, вероятно, захотите также взглянуть на JSP.
JSP — это удобный способ написания сервлета, который позволяет вам смешивать html с элементами скрипта (хотя рекомендуется избегать кода Java в вашем jsp в пользу тегов и выражений el). Под обложками он будет скомпилирован как сервлет, но вам не придется использовать множество беспорядочных операторов печати.
Важно иметь хотя бы базовое представление о сервлетах и JSP. Spring MVC — одна из многих платформ, построенных на основе сервлетов, чтобы немного упростить задачу написания веб-приложения. В основном все запросы сопоставляются с DispatcherServlet, который действует как передний контроллер .
Затем DispatcherServlet вызовет контроллер, чьи аннотации соответствуют входящему запросу. Это лучше, чем писать эти сопоставления самостоятельно в файле web.xml (хотя с сервлетом 3.0 теперь вы можете аннотировать сервлеты). Но вы также получаете много других преимуществ, которые можно использовать, например, сопоставление полей формы с объектом, проверка этого объекта с помощью аннотаций jsr303, сопоставление входных и выходных данных с xml или json и т. д. и т. д. Кроме того, он тесно интегрирован с ядром Spring, поэтому вы можете легко подключить его. ваши услуги для вызова контроллера.
Стоит отметить, что существует множество конкурирующих фреймворков, построенных на основе сервлетов. Spring MVC — один из самых популярных, так что это неплохой выбор для изучения.
Сервлет и контроллер Spring MVC можно использовать для одного и того же, но они действуют на другом уровне приложения Java.
Сервлет является частью инфраструктуры J2EE, и каждый сервер приложений Java (Tomcat, Jetty и т. д.) создан для запуска сервлетов. Сервлет — это уровень «низкого уровня» в стеке J2EE. Вам не нужен servlet.jar для запуска вашего приложения, потому что он предварительно упакован с сервером приложений.
Контроллер Spring MVC — это библиотека, созданная на основе сервлета для упрощения работы. Spring MVC предлагает больше встроенных функций, таких как сопоставление параметра формы с параметром метода контроллера, более простая обработка отправки двоичных форм (например, когда ваша форма может загружать файлы). Вам необходимо упаковать необходимые jar-файлы в свое приложение, чтобы запустить контроллер Spring MVC.
Вы должны использовать сервлет, когда вам нужно перейти на «низкий уровень», и пример может быть связан с производительностью. Spring MVC работает хорошо, но если у него есть некоторые накладные расходы, если вам нужно выжать все, что можно, из вашего сервера приложений (и вы уже настроили другие уровни, такие как db), используйте сервлет. Вы можете выбрать сервлет, если хотите понять основы веб-спецификаций J2EE (т. е. в образовательных целях).
Во всех остальных случаях вы можете/должны выбрать веб-фреймворк. Spring MVC — один из них; с Spring MVC вам не нужно заново изобретать колесо (например, управление бинарными формами, преобразование параметров формы в bean-компоненты, проверка параметров и т. д.). Еще один плюс Spring MVC в том, что в одном классе можно легко управлять вводом с разных url и методов, то же самое можно делать и в сервлете, но код получается более сложным и менее читаемым. Я считаю, что Spring MVC хорош для создания остальных сервисов и управления простыми приложениями (например, веб-приложением с простыми формами). Если вам нужно управлять очень сложными формами с помощью Ajax, вложенными формами и приложением с состоянием как сеанса, так и страницы, я советую переключиться на компонентную структуру (например, apache wicket ).
Похожие публикации:
- Как удалить уч запись с ipad pro
- Как удлинить линию в автокаде
- Как узнать версию сервера 1с
- Как узнать заблокировали ли меня в whatsapp другой абонент не посылая сообщения в ватсапе
Чем контроллер отличается от сервлета java
Я точно не знаю, каковы основные различия между ними и каковы преимущества сервлета и контроллера.
Я не знаю, в чем главное различие между ними.
Чтобы ответить на это, вам нужно понять, для чего они были предназначены в первую очередь. По сути, их основная цель — отвечать на запросы динамическим и независимым (от других сервлетов) способом.
Они могут быть с состоянием.
Они могут управлять сессиями.
Они могут общаться с другими сервлетами.
Они легко переносимы.
Жизненным циклом сервлета обычно управляет контейнер, который облегчает работу.
Вопрос немного расплывчат, и на него сложно ответить кратко. Вам лучше получить практический опыт работы с обоими. Прежде чем сделать это, рассмотрите материалы, которые я упомянул ниже.
Модель – Вид – Контроллер (обычно известный как MVC) — это архитектурный шаблон, обычно используемый для разработки пользовательских интерфейсов, который делит приложение на три взаимосвязанные части. Это делается для того, чтобы отделить внутреннее представление информации от способов представления и принятия информации от пользователя. 1 Шаблон проектирования MVC разделяет эти основные компоненты, обеспечивая эффективное повторное использование кода и параллельную разработку.
Сервлет может быть контроллером
Контроллер действует как интерфейс между View и Model. Контроллер перехватывает все входящие запросы.
Модель представляет состояние приложения, то есть данных. Это также может иметь бизнес-логику.
Но не обязательно (может выполнять операции «модель»/»просмотр»).
Русские Блоги
Многоуровневая модель приложения Java EE:
Domain Object Слой презентации -> DAO(Data Access Object) Уровень объекта доступа к данным —> Service Слой бизнес-логики —> Controller Слой контроллера -> View Слой представления.
То, что я узнал раньше, JSP + Servlet + JavaBean Технология разработки веб-приложений. Он использует технологию JDBC для взаимодействия с базой данных. Особенно в сочетании с инструментами DBUtils и источниками данных он упрощает такие операции, как подключение к базе данных и упаковка набора результатов.Говорят, что MyBatis, который будет изучен следующим, устраняет почти весь процесс ручной настройки кода и параметров JDBC, а также извлечение и упаковку набора результатов.Эта статья в основном не касается базы данных. Основное внимание уделяется сервлету.
Servlet С SpringMVC DispatcherServlet с участием Controller различия
Приложения, использующие JSP + Servlet, наслоение недостаточно четкое,Реализация бизнес-логики отдельно не выделяется, Вызывает трудности при последующем обслуживании.
В Spring MVC сервлет имеет различные «аватары», отвечающие за перехват и распределение запросов. DispatcherServlet , И ответственные за ведение бизнеса Controller , Существуют различные преобразователи процессоров, адаптеры процессоров и т. Д., Каждый с четким разделением труда.Это содержание, которому посвящена данная статья.
Платформа SpringMVC предоставляет DispatcherServlet в качестве фронт-контроллера для отправки запросов.DispatcherServlet наследуется от HttpServlet. Его способность перехватывать запросы напоминает технологию Filter in Servlet. Однако фильтр не будет мешать исходному URL-адресу. URL-запросы, обработанные фильтром, по-прежнему будут переходить к соответствующему сервлету в соответствии с отображением в конфигурации web.xml или даже переходить к соответствующему сервлету без прохождения фильтра.
DispatcherServlet в Spring MVC
DispatcherServlet другой, URL-запрос иметь После DispatcherServlet, поскольку для чтения информации о сопоставлении требуется DispatcherServlet.
Если DispatcherServlet настроен в web.xml, используйте тег
В DispatcherServlet есть initStrategies(ApplicationContext context) Метод, когда метод вызывается, сгенерированный WebApplicationContext Объект передается в этот метод. Если преобразователь обработки, адаптер процессора и другие компоненты настроены в файле конфигурации, то WebApplicationContext Найдите и инициализируйте его. Если он не найден, будут использоваться компоненты Spring по умолчанию.
Запрос, распространяемый DispatcherServlet, будет передан соответствующему классу Java, который вызывается в Spring MVC. Handle . До Spring 2.5 этот класс Handle требовался для реализации интерфейса контроллера.
Контроллер в Spring MVC (отличие от сервлета)
Интерфейс контроллера должен реализовывать метод, который должен возвращать объект ModelAndView:
Контроллер на основе аннотаций был добавлен в Spring 2.5.
Также HelloController, написанный сейчасНет необходимости наследовать от интерфейса контроллера. Нет необходимости заставлять реализацию метода handleRequest () возвращать объект ModelAndView, но Можно настроить несколько методов Чтобы вернуть объект ModelAndView,Таким образом, несколько запросов могут быть сопоставлены одному и тому же контроллеру, и для обработки запросов могут быть вызваны разные методы.Если вы следуете предыдущему подходу, хотя вы можете сопоставить несколько запросов с одним и тем же контроллером в файле конфигурации Spring MVC, вы можете вызвать только метод handleRequest ().
соответственно,После использования аннотации нет необходимости отображать запрос в файле конфигурации Spring MVC.
При использовании технологии сервлетов для обработки запросов Http в интерфейсе сервлетов предоставляется абстрактный класс HttpServlet, который является подклассом GenericServlet. Наследуйте HttpServlet и переопределите методы doGet () и doPost ():И не требуется возвращать объект, вы также можете перейти на страницу JSP, а затем позволить JSP отображать содержимое самостоятельно。
Даже если это всего лишь прыжок,В Spring MVC информация о переходе также должна быть инкапсулирована в объект ModelAndView, и параметры, которые необходимо передать, также сохраняются в объекте.. На новой странице к переданным параметрам можно получить доступ через requestScope.
Настроить Spring MVC Controller
Часть информации файла конфигурации Spring MVC выглядит следующим образом:
Эта информация имеет прямое отношение к Controller. Независимо от того, находится ли он здесь в сервлете или контроллере, запрос должен быть отображен. Здесь запрос / hello отображается на дескриптор HelloController. и SimpleControllerHandlerAdapter Используется для завершения вызова метода handleRequest класса HelloController. и InternalResourceViewResolver Он используется для разрешения представления (после Spring 4.0, даже если процессор сопоставления, адаптер процессора и преобразователь представлений не настроены, будет использоваться работа MVC по умолчанию внутри Spring).
После использования аннотации вам необходимо изменить файл конфигурации Spring MVC. Во-первых, нет необходимости отображать запрос в файле конфигурации. Но нужно знать расположение всех контроллеров.
Затем вам нужно настроить преобразователь обработки типа аннотации и адаптер процессора, но преобразователь представлений менять не нужно.。 Конечно, после Spring 4.0 есть более простой способ настройки. 。
А здесь только реализация маппинга, а доступа нет. Экземпляр контроллера создается посредством отражения.Я понимаю, что нужно найти путь к соответствующему классу на основе URL-ссылки, а затем сгенерировать экземпляр на основе этого пути.. Эта часть предположения пройдена HandlerMapping Чтобы добиться конкретно. Затем адаптер процессора используется для вызова метода handleRequest (), который мы знаемПри использовании сервлета метод doGet () или doPost () будет автоматически выполняться в зависимости от того, является ли он GET или POST, когда он встречает запрос. И после создания здесь вам понадобится адаптер процессора для вызова。
Анализатор представления отвечает за получение подключений и параметров от объекта ModelAndView, а затем их передачу в DispatcherServlet.Насколько я понимаю, в настоящее время разница между Handler и Servlet заключается в том, что Handler должен возвращать объект ModelAndView, в то время как сервлету он не нужен, и большой разницы нет.Также сказано, что сервлет является родительским классом контроллера.
Когда использовать Servlet или @Controller
Мне нужно прояснить несколько вещей. Я искал ответ на этот вопрос, но не могу найти хороший ответ на свои конкретные вопросы (например, этот вопрос грыз ответ: Разница между сервлетом и веб-службой ).
Насколько я понимаю, существуют разные способы реализации «обработки запросов», также известной как «Контроллер», в «ориентированном на MVC» веб-приложении, два из которых:
- Сервлет , специфичный для Java (то есть тот, который вы создаете, щелкнув новый -> Сервлет, например, в eclipse), используемый в качестве «контроллера». Этот расширяется HttpServlet , и вы используете такие методы, как doGet и doPost т.д.
- Аннотированный @Controller класс Spring MVC (да, с использованием файла DispatcherServlet ). С этим вы используете @RequestMethod GET / POST etc.
Теперь к моим вопросам.
- Когда вы используете тот или иной?
- Есть ли какие-либо общие преимущества использования одного метода над другим?(Например, один метод рекомендуется по сравнению с другим в целом?)
[EDIT] : Ключевые слова с акцентом
Если вы студент, заинтересованный в изучении языка, я бы пока остановился на сервлетах. Можно написать веб-приложение, используя только сервлеты, но на практике вы, вероятно, захотите также взглянуть на JSP.
JSP — это удобный способ написания сервлета, который позволяет вам смешивать html с элементами скрипта (хотя рекомендуется избегать кода Java в вашем jsp в пользу тегов и выражений el). Под обложками он будет скомпилирован как сервлет, но вам не придется использовать множество беспорядочных операторов печати.
Важно иметь хотя бы базовое представление о сервлетах и JSP. Spring MVC — одна из многих платформ, построенных на основе сервлетов, чтобы немного упростить задачу написания веб-приложения. В основном все запросы сопоставляются с DispatcherServlet, который действует как передний контроллер .
Затем DispatcherServlet вызовет контроллер, чьи аннотации соответствуют входящему запросу. Это лучше, чем писать эти сопоставления самостоятельно в файле web.xml (хотя с сервлетом 3.0 теперь вы можете аннотировать сервлеты). Но вы также получаете много других преимуществ, которые можно использовать, например, сопоставление полей формы с объектом, проверка этого объекта с помощью аннотаций jsr303, сопоставление входных и выходных данных с xml или json и т. д. и т. д. Кроме того, он тесно интегрирован с ядром Spring, поэтому вы можете легко подключить его. ваши услуги для вызова контроллера.
Стоит отметить, что существует множество конкурирующих фреймворков, построенных на основе сервлетов. Spring MVC — один из самых популярных, так что это неплохой выбор для изучения.
Сервлет и контроллер Spring MVC можно использовать для одного и того же, но они действуют на другом уровне приложения Java.
Сервлет является частью инфраструктуры J2EE, и каждый сервер приложений Java (Tomcat, Jetty и т. д.) создан для запуска сервлетов. Сервлет — это уровень «низкого уровня» в стеке J2EE. Вам не нужен servlet.jar для запуска вашего приложения, потому что он предварительно упакован с сервером приложений.
Контроллер Spring MVC — это библиотека, созданная на основе сервлета для упрощения работы. Spring MVC предлагает больше встроенных функций, таких как сопоставление параметра формы с параметром метода контроллера, более простая обработка отправки двоичных форм (например, когда ваша форма может загружать файлы). Вам необходимо упаковать необходимые jar-файлы в свое приложение, чтобы запустить контроллер Spring MVC.
Вы должны использовать сервлет, когда вам нужно перейти на «низкий уровень», и пример может быть связан с производительностью. Spring MVC работает хорошо, но если у него есть некоторые накладные расходы, если вам нужно выжать все, что можно, из вашего сервера приложений (и вы уже настроили другие уровни, такие как db), используйте сервлет. Вы можете выбрать сервлет, если хотите понять основы веб-спецификаций J2EE (т. е. в образовательных целях).
Во всех остальных случаях вы можете/должны выбрать веб-фреймворк. Spring MVC — один из них; с Spring MVC вам не нужно заново изобретать колесо (например, управление бинарными формами, преобразование параметров формы в bean-компоненты, проверка параметров и т. д.). Еще один плюс Spring MVC в том, что в одном классе можно легко управлять вводом с разных url и методов, то же самое можно делать и в сервлете, но код получается более сложным и менее читаемым. Я считаю, что Spring MVC хорош для создания остальных сервисов и управления простыми приложениями (например, веб-приложением с простыми формами). Если вам нужно управлять очень сложными формами с помощью Ajax, вложенными формами и приложением с состоянием как сеанса, так и страницы, я советую переключиться на компонентную структуру (например, apache wicket ).
Похожие публикации:
- Как из двумерного массива сделать одномерный java
- Как массив char перевести в строку java
- Как написать массив в java
- Как обратиться к элементу arraylist java
Чем контроллер отличается от сервлета
What is the difference between Controller and Servlet?
I don’t exactly know what are the main differences between them and what are the benefits of servlet and controller.
2 Answers 2
I don’t know what is the main difference between them.
What are the benefits of servlet.
To answer this, you need to understand what they were primarily designed for. Basically, their main purpose is to respond to requests in a dynamic and independent (from other servlets) way.
They can be stateful.
They can manage sessions.
They can communicate with other servlets.
They are easily portable.
The lifecycle of a servlet is usually managed by a container which makes things way easier.
The question is a bit vague and it’s hard to answer it concisely. It’s better for you to get some hands-on experience working with both. Prior to doing so, pore over the materials I mentioned below.
Controller is part of Model-View-Controller pattern:
Model–View–Controller (usually known as MVC) is an architectural pattern commonly used for developing user interfaces that divides an application into three interconnected parts. This is done to separate internal representations of information from the ways information is presented to and accepted from the user.1 The MVC design pattern decouples these major components allowing for efficient code reuse and parallel development.
Servlet can be a Controller
Controller acts as an interface between View and Model. Controller intercepts all the incoming requests.
Model represents the state of the application i.e. data. It can also have business logic.
But doesn’t have to be (can do «model»/»view» operations).
Когда использовать Servlet или @Controller
Мне нужно прояснить несколько вещей. Я искал ответ на этот вопрос, но я не могу найти хороший ответ на свои конкретные вопросы (например, этот вопрос грыз ответ: Разница между сервлетом и веб-службой).
Насколько я понимаю, существуют разные способы реализации «обработки запросов», также известной как «Контроллер», в «ориентированном на MVC» веб-приложении, два из которых:
- Специфика Java Сервлет (т.е. тот, который вы создаете, щелкнув новый -> Сервлет, например, в eclipse), используемый в качестве «контроллера». Этот расширяет HttpServlet и вы используете такие методы, как doGet и doPost и так далее
- Аннотированный Spring MVC @Controller класс (да, используя DispatcherServlet ). С этим вы используете @RequestMethod GET / POST и так далее
Теперь к моим вопросам.
- Когда вы используете тот или иной?
- Есть ли какие-либо Генеральная Преимущества использования одного метода над другим?(Например, один метод рекомендуется по сравнению с другим в целом?)
[РЕДАКТИРОВАТЬ]: выделенные ключевые слова
задан 08 мая ’13, 12:05
3 ответы
Если вы студент, заинтересованный в изучении языка, я бы пока остановился на сервлетах. Можно написать веб-приложение, используя только сервлеты, но на практике вы, вероятно, захотите также взглянуть на JSP.
JSP — это удобный способ написания сервлета, который позволяет вам смешивать html с элементами сценария (хотя рекомендуется избегать кода Java в вашем jsp в пользу тегов и выражений el). Под обложками он будет скомпилирован как сервлет, но вам не придется использовать множество беспорядочных операторов печати.
Важно иметь хотя бы базовое представление о сервлетах и JSP. Spring MVC — одна из многих платформ, построенных на основе сервлетов, чтобы немного упростить задачу написания веб-приложения. В основном все запросы сопоставляются с DispatcherServlet, который действует как передний контроллер.
Затем DispatcherServlet вызовет контроллер, чьи аннотации соответствуют входящему запросу. Это лучше, чем писать эти сопоставления самостоятельно в файле web.xml (хотя с сервлетом 3.0 теперь вы можете аннотировать сервлеты). Но вы также получаете много других преимуществ, которые можно использовать, например, сопоставление полей формы с объектом, проверка этого объекта с помощью аннотаций jsr303, сопоставление входных и выходных данных с xml или json и т. д. и т. д. Кроме того, он тесно интегрирован с ядром Spring, поэтому вы можете легко подключить его. ваши услуги для вызова контроллера.
Стоит отметить, что существует множество конкурирующих фреймворков, построенных на основе сервлетов. Spring MVC — один из самых популярных, так что это неплохой выбор для изучения.
ответ дан 08 мая ’13, 12:05
Хорошее объяснение! У меня есть базовое понимание того, как все работает по отдельности, просто я не могу понять, когда использовать какую-либо методологию. Однако вы объяснили различия между ними, не уточнив их фактическую область использования. Можете ли вы назвать какой-либо пример ситуации, когда я бы использовал один метод вместо другого? — Roger
Они оба используются для одних и тех же целей (создание веб-приложений). Разница в том, что Spring MVC добавляет много удобства. Большинство людей, пишущих веб-приложение на Java, используют какой-либо фреймворк, написанный поверх сервлетов, чтобы упростить разработку. Например, если у вас вдруг возникнет вариант использования запроса на возврат json, тогда Spring MVC уже поддерживает его, тогда как с сервлетами вам придется разбираться самостоятельно. По-прежнему полезно знать сервлеты, поскольку это основная технология. — Бен Терли
Я понимаю. Итак, в основном сервлет создается обоими методами, делая одно и то же — только в № 2 вы используете Spring MVC в качестве основы, которая поможет вам на этом пути? То есть с помощью Spring MVC @Controller, DispatcherServlet и некоторого JSP («java в html») вы создаете то же самое, как если бы вы создали сервлет («html в java» (т.е. New -> Servlet. ..)) и немного JSP/html самостоятельно, только в случае Spring MVC Spring заботится о «неприятных частях» бизнеса сервлетов «бесплатно»? Будет ли это правильным пониманием всего этого? (Извините, что немного медленно — Roger
Довольно много. Вы правы в том, что в обоих случаях вам понадобится JSP для отображения представления. Обычно контроллер или сервлет вызывают ваши службы для получения/установки данных, сохраняют их в запросе и затем перенаправляют на jsp. Spring MVC также может помочь здесь с его преобразователями представлений для поиска правильного представления. — Бен Терли
Сервлет и контроллер Spring MVC можно использовать для одного и того же, но они действуют на другом уровне приложения Java.
Сервлет является частью инфраструктуры J2EE, и каждый сервер приложений Java (Tomcat, Jetty и т. д.) создан для запуска сервлетов. Сервлет — это уровень «низкого уровня» в стеке J2EE. Вам не нужен servlet.jar для запуска вашего приложения, потому что он предварительно упакован с сервером приложений.
Контроллер Spring MVC — это библиотека, созданная на основе сервлета для упрощения работы. Spring MVC предлагает больше встроенных функций, таких как сопоставление параметра формы с параметром метода контроллера, более простая обработка отправки двоичных форм (например, когда ваша форма может загружать файлы). Вам необходимо упаковать необходимые jar-файлы в свое приложение, чтобы запустить контроллер Spring MVC.
Вы должны использовать сервлет, когда вам нужно перейти на «низкий уровень», и пример может быть связан с производительностью. Spring MVC работает хорошо, но если у него есть некоторые накладные расходы, если вам нужно выжать все, что можно, из вашего сервера приложений (и вы уже настроили другие уровни, такие как db), используйте сервлет. Вы можете выбрать сервлет, если хотите понять основы веб-спецификаций J2EE (т. е. в образовательных целях).
Во всех остальных случаях вы можете/должны выбрать веб-фреймворк. Spring MVC — один из них; с Spring MVC вам не нужно заново изобретать колесо (например, управление бинарными формами, преобразование параметров формы в bean-компоненты, проверка параметров и т. д.). Еще один плюс Spring MVC в том, что в одном классе можно легко управлять вводом с разных URL и методов, то же самое можно делать и в сервлете, но код получается более сложным и менее читаемым. Я считаю, что Spring MVC хорош для создания остальных сервисов и управления простыми приложениями (например, веб-приложением с простыми формами). Если вам нужно управлять очень сложными формами с помощью Ajax, вложенными формами и приложением с состоянием сеанса и страницы, я советую переключиться на компонентную структуру (например, калитка apache например).
ответ дан 30 мар ’15, в 12:03
JSF и JSP, а также Spring MVC основаны на сервлетах. Проблема в том, что с сервлетами не очень «приятно» работать, потому что приходится писать прямой html.
Если вы можете использовать современные веб-технологии, я бы просто использовал сервлеты в позициях, требующих прямого вывода http, например, записи изображения из базы данных в http.
Использование SpringMVC или JSF, которые работают с Dipatcherservlet или FacesServlet, просто быстрее и веселее. Они анализируют ваши файлы и отправляют их через сервлет.
ответ дан 08 мая ’13, 13:05

JPA не имеет ничего общего с сервлетами. А сервлеты обычно используются вместе с JSP, как и контроллеры Spring MVC. — JB Низет
Я имею в виду JSP. Я всегда пишу JPA, когда имею в виду JSP. Извините. — Лукас Эйхлер
@Templar Спасибо за ответ! Я все еще немного смущен, хотя. Какие приложения вы бы использовали @Controller (Spring MVC) и для каких приложений вы бы использовали «обычный сервлет»? — Roger
Все, где мне не нужно писать в прямой httpstream -> @Controller Запись ресурсов, таких как изображения, в httpstream -> Servlet — Лукас Эйхлер
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками java spring model-view-controller or задайте свой вопрос.
Русские Блоги
Многоуровневая модель приложения Java EE:
Domain Object Слой презентации -> DAO(Data Access Object) Уровень объекта доступа к данным —> Service Слой бизнес-логики —> Controller Слой контроллера -> View Слой представления.
То, что я узнал раньше, JSP + Servlet + JavaBean Технология разработки веб-приложений. Он использует технологию JDBC для взаимодействия с базой данных. Особенно в сочетании с инструментами DBUtils и источниками данных он упрощает такие операции, как подключение к базе данных и упаковка набора результатов.Говорят, что MyBatis, который будет изучен следующим, устраняет почти весь процесс ручной настройки кода и параметров JDBC, а также извлечение и упаковку набора результатов.Эта статья в основном не касается базы данных. Основное внимание уделяется сервлету.
Servlet С SpringMVC DispatcherServlet с участием Controller различия
Приложения, использующие JSP + Servlet, наслоение недостаточно четкое,Реализация бизнес-логики отдельно не выделяется, Вызывает трудности при последующем обслуживании.
В Spring MVC сервлет имеет различные «аватары», отвечающие за перехват и распределение запросов. DispatcherServlet , И ответственные за ведение бизнеса Controller , Существуют различные преобразователи процессоров, адаптеры процессоров и т. Д., Каждый с четким разделением труда.Это содержание, которому посвящена данная статья.
Платформа SpringMVC предоставляет DispatcherServlet в качестве фронт-контроллера для отправки запросов.DispatcherServlet наследуется от HttpServlet. Его способность перехватывать запросы напоминает технологию Filter in Servlet. Однако фильтр не будет мешать исходному URL-адресу. URL-запросы, обработанные фильтром, по-прежнему будут переходить к соответствующему сервлету в соответствии с отображением в конфигурации web.xml или даже переходить к соответствующему сервлету без прохождения фильтра.
DispatcherServlet в Spring MVC
DispatcherServlet другой, URL-запрос иметь После DispatcherServlet, поскольку для чтения информации о сопоставлении требуется DispatcherServlet.
Если DispatcherServlet настроен в web.xml, используйте тег
В DispatcherServlet есть initStrategies(ApplicationContext context) Метод, когда метод вызывается, сгенерированный WebApplicationContext Объект передается в этот метод. Если преобразователь обработки, адаптер процессора и другие компоненты настроены в файле конфигурации, то WebApplicationContext Найдите и инициализируйте его. Если он не найден, будут использоваться компоненты Spring по умолчанию.
Запрос, распространяемый DispatcherServlet, будет передан соответствующему классу Java, который вызывается в Spring MVC. Handle . До Spring 2.5 этот класс Handle требовался для реализации интерфейса контроллера.
Контроллер в Spring MVC (отличие от сервлета)
Интерфейс контроллера должен реализовывать метод, который должен возвращать объект ModelAndView:
Контроллер на основе аннотаций был добавлен в Spring 2.5.
Также HelloController, написанный сейчасНет необходимости наследовать от интерфейса контроллера. Нет необходимости заставлять реализацию метода handleRequest () возвращать объект ModelAndView, но Можно настроить несколько методов Чтобы вернуть объект ModelAndView,Таким образом, несколько запросов могут быть сопоставлены одному и тому же контроллеру, и для обработки запросов могут быть вызваны разные методы.Если вы следуете предыдущему подходу, хотя вы можете сопоставить несколько запросов с одним и тем же контроллером в файле конфигурации Spring MVC, вы можете вызвать только метод handleRequest ().
соответственно,После использования аннотации нет необходимости отображать запрос в файле конфигурации Spring MVC.
При использовании технологии сервлетов для обработки запросов Http в интерфейсе сервлетов предоставляется абстрактный класс HttpServlet, который является подклассом GenericServlet. Наследуйте HttpServlet и переопределите методы doGet () и doPost ():И не требуется возвращать объект, вы также можете перейти на страницу JSP, а затем позволить JSP отображать содержимое самостоятельно。
Даже если это всего лишь прыжок,В Spring MVC информация о переходе также должна быть инкапсулирована в объект ModelAndView, и параметры, которые необходимо передать, также сохраняются в объекте.. На новой странице к переданным параметрам можно получить доступ через requestScope.
Настроить Spring MVC Controller
Часть информации файла конфигурации Spring MVC выглядит следующим образом:
Эта информация имеет прямое отношение к Controller. Независимо от того, находится ли он здесь в сервлете или контроллере, запрос должен быть отображен. Здесь запрос / hello отображается на дескриптор HelloController. и SimpleControllerHandlerAdapter Используется для завершения вызова метода handleRequest класса HelloController. и InternalResourceViewResolver Он используется для разрешения представления (после Spring 4.0, даже если процессор сопоставления, адаптер процессора и преобразователь представлений не настроены, будет использоваться работа MVC по умолчанию внутри Spring).
После использования аннотации вам необходимо изменить файл конфигурации Spring MVC. Во-первых, нет необходимости отображать запрос в файле конфигурации. Но нужно знать расположение всех контроллеров.
Затем вам нужно настроить преобразователь обработки типа аннотации и адаптер процессора, но преобразователь представлений менять не нужно.。 Конечно, после Spring 4.0 есть более простой способ настройки. 。
А здесь только реализация маппинга, а доступа нет. Экземпляр контроллера создается посредством отражения.Я понимаю, что нужно найти путь к соответствующему классу на основе URL-ссылки, а затем сгенерировать экземпляр на основе этого пути.. Эта часть предположения пройдена HandlerMapping Чтобы добиться конкретно. Затем адаптер процессора используется для вызова метода handleRequest (), который мы знаемПри использовании сервлета метод doGet () или doPost () будет автоматически выполняться в зависимости от того, является ли он GET или POST, когда он встречает запрос. И после создания здесь вам понадобится адаптер процессора для вызова。
Анализатор представления отвечает за получение подключений и параметров от объекта ModelAndView, а затем их передачу в DispatcherServlet.Насколько я понимаю, в настоящее время разница между Handler и Servlet заключается в том, что Handler должен возвращать объект ModelAndView, в то время как сервлету он не нужен, и большой разницы нет.Также сказано, что сервлет является родительским классом контроллера.
Вопросы для интервью Spring MVC
Spring MVC-это оригинальный веб-фреймворк от Spring, построенный на API сервлетов. Он обеспечивает архитектуру “Модель-представление-контроллер”, которая может использоваться для разработки гибких веб-приложений.
В этом уроке мы сосредоточимся на вопросах, связанных с этим, так как это часто является темой весеннего собеседования для разработчиков.
Для получения дополнительных вопросов о структуре Spring вы можете ознакомиться с другой статьей, связанной с Spring, из нашей серии вопросов для интервью .
2. Основные вопросы Spring MVC
Q1. Почему Мы должны Использовать Spring MVC?
Spring MVC реализует четкое разделение задач, что позволяет нам легко разрабатывать и тестировать наши приложения .
Такие понятия, как:
- Сервлет диспетчера
- Контроллеры
- Распознаватели видов
- Виды, Модели
- ModelAndView
- Атрибуты модели и сеанса
они полностью независимы друг от друга и отвечают только за одно.
Поэтому MVC дает нам довольно большую гибкость . Он основан на интерфейсах (с предоставленными классами реализации), и мы можем настроить каждую часть фреймворка с помощью пользовательских интерфейсов.
Еще одна важная вещь заключается в том, что мы не привязаны к определенной технологии просмотра (например, JSP), но у нас есть возможность выбрать из тех, которые нам больше всего нравятся .
Кроме того, мы используем Spring MVC не только при разработке веб-приложений, но и при создании веб-сервисов RESTful .
Q2. Какова роль аннотации @Autowired?
Аннотацию @Autowired можно использовать с полями или методами для ввода компонента по типу . Эта аннотация позволяет Spring разрешать и вводить сотрудничающие бобы в ваш боб.
Для получения более подробной информации, пожалуйста, обратитесь к учебнику о @Autowired весной .
Q3. Объясните атрибут модели
Аннотация @ModelAttribute является одной из самых важных аннотаций в Spring MVC. Он связывает параметр метода или возвращаемое значение метода с именованным атрибутом модели, а затем предоставляет его веб-представлению .
Если мы используем его на уровне метода, это указывает на то, что целью этого метода является добавление одного или нескольких атрибутов модели.
С другой стороны, при использовании в качестве аргумента метода он указывает, что аргумент должен быть извлечен из модели. Если его нет, мы должны сначала создать его экземпляр, а затем добавить его в модель. После того, как мы присутствуем в модели, мы должны заполнить поля аргументов из всех параметров запроса, которые имеют совпадающие имена.
Подробнее об этой аннотации можно прочитать в нашей статье, связанной с аннотацией @ModelAttribute .
Q4. Объясните разницу между @Controller и @RestController?
Основное различие между аннотациями @Controller и @RestController заключается в том, что аннотация @ResponseBody автоматически включается в @RestController . Это означает, что нам не нужно аннотировать наши методы обработчика с помощью @ResponseBody . Нам нужно сделать это в классе @Controller , если мы хотим записать тип ответа непосредственно в тело ответа HTTP.
Q5. Опишите изменяемый путь
Мы можем использовать аннотацию @PathVariable в качестве параметра метода обработчика, чтобы извлечь значение переменной шаблона URI .
Например, если мы хотим получить пользователя по идентификатору из www.mysite.com/user/123 , мы должны отобразить наш метод в контроллере как /user/ :
@PathVariable имеет только один элемент с именем value . Это необязательно, и мы используем его для определения имени переменной шаблона URI . Если мы опустим элемент value, то имя переменной шаблона URI должно совпадать с именем параметра метода.
Также разрешено иметь несколько аннотаций @PathVariable , либо объявляя их одну за другой:
или поместить их все в Map String> или MultiValueMap String> : String>
Q6. Проверка с использованием Spring MVC
Spring MVC по умолчанию поддерживает спецификации JSR-303. Нам нужно добавить JSR-303 и его зависимости от реализации в наше приложение Spring MVC . Например, валидатор Hibernate является одной из реализаций JSR-303, имеющихся в нашем распоряжении.
JSR-303-это спецификация Java API для проверки компонентов, часть Jakarta EE и JavaSE, которая гарантирует, что свойства компонента соответствуют определенным критериям, используя такие аннотации , как @NotNull , @Min и @Max . Дополнительные сведения о проверке доступны в статье Основы проверки компонентов Java .
Spring предлагает @Validator аннотацию и BindingResult класс . Реализация Validator вызовет ошибки в методе обработчика запросов контроллера, если у нас есть недопустимые данные. Затем мы можем использовать класс BindingResult для получения этих ошибок.
Помимо использования существующих реализаций, мы можем сделать ваши собственные. Для этого сначала мы создаем аннотацию, соответствующую спецификациям JSR-303. Затем мы реализуем класс Validator . Другим способом было бы реализовать интерфейс Validator |/Spring и установить его в качестве валидатора через @InitBinder аннотацию в контроллере классе.
Чтобы узнать, как реализовать и использовать собственные проверки, пожалуйста, ознакомьтесь с руководством по пользовательской проверке в Spring MVC .
Q7. Что такое @RequestBody и @ResponseBody?
Аннотация @RequestBody , используемая в качестве параметра метода обработчика, связывает тело HTTP-запроса с передачей или объектом домена . Spring автоматически десериализует входящий HTTP-запрос к объекту Java с помощью преобразователей Http-сообщений.
Когда мы используем аннотацию @ResponseBody для метода обработчика в контроллере Spring MVC, это указывает на то, что мы запишем возвращаемый тип метода непосредственно в тело ответа HTTP . Мы не будем помещать его в Модель , и Spring не будет интерпретироваться как имя представления.
Пожалуйста, ознакомьтесь со статьей на @RequestBody и @ResponseBody, чтобы узнать более подробную информацию об этих аннотациях.
Q8. Объясните модель, карту модели и ModelAndView?
Интерфейс Model определяет держатель атрибутов модели . Карта Модели имеет аналогичную цель, с возможностью передачи набора значений . Затем он обрабатывает эти значения, как если бы они находились в пределах Map . Следует отметить, что в Model ( ModelMap ) мы можем хранить только данные. Мы вводим данные и возвращаем имя представления.
С другой стороны, с помощью ModelAndView мы возвращаем сам объект . Мы задаем всю необходимую информацию, такую как данные и имя представления, в возвращаемом объекте.
Вы можете найти более подробную информацию в статье о модели, ModelMap и ModelView .
Q9. Объясните атрибуты сеанса и Атрибут сеанса
Аннотация @sessionAttributes используется для хранения атрибута модели в сеансе пользователя. Мы используем его на уровне класса контроллера, как показано в нашей статье об атрибутах сеанса в Spring MVC :
В предыдущем примере атрибут модели ‘ todos ‘ будет добавлен в сеанс, если атрибут @ModelAttribute и атрибут @sessionAttributes имеют одно и то же имя.
Если мы хотим извлечь существующий атрибут из сеанса, управляемого глобально, мы будем использовать @Sessionattributes аннотацию в качестве параметра метода :
Q10. Какова цель @EnableWebMvc?
Цель аннотации @EnableWebMvc состоит в том, чтобы включить Spring MVC через конфигурацию Java . Это эквивалентно управляемый аннотациями> в конфигурации XML. Эта аннотация импортирует конфигурацию Spring MVC из WebMvcConfigurationSupport . Он включает поддержку @Controller -аннотированных классов, которые используют @RequestMapping для сопоставления входящих запросов с методом обработчика. управляемый аннотациями>
Вы можете узнать больше об этом и подобных аннотациях в нашем руководстве по аннотациям Spring @Enable .
Q11. Что такое ViewResolver весной?
ViewResolver позволяет приложению отображать модели в браузере – без привязки реализации к конкретной технологии представления – путем сопоставления имен представлений с фактическими представлениями .
Для получения более подробной информации о ViewResolver ознакомьтесь с нашим Руководством по ViewResolver в Spring MVC .
Q12. Что такое BindingResult?
BindingResult – это интерфейс из пакета org.springframework.validation , который представляет результаты привязки. Мы можем использовать его для обнаружения и сообщения об ошибках в представленной форме . Его легко вызвать — нам просто нужно убедиться, что мы поместили его в качестве параметра сразу после объекта формы, который мы проверяем. Необязательный параметр Model должен следовать за параметром BindingResult , как это можно увидеть в учебнике custom validator :
Когда Spring увидит аннотацию @Valid , он сначала попытается найти валидатор для проверяемого объекта. Затем он подберет аннотации проверки и вызовет валидатор. Наконец, он поместит найденные ошибки в BindingResult и добавит последний в viewmodel.
Q13. Что такое объект поддержки формы?
Объект поддержки формы или объект команды-это просто POJO, который собирает данные из формы, которую мы отправляем .
Мы должны иметь в виду, что он не содержит никакой логики, только данные.
Чтобы узнать, как использовать объект поддержки форм с формами в Spring MVC, пожалуйста, ознакомьтесь с нашей статьей о формах в Spring MVC .
Q14. Какова роль аннотации @Qualifier?
Он используется одновременно с аннотацией @Autowired , чтобы избежать путаницы при наличии нескольких экземпляров типа bean .
Давайте рассмотрим пример. Мы объявили два похожих компонента в конфигурации XML:
Когда мы попытаемся подключить боб, мы получим org.springframework.beans.factory.Исключение NoSuchBeanDefinitionException. Чтобы исправить это, нам нужно использовать @Qualifier , чтобы сообщить Spring о том, какой боб должен быть подключен:
Q15. Какова роль аннотации @Required?
То @Требуется аннотация используется в методах сеттера, и это указывает на то, что свойство компонента, содержащее эту аннотацию, должно быть заполнено во время настройки. В противном случае пружинный контейнер выбросит BeanInitializationException исключение.
Кроме того, @Required отличается от @Autowired – поскольку он ограничен сеттером, в то время как @Autowired – нет. @Autowired также можно использовать для связи с конструктором и полем, в то время как @Required проверяет только, задано ли свойство.
Давайте рассмотрим пример:
Теперь имя компонента Person должно быть задано в XML-конфигурации следующим образом:
Обратите внимание, что @Required не работает с классами на основе Java @Configuration по умолчанию . Если вам нужно убедиться, что все ваши свойства заданы, вы можете сделать это при создании компонента в аннотированных методах @Bean .
Q16. Опишите шаблон переднего контроллера
В шаблоне переднего контроллера все запросы сначала будут отправляться переднему контроллеру, а не сервлету . Он убедится, что ответы готовы, и отправит их обратно в браузер. Таким образом, у нас есть одно место, где мы контролируем все, что приходит из внешнего мира.
Передний контроллер определит сервлет, который должен сначала обработать запрос. Затем, когда он получит данные обратно из сервлета, он решит, какое представление отрисовывать, и, наконец, отправит отрисованное представление обратно в качестве ответа:
Чтобы ознакомиться с подробностями реализации, пожалуйста, ознакомьтесь с нашим Руководством по шаблону переднего контроллера в Java .
Q17. Что такое архитектура Модели 1 и Модели 2?
Модель 1 и Модель 2 представляют собой две часто используемые модели проектирования, когда речь заходит о разработке веб-приложений Java.
В модели 1 запрос поступает в сервлет или JSP, где он обрабатывается . Сервлет или JSP обрабатывает запрос, обрабатывает бизнес-логику, извлекает и проверяет данные и генерирует ответ:
Поскольку эта архитектура проста в реализации, мы обычно используем ее в небольших и простых приложениях.
С другой стороны, это не удобно для крупномасштабных веб-приложений. Функциональные возможности часто дублируются в JSP, где бизнес-логика и логика представления взаимосвязаны.
Модель 2 основана на шаблоне проектирования контроллера представления модели и отделяет представление от логики, которая управляет содержимым.
Кроме того, мы можем выделить три модуля в шаблоне MVC: модель, представление и контроллер . Модель представляет собой динамическую структуру данных приложения. Он отвечает за манипуляции с данными и бизнес-логикой. Представление отвечает за отображение данных, в то время как контроллер служит интерфейсом между двумя предыдущими.
В модели 2 запрос передается контроллеру, который обрабатывает необходимую логику для получения правильного содержимого, которое должно отображаться. Затем контроллер помещает содержимое обратно в запрос, как правило, в виде JavaBean или POJO. Он также решает, какое представление должно отображать содержимое, и, наконец, передает ему запрос. Затем представление отображает данные:
3. Расширенные вопросы Spring MVC
Q18. В чем разница между аннотациями @Controller, @Component, @Repository и @Service весной?
Согласно официальной документации Spring, @Component является общим стереотипом для любого компонента, управляемого Spring. @Repository , @Service и @Controller являются специализациями @Component для более конкретных случаев использования , например, на уровнях сохранения, обслуживания и представления соответственно.
Давайте рассмотрим конкретные примеры использования последних трех:
- @Controller – указывает, что класс выполняет роль контроллера, и обнаруживает @RequestMapping аннотации внутри класса
- @Service – указывает, что класс содержит бизнес-логику и вызывает методы на уровне репозитория
- @Repository – указывает, что класс определяет хранилище данных; его задача состоит в том, чтобы перехватывать исключения, зависящие от платформы, и повторно выбрасывать их как одно из унифицированных непроверенных исключений Spring
Q19. Что такое DispatcherServlet и ContextLoaderListener?
Проще говоря, в шаблоне проектирования переднего контроллера один контроллер отвечает за направление входящих HttpRequests для всех других контроллеров и обработчиков приложения.
Пружины DispatcherServlet реализует этот шаблон и, следовательно, несет ответственность за правильную координацию Http-запросы к правым обработчикам.
С другой стороны, ContextLoaderListener запускает и закрывает корневой каталог Spring WebApplicationContext . Он связывает жизненный цикл ApplicationContext с жизненным циклом ServletContext. Мы можем использовать его для определения общих компонентов, работающих в разных контекстах Spring.
Для получения более подробной информации о DispatcherServlet , пожалуйста, обратитесь к этому учебнику .
Q20. Что такое МногокомпОнентный решатель и Когда Его Следует использовать?
Интерфейс MultipartResolver используется для загрузки файлов . Фреймворк Spring предоставляет одну реализацию MultipartResolver для использования с Commons FileUpload и другую для использования с анализом составных запросов Servlet 3.0.
Используя их, мы можем поддерживать загрузку файлов в наших веб-приложениях.
Q21. Что такое перехватчик Spring MVC и как его использовать?
Перехватчики Spring MVC позволяют нам перехватывать запрос клиента и обрабатывать его в трех местах – до обработки, после обработки или после завершения (когда представление отображается) запроса.
Перехватчик можно использовать для сквозных задач и для того, чтобы избежать повторяющегося кода обработчика, такого как ведение журнала, изменение глобально используемых параметров в модели Spring и т. Д.
Для получения подробной информации и различных реализаций ознакомьтесь со статьей Введение в Spring MVC HandlerInterceptor.
Q22. Что такое InitBinder?
Метод с аннотацией @InitBinder используется для настройки параметра запроса, шаблона URI и резервного копирования объектов/command . Мы определяем его в контроллере, и он помогает контролировать запрос. В этом методе мы регистрируем и настраиваем наш пользовательский Редактор свойств s, форматер и валидатор .
В аннотации есть элемент ‘ value ‘. Если мы не установим его, аннотированные методы @InitBinder будут вызываться при каждом HTTP-запросе. Если мы зададим значение, методы будут применяться только для определенных атрибутов команд/форм и/или параметров запроса, имена которых соответствуют элементу ‘ value ‘.
Важно помнить, что одним из аргументов должен быть WebDataBinder. Другие аргументы могут быть любого типа, поддерживаемого методами обработчика, за исключением объектов команд/форм и соответствующих объектов результатов проверки.
Q23. Объясните совет контроллера
Аннотация @ControllerAdvice позволяет нам писать глобальный код, применимый к широкому спектру контроллеров . Мы можем привязать диапазон контроллеров к выбранному пакету или определенной аннотации.
По умолчанию @ControllerAdvice применяется к классам, аннотированным @Controller (или @RestController ) . У нас также есть несколько свойств, которые мы используем, если хотим быть более конкретными.
Если мы хотим ограничить применимые классы пакетом, мы должны добавить имя пакета в аннотацию :
Также можно использовать несколько пакетов, но на этот раз нам нужно использовать массив вместо строки |.
Помимо ограничения пакета по его имени, мы можем сделать это, используя один из классов или интерфейсов из этого пакета :
Элемент ‘ назначаемые типы ‘применяет @ControllerAdvice к конкретным классам, в то время как’ аннотации ‘ делает это для конкретных аннотаций.
Следует помнить, что мы должны использовать его вместе с @ExceptionHandler . Эта комбинация позволит нам настроить глобальный и более конкретный механизм обработки ошибок без необходимости реализовывать его каждый раз для каждого класса контроллера.
Q24. Что делает аннотация @ExceptionHandler?
Аннотация @ExceptionHandler позволяет нам определить метод, который будет обрабатывать исключения . Мы можем использовать аннотацию независимо, но гораздо лучше использовать ее вместе с @ControllerAdvice . Таким образом, мы можем настроить глобальный механизм обработки ошибок. Таким образом, нам не нужно писать код для обработки исключений в каждом контроллере .
Давайте рассмотрим пример из нашей статьи об обработке ошибок для REST с помощью Spring:
Мы также должны отметить, что это обеспечит @ExceptionHandler методы для всех контроллеров, которые выбрасывают IllegalArgumentException или IllegalStateException . Исключения, объявленные с помощью @ExceptionHandler , должны соответствовать исключению, используемому в качестве аргумента метода. В противном случае механизм разрешения исключений выйдет из строя во время выполнения.
Здесь следует иметь в виду, что можно определить более одного @ExceptionHandler за тем же исключением. Мы не можем сделать это в одном классе, хотя, поскольку Весна будет жаловаться, создавая исключение и отказывая при запуске.
С другой стороны, если мы определим их в двух отдельных классах, приложение запустится, но оно будет использовать первый найденный обработчик, возможно, неправильный .
Q25. Обработка исключений в веб-приложениях
У нас есть три варианта обработки исключений в Spring MVC:
- за исключением
- на контроллер
- глобально
Если во время обработки веб-запроса возникнет необработанное исключение, сервер вернет ответ HTTP 500. Чтобы предотвратить это, мы должны аннотировать любое из наших пользовательских исключений с помощью @ResponseStatus аннотации . Такого рода исключения разрешаются HandlerExceptionResolver .
Это приведет к тому, что сервер вернет соответствующий HTTP-ответ с указанным кодом состояния, когда метод контроллера вызовет наше исключение. Мы должны иметь в виду, что мы не должны обрабатывать наше исключение где-то еще, чтобы этот подход работал.
Другой способ обработки исключений-использование @ExceptionHandler аннотации . Мы добавляем @ExceptionHandler методы к любому контроллеру и используем их для обработки исключений, создаваемых внутри этого контроллера. Эти методы могут обрабатывать исключения без аннотации @ResponseStatus , перенаправлять пользователя в специальное представление ошибок или создавать полностью настраиваемый ответ на ошибку.
Мы также можем передать связанные с сервлетом объекты ( HttpServletRequest , HttpServletResponse , HttpSession и Principal ) в качестве параметров методов обработчика. Но мы должны помнить, что мы не можем напрямую указать объект Model в качестве параметра.
Третий вариант обработки ошибок-это @ControllerAdvice classes . Это позволит нам применить те же методы, только на этот раз на уровне приложения, а не только к конкретному контроллеру. Чтобы включить это, нам нужно использовать @ControllerAdvice и @ExceptionHandler вместе. Таким образом, обработчики исключений будут обрабатывать исключения, создаваемые любым контроллером.
Для получения более подробной информации по этому вопросу ознакомьтесь со статьей Обработка ошибок для REST с помощью Spring.
4. Заключение
В этой статье мы рассмотрели некоторые вопросы, связанные с Spring MVC, которые могут возникнуть на техническом собеседовании для разработчиков Spring. Вы должны принять эти вопросы во внимание в качестве отправной точки для дальнейших исследований, поскольку это ни в коем случае не исчерпывающий список.
Похожие публикации:
- Кто создал вр очки
- Мультиварка что можно в ней готовить
- Pls экран смартфона что это
- При какой температуре можно хранить холодильник в гараже
