Spring mvc处理程序MapVS处理程序适配器

abithluo  于 2022-10-30  发布在  Spring
关注(0)|答案(3)|浏览(157)

我一直在阅读Spring MVC的HandlerMappingHandlerAdapter,但是我对这两个概念感到困惑。
why do we use it?
what is the exact difference between these two with example?
请帮我这个忙。谢谢!!

t40tm48m

t40tm48m1#

HandlerMapping用于将请求Map到处理程序(即控制器)。例如:默认注解处理程序Map、简单URL处理程序Map、Bean名称URL处理程序Map。默认注解处理程序Map。

<mvc:annotation-driven />声明了对注解驱动的MVC控制器的显式支持。该标记配置了两个bean(Map和适配器)DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter,因此您不需要在上下文配置文件中声明它们。

HandlerAdapter基本上是一个接口,它在Spring MVC中以一种非常灵活的方式促进了HTTP请求的处理。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);
}

处理程序适配器的类型:

注解方法处理程序适配器:它执行使用@RequestMapping注解的方法。AnnotationMethodHandlerAdapter已弃用,并由Spring 3.1+中的RequestMappingHandlerAdapter替换。

简单控制器处理程序适配器:这是SpringMVC注册的默认处理程序适配器,它处理实现Controller接口的类,用于将请求转发给一个控制器对象。
如果一个Web应用程序只使用控制器,那么我们不需要配置任何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配置:

<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>

for more

jmo0nnb3

jmo0nnb32#

我认为handlerMappings找到了相应的控制器类,而handlerAdpters则在控制器中找到了方法发现.请求:http://example.com/city/getCity?cid=1,则dispatcherServlet将通过handlerMappings获取CityController,然后handlerAdapter将在类中查找getCity()

ljsrvy3e

ljsrvy3e3#

自从在Spring3.1中引入了RequestMappingHandlerMapping和RequestMappingHandlerAdapter之后,这种区别就更加简单了:RequestMappingHandlerMapping为给定的请求查找适当的处理程序方法。RequestMappingHandlerAdapter执行此方法,并向其提供所有参数。

相关问题