Чем контроллер отличается от сервлета
Перейти к содержимому

Чем контроллер отличается от сервлета

  • автор:

Аналог 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 != приложение. Это его составная часть. Их может быть много, может быть один.

В чем разница между Контроллером и Сервлетом?

Я не знаю, в чем основные различия между ними и какие преимущества имеют сервлет и контроллер.

Поделиться Источник 07 мая 2019 в 08:10

2 ответа

Я не знаю, в чем основная разница между ними.

Какие преимущества имеют сервлеты.

Чтобы ответить на это, вам нужно понять, для чего они были предназначены. В основном, их основная цель — отвечать на запросы динамическим и независимым (от других сервлетов) образом.

Они могут быть статичными.
Они могут управлять сессиями.
Они могут общаться с другими сервлетами.
Они легко переносимы.
Жизненный цикл сервлета обычно управляется контейнером, который упрощает работу.

Вопрос немного расплывчатый, и трудно ответить на него вкратце. Лучше бы вам получить практический опыт работы с обоими. Перед этим просмотрите материалы, которые я упомянул ниже.

Поделиться 07 мая 2019 в 08:26

Контроллер является частью шаблона Model-View-Controller:

Model-View-Controller (обычно известный как MVC) является архитектурным шаблоном, который обычно используется для разработки пользовательских интерфейсов, которые делят приложение на три взаимосвязанные части. Это делается для разделения внутренних представлений информации от способов, которыми информация представлена и принимается от пользователя.1 Шаблон проектирования MVC разделяет эти основные компоненты, позволяя эффективное повторное использование кода и параллельную разработку.

Сервлет может быть Контроллером

Контроллер выступает в качестве интерфейса между View и Model. Контроллер перехватывает все входящие запросы.

Модель представляет состояние приложения, т.е. данные. Она также может иметь бизнес-логику.

Но не обязательно (может выполнять «model»/»view» операции).

Ответы на вопросы на собеседование Spring Framework (часть 3).

Ключевым интерфейсом в Spring MVC является Controller. Контроллер обрабатывает запросы к действиям, осуществляемые пользователями в пользовательском интерфейсе, взаимодействуя с уровнем обслуживания, обновляя модель и направляя пользователей на соответствующие представления в зависимости от результатов выполнения. Controller — управление, связь между моделью и видом.

Основным контроллером в Spring MVC является org.springframework.web.servlet.DispatcherServlet. Задается аннотацией @Controller и часто используется с аннотацией @RequestMapping, которая указывает какие запросы будут обрабатываться этим контроллером.

  • Какая разница между аннотациями @Component, @Repository и @Service в Spring?

@Component — используется для указания класса в качестве компонента spring. При использовании поиска аннотаций, такой класс будет сконфигурирован как spring bean.

@Controller — специальный тип класса, применяемый в MVC приложениях. Обрабатывает запросы и часто используется с аннотацией @RequestMapping.

@Repository — указывает, что класс используется для работы с поиском, получением и хранением данных. Аннотация может использоваться для реализации шаблона DAO.

@Service — указывает, что класс является сервисом для реализации бизнес логики (на самом деле не отличается от Component, но просто помогает разработчику указать смысловую нагрузку класса).

Для указания контейнеру на класс-бин можно использовать любую из этих аннотаций. Но различные имена позволяют различать назначение того или иного класса.

  • Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener.

DispatcherServlet — сервлет диспатчер. Этот сервлет анализирует запросы и направляет их соответствующему контроллеру для обработки. В Spring MVC класс DispatcherServlet является центральным сервлетом, который получает запросы и направляет их соответствующим контроллерам. В приложении Spring MVC может существовать произвольное количество экземпляров DispatcherServlet, предназначенных для разных целей (например, для обработки запросов пользовательского интерфейса, запросов веб-служб REST и т.д.). Каждый экземпляр DispatcherServlet имеет собственную конфигурацию WebApplicationContext, которая определяет характеристики уровня сервлета, такие как контроллеры, поддерживающие сервлет, отображение обработчиков, распознавание представлений, интернационализация, оформление темами, проверка достоверности, преобразование типов и форматирование и т.п.

ContextLoaderListener — слушатель при старте и завершении корневого класса Spring WebApplicationContext. Основным назначением является связывание жизненного цикла ApplicationContext и ServletContext, а так же автоматического создания ApplicationContext. Можно использовать этот класс для доступа к бинам из различных контекстов спринг. Настраивается в web.xml:

  • Что такое ViewResolver в Spring?

