zoukankan      html  css  js  c++  java
  • spring mvc(5) HandlerAdapter

     前面我们讲到了通过HandlerMapping可以获得不同类型的处理器,可以是Controller、HttpRequestHandler、Servlet、HandlerMethod甚至是我们自定义的处理器。针对不同的处理器,需要调用不同的执行流程。HandlerAdapter的作用相当于将这个执行流程与DispatcherServlet进行了解耦

      DispatcherServlet在初始化是会加载所有容器中的HandlerAdapter,通过order属性进行排序。然后在对处理器调用时循环找到可以支持该处理器的HandlerAdapter,然后执行调用。如果容器中没有HandlerAdapter,会读取DispatcherServlet.properties配置,默认配置HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter、AnnotationMethodHandlerAdapter。

    DispatcherServlet初始化HandlerAdapter。

     1 private void initHandlerAdapters(ApplicationContext context) {
     2         this.handlerAdapters = null;
     3         
     4         if (this.detectAllHandlerAdapters) {
     5             // Find all HandlerAdapters in the ApplicationContext, including ancestor contexts.
     6             Map<String, HandlerAdapter> matchingBeans =
     7                     BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false);
     8             if (!matchingBeans.isEmpty()) {
     9                 this.handlerAdapters = new ArrayList<>(matchingBeans.values());
    10                 // We keep HandlerAdapters in sorted order.
    11                 AnnotationAwareOrderComparator.sort(this.handlerAdapters);
    12             }
    13         }
    14         else {
    15             //如果detectAllHandlerAdapters为false,则使用名为handlerAdapter的HandlerAdapter
    16             try {
    17                 HandlerAdapter ha = context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class);
    18                 this.handlerAdapters = Collections.singletonList(ha);
    19             }
    20             catch (NoSuchBeanDefinitionException ex) {
    21                 // Ignore, we'll add a default HandlerAdapter later.
    22             }
    23         }
    24 
    25         if (this.handlerAdapters == null) {
    26             this.handlerAdapters = getDefaultStrategies(context, HandlerAdapter.class);
    27             if (logger.isDebugEnabled()) {
    28                 logger.debug("No HandlerAdapters found in servlet '" + getServletName() + "': using default");
    29             }
    30         }
    31     }
    View Code

    spring mvc目前有一下的HandlerAdapter:

      SimpleControllerHandlerAdapter执行Controller的调用。

     1 public class SimpleControllerHandlerAdapter implements HandlerAdapter {
     2 
     3     @Override
     4     public boolean supports(Object handler) {
     5         return (handler instanceof Controller);
     6     }
     7 
     8     @Override
     9     @Nullable
    10     public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
    11             throws Exception {
    12 
    13         return ((Controller) handler).handleRequest(request, response);
    14     }
    15 
    16     @Override
    17     public long getLastModified(HttpServletRequest request, Object handler) {
    18         if (handler instanceof LastModified) {
    19             return ((LastModified) handler).getLastModified(request);
    20         }
    21         return -1L;
    22     }
    23 
    24 }
    View Code

      HttpRequestHandlerAdapter执行HttpRequestHandler调用。

     1 public class HttpRequestHandlerAdapter implements HandlerAdapter {
     2 
     3     @Override
     4     public boolean supports(Object handler) {
     5         return (handler instanceof HttpRequestHandler);
     6     }
     7 
     8     @Override
     9     @Nullable
    10     public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
    11             throws Exception {
    12 
    13         ((HttpRequestHandler) handler).handleRequest(request, response);
    14         return null;
    15     }
    16 
    17     @Override
    18     public long getLastModified(HttpServletRequest request, Object handler) {
    19         if (handler instanceof LastModified) {
    20             return ((LastModified) handler).getLastModified(request);
    21         }
    22         return -1L;
    23     }
    24 
    25 }
    View Code

      SimpleServletHandlerAdapter执行Servlet的调用。

     1 public class SimpleServletHandlerAdapter implements HandlerAdapter {
     2 
     3     @Override
     4     public boolean supports(Object handler) {
     5         return (handler instanceof Servlet);
     6     }
     7 
     8     @Override
     9     @Nullable
    10     public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
    11             throws Exception {
    12 
    13         ((Servlet) handler).service(request, response);
    14         return null;
    15     }
    16 
    17     @Override
    18     public long getLastModified(HttpServletRequest request, Object handler) {
    19         return -1;
    20     }
    21 
    22 }
    View Code

      

  • 相关阅读:
    利用javascript的prototype来实现stirng类的扩展并实现string的insert方法
    利用笔记本共享WIFI热点及利用Android手机共享WIFI热点
    语言模型发展综述
    基于阻变存储器阵列的低功耗神经网络存算一体结构研究进展综述
    2021年度总结
    【20220102】连岳摘抄
    【20220103】攻城计
    【20220104】人生很长
    【20220106】带孩子看牙医
    【20220110】怀孕不是一个人的事情
  • 原文地址:https://www.cnblogs.com/zhangwanhua/p/9370956.html
Copyright © 2011-2022 走看看