在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的作用就是将这些不同的调用方式整合成同样的接口,方便外部调用。
网友评论