Рубрики
Без рубрики

Адаптеры HandlerAdapters в Spring MVC

Узнайте, как работают адаптеры с пружинными ручками, на примере выполняемых примеров.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы сосредоточимся на различных реализациях адаптеров обработчиков, доступных в Spring framework.

2. Что такое Handleradapter?

HandlerAdapter – это в основном интерфейс, который облегчает обработку HTTP-запросов очень гибким способом в Spring MVC.

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

Затем DispatcherServlet использует HandlerAdapter для вызова этого метода. Сервлет не вызывает метод напрямую – он в основном служит мостом между собой и объектами обработчика, что приводит к слабо связанному дизайну.

Давайте рассмотрим различные методы, доступные в этом интерфейсе:

public interface HandlerAdapter {
    boolean supports(Object handler);
    
    ModelAndView handle(
      HttpServletRequest request,
      HttpServletResponse response, 
      Object handler) throws Exception;
    
    long getLastModified(HttpServletRequest request, Object handler);
}

API supports используется для проверки того, поддерживается ли конкретный экземпляр обработчика или нет. Этот метод должен быть вызван первым перед вызовом метода handle() этого интерфейса, чтобы убедиться, поддерживается ли экземпляр обработчика или нет.

API handle используется для обработки конкретного HTTP-запроса. Этот метод отвечает за вызов обработчика, передавая объект HttpServletRequest и HttpServletResponse в качестве параметра. Затем обработчик выполняет логику приложения и возвращает объект ModelAndView , который затем обрабатывается DispatcherServlet .

3. Зависимость Maven

Давайте начнем с зависимости Maven, которую необходимо добавить в pom.xml :


    org.springframework
    spring-webmvc
    5.2.8.RELEASE

Последнюю версию spring-webmvc artifactid можно найти здесь .

4. Типы адаптеров HandlerAdapter

4.1. SimpleControllerHandlerAdapter

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

Если веб-приложение использует только контроллеры, то нам не нужно настраивать какой-либо HandlerAdapter , поскольку фреймворк использует этот класс в качестве адаптера по умолчанию для обработки запроса.

Давайте определим простой класс контроллера, используя более старый стиль контроллера (реализующий интерфейс Controller ):

public class SimpleController implements Controller {
    @Override
    public ModelAndView handleRequest(
      HttpServletRequest request, 
      HttpServletResponse response) throws Exception {
        
        ModelAndView model = new ModelAndView("Greeting");
        model.addObject("message", "Dinesh Madhwal");
        return model;
    }
}

Аналогичная конфигурация XML:


    
    
        
        
    

Класс BeanNameUrlHandlerMapping является классом сопоставления для этого адаптера обработчика.

Примечание : Если в BeanFactory определен адаптер пользовательского обработчика, этот адаптер не регистрируется автоматически. Таким образом, нам нужно явно определить его в контексте. Если он не определен, и мы определили пользовательский адаптер обработчика, то мы получим исключение, в котором говорится, что адаптер для обработчика не указан.

4.2. Простой обработчик сервлетов

Этот адаптер обработчика позволяет использовать любой сервлет для работы с DispatcherServlet для обработки запроса. Он пересылает запрос из DispatcherServlet в соответствующий Сервлет класс, вызывая его service() метод .

Компоненты, реализующие интерфейс Servlet , автоматически обрабатываются этим адаптером. Он не зарегистрирован по умолчанию, и нам нужно зарегистрировать его, как и любой другой обычный компонент, в файле конфигурации DispatcherServlet :

4.3. Аннотацияметодхандлерадаптер

Этот класс адаптера используется для выполнения методов, аннотированных с помощью @RequestMapping аннотации. Он используется для сопоставления методов, основанных на методах HTTP и путях HTTP.

Класс сопоставления для этого адаптера – DefaultAnnotationHandlerMapping, который используется для обработки аннотации @RequestMapping на уровне типа и AnnotationMethodHandlerAdaptor используется для обработки на уровне метода.

Эти два класса уже зарегистрированы платформой при инициализации DispatcherServlet . Однако, если другие адаптеры обработчиков уже определены, нам также необходимо определить их в файле конфигурации.

Давайте определим класс контроллера:

@Controller
public class AnnotationHandler {
    @RequestMapping("/annotedName")
    public ModelAndView getEmployeeName() {
        ModelAndView model = new ModelAndView("Greeting");        
        model.addObject("message", "Dinesh");       
        return model;  
    }  
}

Аннотация @Controller указывает, что этот класс выполняет роль контроллера.

