HandlerAdapter的作用:
为什么要有适配器:
因为处理器 handler 的存在形式会有不同,且具体处理请求的方法也会各不相同:
handler 为 org.springframework.web.servlet.mvc.Controller 类型的 Bean 时,则调用其 handleRequest() 方法处理请求
handler 为 org.springframework.web.HttpRequestHandler 类型的 Bean 时,则调用其 handleRequest() 方法处理请求
handler 为 javax.servlet.Servlet 类型的 Bean 时,则调用其 service() 方法处理请求
handler 为 org.springframework.web.method.HandlerMethod 类型的对象时,则调用其 invokeAndHandle() 方法处理请求
所以,为了将处理请求的代码在形式上做统一,所以采用了适配器模式(对外统一,使用某种适配器,间接地操控某同种类型的 handler)
抽离出 HandlerAdapter 对象,统一调用 HandlerAdapter 的 handle() 方法来处理请求(这种基本的抽象能力,我们需要学习)
public interface HandlerAdapter {
boolean supports(Object handler); //当前适配器,是否适配于这个handler
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; //调用handler中处理请求的方法
//...
}
来看一下都有哪些处理器适配器的实现:
对于org.springframework.web.servlet.mvc.Controller 类型的 handler,使用 SimpleControllerHandlerAdapter 进行适配
对于org.springframework.web.HttpRequestHandler 类型的 handler,使用 HttpRequestHandlerAdapter 进行适配
对于javax.servlet.Servlet 类型的 handler,使用 SimpleServletHandlerAdapter 进行适配
对于org.springframework.web.method.Method类型的 handler,使用 RequestMappingHandlerAdapter 进行适配 (开发中常用的HandlerAdapter)
举例:HttpRequestHandler
public class HttpRequestHandlerAdapter implements HandlerAdapter {
// 若当前 handler 为 HttpRequestHandler 类型,则返回true,表示支持适配
@Override
public boolean supports(Object handler) {
return (handler instanceof HttpRequestHandler);
}
//调用 HttpRequestHandler 类型的 handler 的 handleRequest() 方法处理请求
@Override
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
((HttpRequestHandler) handler).handleRequest(request, response);
return null;
}
//...
}
适配器模式
HandlerAdapter的使用:
DispatcherServlet # doDispatch 方法中对 HandlerAdapter 的使用:(有两句代码)
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
① getHandlerAdapter() 方法:根据指定的 handler 得到合适的 HandlerAdapter
遍历所有的 handlerAdapters,分别调用其supports() 方法判断当前 handlerAdapter 是否适配该 handler
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
// 若 adapter 适配当前 handler,则返回
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("...");
}
② ha.handle():调用 handler 中相应的处理请求方法,来处理请求