ViewResolver — распознаватель представлений. Интерфейс ViewResolver в Spring MVC (из пакета org.springframework.web.servlet) поддерживает распознавание представлений на основе логического имени, возвращаемого контроллером. Для поддержки различных механизмов распознавания представлений предусмотрено множество классов реализации. Например, класс UrlBasedViewResolver поддерживает прямое преобразование логических имен в URL. Класс ContentNegotiatingViewResolver поддерживает динамическое распознавание представлений в зависимости от типа медиа, поддерживаемого клиентом (XML, PDF, JSON и т.д.). Существует также несколько реализаций для интеграции с различными технологиями представлений, такими как FreeMarker (FreeMarkerViewResolver), Velocity (VelocityViewResolver) и JasperReports (JasperReportsViewResolver).

InternalResourceViewResolver — реализация ViewResolver, которая позволяет находить представления, которые возвращает контроллер для последующего перехода к нему. Ищет по заданному пути, префиксу, суффиксу и имени.

  • Что такое MultipartResolver и когда его использовать?

Интерфейс MultipartResolver используется для загрузки файлов. Существуют две реализации: CommonsMultipartResolver и StandardServletMultipartResolver, которые позволяют фреймворку загружать файлы. По умолчанию этот интерфейс не включается в приложении и необходимо указывать его в файле конфигурации. После настройки любой запрос о загрузке будет отправляться этому интерфейсу.

  • Как загрузить файл в Spring MVC?

Внутри спринг предусмотрен интерфейс MultipartResolver для обеспечения загрузки файлов. Фактически нужно настроить файл конфигурации для указания обработчика загрузки файлов, а затем задать необходимый метод в контроллере spring.

  • Как обрабатывать исключения в Spring MVC Framework?

В Spring MVC интерфейс HandlerExceptionResolver (из пакета org.springframework.web.servlet) предназначен для работы с непредвиденными исключениями, возникающими во время выполнения обработчиков. По умолчанию DispatcherServlet регистрирует класс DefaultHandlerExceptionResolver (из пакета org.springframework.web.servlet.mvc.support). Этот распознаватель обрабатывает определенные стандартные исключения Spring MVC, устанавливая специальный код состояния ответа. Можно также реализовать собственный обработчик исключений, аннотировав метод контроллера с помощью аннотации @ExceptionHandler и передав ей в качестве атрибута тип исключения. В общем случае обработку исключений можно описать таким образом:

Controller Based — указать методы для обработки исключения в классе контроллере. Для этого нужно пометить такие методы аннотацией @ExceptionHandler.

Global Exception Handler — для обработки глобальных исключений spring предоставляет аннотацию @ControllerAdvice.

HandlerExceptionResolver implementation – общие исключений большая часть времени обслуживают статические страницы. Spring Framework предоставляет интерфейс HandlerExceptionResolver, который позволяет задать глобального обработчика исключений. Реализацию этого интерфейса можно использовать для создания собственных глобальных обработчиков исключений в приложении.

  • Каковы минимальные настройки, чтобы создать приложение Spring MVC?

Для создания простого Spring MVC приложения необходимо пройти следующие шаги:

  • Добавить зависимости spring-context и spring-webmvc в проект.
  • Указать DispatcherServlet в web.xml для обработки запросов внутри приложения.
  • Задать определение spring bean (аннотацией или в xml).
  • Добавить определение view resolver для представлений.
  • Настроить класс контроллер для обработки клиентских запросов.
  • Как бы вы связали Spring MVC Framework и архитектуру MVC?

Модель (Model) — выступает любой Java bean в Spring. Внутри класса могут быть заданы различные атрибуты и свойства для использования в представлении.

Преставление (View) — JSP страница, HTML файл и т.п. служат для отображения необходимой информации пользователю. Представление передает обработку запросов к диспетчеру сервлетов (контроллеру).

DispatcherServlet (Controller) — это главный контроллер в приложении Spring MVC, который обрабатывает все входящие запросы и передает их для обработки в различные методы в контроллеры.

  • Как добиться локализации в приложениях Spring MVC?

Spring MVC предоставляет очень простую и удобную возможность локализации приложения. Для этого необходимо сделать следующее:

  • Создать файл resource bundle, в котором будут заданы различные варианты локализированной информации.
  • Определить messageSource в конфигурации Spring используя классы ResourceBundleMessageSource или ResourceBundleMessageSource.
  • Определить localceResolver класса CookieLocaleResolver для включения возможности переключения локали.
  • С помощью элемента spring:message DispatcherServlet будет определять в каком месте необходимо подставлять локализированное сообщение в ответе.

  • Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON?

