目录
  1. HandlerAdapter接口
  2. HttpRequestHandlerAdapter类
  3. SimpleControllerHandlerAdapter类
  4. SimpleServletHandlerAdapter类
  5. 共性
  6. 总结
springMVC(6) HandlerAdapter

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

首先是HandlerAdapter接口

HandlerAdapter接口

1
2
3
4
5
6
7
8
9
10
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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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的作用就是将这些不同的调用方式整合成同样的接口,方便外部调用。

文章作者: 谷河
文章链接: https://www.lyytaw.com/spring/springMVC(6)-HandlerAdapter/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 谷河|BLOG