一 . 概述
在前面的讲解之中,我们知道HandlerMapping将所有的请求转换为了HandlerExecutionChain对象.
这个对象之中包含一个Handler和一些拦截器对象.
本节就说明这个springmvc如何处理这些对象.
二 . HandlerAdapter
public interface HandlerAdapter { //确定该适配器是否支持该处理器 boolean supports(Object handler); //处理请求 ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; long getLastModified(HttpServletRequest request, Object handler); }
这是一个标准的适配器模式的实现.
我们看springmvc源码中是怎么调用的.
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { for (HandlerAdapter ha : this.handlerAdapters) { if (logger.isTraceEnabled()) { logger.trace("Testing handler adapter [" + ha + "]"); } if (ha.supports(handler)) { return ha; } } throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"); }
springmvc源码会从备选的处理器适配器之中选择一个合适的适配器进行处理.
三,备选的适配器
springmvc之中,默认使用下面的三个适配器.上面的那一个和RequestMappingHandlerMapping一样,都是为注解式开发准备的.
我们简要的看一下下面的三个实现类.
public class SimpleControllerHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof Controller);
这个适配器是专门处理Controller的.
public class SimpleServletHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof Servlet); }
这个适配器是专门处理Servlet的.
public class HttpRequestHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof HttpRequestHandler); }
这个适配器是专门处理 HttpRequestHandler的.