美文网首页
springMVC(6) HandlerAdapter

springMVC(6) HandlerAdapter

作者: 谷和阿秋 | 来源:发表于2018-01-12 21:14 被阅读0次

在springMVC的执行流行流程中,当执行完handlerMapping获取到request对应的HandlerExecutionChain之后,下一步就是调用HandlerAdapter执行对应的Handler。那么这一次是来学习HandlerAdapter部分。

首先是HandlerAdapter接口

HandlerAdapter接口

public interface HandlerAdapter {

   boolean supports(Object handler);

   @Nullable
   ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

   long getLastModified(HttpServletRequest request, Object handler);

}

整个接口包含三个函数,根据注释我们可以知道如下信息:

supports()是用来判断一个handler是否属于该HandlerAdapter的,一个典型的实现方式是判断该handler的类型,通常来说一个HandlerAdapter只支持一种类型的handler。

handle()的作用是使用给定的handler去处理请求。

getLastModified()的作用和HttpServlet中的getLastModified一致,若是handler不支持getLastModified则直接返回-1。

接下来我们来看几种HandlerAdapter的实现方式。

HttpRequestHandlerAdapter类

public class HttpRequestHandlerAdapter implements HandlerAdapter {

   @Override
   public boolean supports(Object handler) {
      return (handler instanceof HttpRequestHandler);
   }

   @Override
   @Nullable
   public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
         throws Exception {

      ((HttpRequestHandler) handler).handleRequest(request, response);
      return null;
   }

   @Override
   public long getLastModified(HttpServletRequest request, Object handler) {
      if (handler instanceof LastModified) {
         return ((LastModified) handler).getLastModified(request);
      }
      return -1L;
   }

}

SimpleControllerHandlerAdapter类

public class SimpleControllerHandlerAdapter implements HandlerAdapter {

   @Override
   public boolean supports(Object handler) {
      return (handler instanceof Controller);
   }

   @Override
   @Nullable
   public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
         throws Exception {

      return ((Controller) handler).handleRequest(request, response);
   }

   @Override
   public long getLastModified(HttpServletRequest request, Object handler) {
      if (handler instanceof LastModified) {
         return ((LastModified) handler).getLastModified(request);
      }
      return -1L;
   }

}

SimpleServletHandlerAdapter类

public class SimpleServletHandlerAdapter implements HandlerAdapter {

   @Override
   public boolean supports(Object handler) {
      return (handler instanceof Servlet);
   }

   @Override
   @Nullable
   public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
         throws Exception {

      ((Servlet) handler).service(request, response);
      return null;
   }

   @Override
   public long getLastModified(HttpServletRequest request, Object handler) {
      return -1;
   }

}

至于还有一个RequestMappingHandlerAdapter,这个由于是处理注释的那种方式,中间的各种处理过程较为复杂,我们暂且不看。我们来分析一下这三个实现类的共性。

共性

我们可以发现这三个类几乎就是一个模子里刻出来的。

他们都是通过判断handler的类型来实现support方法的。

至于handle()方法,同样也是直接handler中相应的处理请求的方法来实现的。

getLastModified()也如注释所言,直接调用handler的getLastModified方法,若不支持则直接返回-1。

总结

根据名称以及内部的实现,我们可以知道HandlerAdapter的功能是一个适配器。因为对于不同的handler,它们处理请求的函数可能会有所不同,而HandlerAdapter的作用就是将这些不同的调用方式整合成同样的接口,方便外部调用。

相关文章

网友评论

      本文标题:springMVC(6) HandlerAdapter

      本文链接:https://www.haomeiwen.com/subject/jdkqoxtx.html