Spring Framework позволяет создавать Resful веб сервисы и возвращать данные в формате JSON. Spring обеспечивает интеграцию с Jackson JSON API для возможности отправки JSON ответов в resful web сервисе. Для отправки ответа в формате JSON из Spring MVC приложения необходимо произвести следующие настройки:

Добавить зависимости Jackson JSON. С помощью maven это делается так:

Настроить бин RequestMappingHandlerAdapter в файле конфигурации Spring и задать свойство messageConverters на использование бина MappingJackson2HttpMessageConverter.

В контроллере указать с помощью аннотации @ResponseBody возвращение Object:

  • Как проверить (валидировать) данные формы в Spring Web MVC Framework?

Spring поддерживает аннотации валидации из JSR-303, а так же возможность создания своих реализаций классов валидаторов. Пример использования аннотаций:

  • Что вы знаете Spring MVC Interceptor и как он используется?

Перехватчики в Spring (Spring Interceptor) являются аналогом Servlet Filter и позволяют перехватывать запросы клиента и обрабатывать их. Перехватить запрос клиента можно в трех местах: preHandle, postHandle и afterCompletion.

  • preHandle — метод используется для обработки запросов, которые еще не были переданы в метода обработчик контроллера. Должен вернуть true для передачи следующему перехватчику или в handler method. False укажет на обработку запроса самим обработчиком и отсутствию необходимости передавать его дальше. Метод имеет возможность выкидывать исключения и пересылать ошибки к представлению.
  • postHandle — вызывается после handler method, но до обработки DispatcherServlet для передачи представлению. Может использоваться для добавления параметров в объект ModelAndView.
  • afterCompletion — вызывается после отрисовки представления.

Для создания обработчика необходимо расширить абстрактный класс HandlerInterceptorAdapter или реализовать интерфейс HandlerInterceptor. Так же нужно указать перехватчики в конфигурационном файле Spring.

  • Расскажите о Spring Security.

Проект Spring Security предоставляет широкие возможности для защиты приложения. Кроме стандартных настроек для аутентификации, авторизации и распределения ролей и маппинга доступных страниц, ссылок и т.п., предоставляет защиту от различных вариантов атак (например CSRF). Имеет множество различных настроек, но остается легким в использовании.

В чем разница между сервлетом и контроллером?

Lapita12

Главная мысль в разнице между сервлетом и контроллером заключается в том, что сервлеты — это низкоуровневые компоненты Java EE для обработки HTTP-запросов, а контроллеры — более высокоуровневая абстракция, использующая архитектуру MVC и фреймворки типа Spring MVC для организации логики обработки запросов.

OldJohn @OldJohn Автор вопроса

сервлет — для обработки HTTP-запросов
контроллер — для организации логики обработки запросов.

Или это одно и то же,или я чего то не понял

Сервлет разбирает http запрос, вычитывает заголовки, и тд, а контроллер определяет что пользователю по этому запросу нужно (какую вьюху вернуть, грубо говоря) правильно?

Lapita12

OldJohn, Ваши выражения в основном верны, но позвольте мне разъяснить их еще немного:

Сервлеты и контроллеры оба обрабатывают HTTP-запросы, но на разных уровнях абстракции и в разных контекстах.

Сервлет — это низкоуровневый компонент Java EE, который обрабатывает HTTP-запросы, разбирает заголовки и формирует HTTP-ответы. Сервлеты предоставляют базовую функциональность для обработки запросов, но обычно требуют больше кода для управления деталями и состоянием сессии.

Контроллер — это более высокоуровневая абстракция, которая использует архитектуру MVC и фреймворки, такие как Spring MVC. Контроллеры определяют логику обработки запросов и определяют, какие данные должны быть получены из модели и какие представления (view) должны быть отображены. Контроллеры упрощают и структурируют обработку запросов, предоставляя аннотации и соглашения для определения обработчиков запросов.

Cервлеты и контроллеры имеют разные цели и уровни абстракции, хотя оба обрабатывают HTTP-запросы. Сервлеты фокусируются на непосредственной обработке HTTP-запросов, а контроллеры организуют логику обработки запросов в контексте архитектуры MVC и фреймворков.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *