Spring mvc HandlerMapping VS HandlerAdapter

Я читал Spring MVC HandlerMapping и HandlerAdapter, но меня путают между этими двумя концепциями. Я могу понять, что HandlerMapping используется для отображения входящего HTTP-запроса на контроллер, но what is the use of HandlerAdapter?
why do we use it?
what is the exact difference between these two with example?
Пожалуйста, помогите мне в этом. Спасибо!

Ответ 1

Интерфейс стратегии HandlerAdapter принимает роль вызова методов обработчика, выбранных некоторыми HandlerMapping.

Если HandlerMapping выбирает контроллер, но не определенный метод, тогда HandlerAdapter также выбирает метод обработчика.

DispatcherServlet вызывает контроллеры с помощью объектов стратегии HandlerAdapter.

Это позволяет различным типам контроллеров использовать различные стратегии invokation метода. и стратегии сопоставления URL-адресов возможны.

Для установки новых типов стратегий активации обработчиков требуется зарегистрировать соответствующий HandlerAdapter bean.

Когда установлено несколько адаптеров HandlerAdapter, DispatcherServlet будет вызывать все, чтобы проверить первое, которое поддерживает объект обработчика, предоставленный HandlerMappingstrategy. Первый HandlerAdapter, который поддерживает объект обработчика (контроллер или метод), используется для вызова обработчика.

Spring MVC поддерживает несколько типов контроллеров, включая: контроллеры с определенными аннотациями (с @Controller), WebFlow FlowExecutor и т.д.

AnnotationMethodHandlerAdapter

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

Приложение AnnotationMethodHandlerAdapter может использоваться с контроллером с несколькими методами обработчика различными способами.

Ответ 2

Начиная с введения RequestMappingHandlerMapping и RequestMappingHandlerAdapter в Spring 3.1, различие еще проще: RequestMappingHandlerMapping находит соответствующий метод обработчика для данного запроса. RequestMappingHandlerAdapter выполняет этот метод, предоставляя ему все аргументы.

Ответ 3

HandlerMapping используется для сопоставления запроса обработчикам, то есть контроллерам. Например: DefaultAnnotationHandlerMapping, SimpleUrlHandlerMapping, BeanNameUrlHandlerMapping. DefaultAnnotationHandlerMapping.

<mvc:annotation-driven /> объявляет явную поддержку управляемых аннотацией MVC-контроллеров. Тег настраивает два beans (сопоставление и переход) DefaultAnnotationHandlerMapping и AnnotationMethodHandlerAdapter, поэтому вам не нужно объявлять их в файле конфигурации контекста.

HandlerAdapter - это в основном интерфейс, который очень упрощает обработку HTTP-запросов в Spring MVC. DispatcherServlet не вызывает метод напрямую - он в основном служит мостом между собой и объектами обработчика, что приводит к слабому дизайну сцепления.

public interface HandlerAdapter {
    //check if a particular handler instance is supported or not. 
    boolean supports(Object handler);

   //used to handle a particular HTTP request and returns ModelAndView object to DispatcherServlet
    ModelAndView handle(
      HttpServletRequest request,
      HttpServletResponse response, 
      Object handler) throws Exception;

    long getLastModified(HttpServletRequest request, Object handler);
}

Типы HandlerAdapter:
введите описание изображения здесь

AnnotationMethodHandlerAdapter: он выполняет методы, аннотированные с помощью @RequestMapping. AnnotationMethodHandlerAdapter устарел и заменен на RequestMappingHandlerAdapter из Spring 3.1+.

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

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

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

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:

<beans ...>
    <bean name="/greeting.html"
      class="com.baeldung.spring.controller.SimpleControllerHandlerAdapterExample"/>
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

для более