Аннотация @RequestMapping сопоставляет метод getEmployeeName() с именем URL /.

Существует 2 различных способа настройки этого адаптера в зависимости от того, использует ли приложение конфигурацию на основе Java или конфигурацию на основе XML. Давайте рассмотрим первый способ использования конфигурации Java:

@ComponentScan("com.baeldung.spring.controller")
@Configuration
@EnableWebMvc
public class ApplicationConfiguration implements WebMvcConfigurer {
    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

Если приложение использует конфигурацию XML, то существует два различных подхода к настройке этого адаптера обработчика в XML-контексте веб-приложения. Давайте рассмотрим первый подход, определенный в файле spring-servlet_AnnotationMethodHandlerAdapter.xml :


    
    
    
    
        
        
    

Тег /> используется для указания пакета для сканирования классов controller ./>

Давайте рассмотрим второй подход:


    
    
    
        
        
    

Тег аннотациями> автоматически зарегистрирует эти два класса в spring MVC. Этот адаптер устарел весной 3.2, а новый адаптер обработчика под названием RequestMappingHandlerAdapter был представлен весной 3.1. аннотациями>

4.4. RequestMappingHandlerAdapter

Этот класс адаптера был представлен весной 3.1, устранив Annotationmethodhandleradapter handleradapter весной 3.2.

Он используется с классом RequestMappingHandlerMapping , который выполняет методы, аннотированные @RequestMapping .

RequestMappingHandlerMapping используется для поддержания сопоставления URI запроса с обработчиком. Как только обработчик получен, DispatcherServlet отправляет запрос соответствующему адаптеру обработчика, который затем вызывает HandlerMethod().

Сопоставления уровня типа и уровня метода были обработаны в два разных этапа в весенней версии до версии 3.1.

Первый этап состоял в том, чтобы выбрать контроллер с помощью DefaultAnnotationHandlerMapping , а второй этап состоял в том, чтобы вызвать фактический метод с помощью AnnotationMethodHandlerAdapter .

Начиная с версии Spring 3.1, существует только один этап, который включает в себя идентификацию контроллера, а также метод, который необходимо вызвать для обработки запроса.

Давайте определим простой класс контроллера:

@Controller
public class RequestMappingHandler {
    
    @RequestMapping("/requestName")
    public ModelAndView getEmployeeName() {
        ModelAndView model = new ModelAndView("Greeting");        
        model.addObject("message", "Madhwal");        
        return model;  
    }  
}

Существует 2 различных способа настройки этого адаптера в зависимости от того, использует ли приложение конфигурацию на основе Java или конфигурацию на основе XML.

Давайте рассмотрим первый способ использования конфигурации Java:

@ComponentScan("com.baeldung.spring.controller")
@Configuration
@EnableWebMvc
public class ServletConfig implements WebMvcConfigurer {
    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

Если приложение использует конфигурацию XML, то существует два различных подхода к настройке этого адаптера обработчика в XML-контексте веб-приложения. Давайте рассмотрим первый подход, определенный в файле spring-servlet_RequestMappingHandlerAdapter.xml :


    
    
    
    
    
    
    
        
        
    

И вот второй подход:


    
    
    
    
    
        
        
    

Этот тег автоматически зарегистрирует эти два класса в Spring MVC.

Если нам нужно настроить RequestMappingHandlerMapping, тогда нам нужно удалить этот тег из XML-файла applicationcontext и вручную настроить его в XML-файле контекста приложения.

4.5. HttpRequestHandlerAdapter

Этот handleradapter используется для обработчиков, которые обрабатывают Http-запрос s. Он реализует интерфейс HttpRequestHandler , который содержит один метод handleRequest() для обработки запроса и генерации ответа.

Тип возвращаемого значения этого метода является void, и он не генерирует тип возвращаемого значения ModelAndView , как это было сделано другими адаптерами обработчиков. Он в основном используется для генерации двоичных ответов и не создает представление для визуализации.

5. Запуск приложения

Если приложение развернуто на localhost с номером порта 8082 а контекст-корень-это spring-mvc-обработчики :

http://localhost:8082/spring-mvc-handlers/

6. Заключение

В этой статье мы обсудили различные типы адаптеров обработчиков, доступных в Spring framework.

Большинство разработчиков, вероятно, будут придерживаться значений по умолчанию, но стоит понять, насколько гибка структура, когда нам нужно выйти за рамки основ.

Исходный код этого руководства можно найти в проекте GitHub .