SpringMVC(二) -- HandlerAdapter
一.背景介绍
Adapter作为SpringMVC最重要的组件之一,跟Interceptor同等地位,它可以帮助我们在调用接口的前后做一个自定义的拓展。
二.源码分析
HandlerAdapter
处理程序适配器
public interface HandlerAdapter {
boolean supports(Object handler);
@Nullable
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
@Deprecated
long getLastModified(HttpServletRequest request, Object handler);
1.适配器 HandlerAdapter接口的实现链

2.MVC适配器的加载
HttpRequestHandlerAdapter

SimpleServletHandlerAdapter

自定义用法
public class SimpleController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return new ModelAndView(request.getRequestURI());
}
}
public class SimpleHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof SimpleController;
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
SimpleController controller = (SimpleController) handler;
return controller.handleRequest(request,response);
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return 0;
}
}
DispatcherServlet
public class DispatcherServlet extends FrameworkServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
..................................
ModelAndView mv = null;
..................................
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// Process last-modified header, if supported by the handler.
String method = request.getMethod();
boolean isGet = HttpMethod.GET.matches(method);
if (isGet || HttpMethod.HEAD.matches(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
return;
}
}
..................................
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
..................................
}
}
三.总结
通过源码分析我们可以知道,HandlerAdapter提供了三个方法
1.boolean supports(Object handler)
主要判断该适配器是否支持多种实现方式的handler(Controller,HttpRequestHandler,Servlet等)例如继承Controller的,基于注解控制器方式的,HttpRequestHandler方式的。
2.ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
用来执行适配器或者handler的处理函数,获取ModelAndView对象来传给View视图解析
3.long getLastModified(HttpServletRequest request, Object handler)
用来判断请求是否有被修改过,被修改过就直接退出返回了