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)

用来判断请求是否有被修改过,被修改过就直接退出返回了