Spring MVC分析篇——HandlerAdapter

一.HandlerAdapter设计原理

  SpringMVC的第一步,通过HandleMapping找到了某个请求对应的Handler,现在Handler有了,但是不同的handler的执行逻辑完全不一样,实现了Controller接口的handler,直接调用handler的handleRequest(……)方法就行,使用RequestMapping注解的handler,需要找到具体的方法再执行。所以为了统一Handler的处理逻辑,最合适的方法是采用适配器模式。

那么一个Handler适配器需要具备哪些功能呢?

  1. 统一的执行方法,方法的入参很简单,HttpServletRequest、HttpServletResponse和具体的handler,出参需要定义一个统一的模型,该模型尤为重要,一方面需要包括所有的内容请求处理的数据,另一方面需要指出这些数据的处理方式
  2. 第一步,我们有了一个Handler,那么第二步需要做的是根据handler找到handler对应的HandlerAdapter
public interface HandlerAdapter {

	// 判断该HandlerAdapter是否支持指定的handler
	boolean supports(Object handler);

    // 执行handler
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

	long getLastModified(HttpServletRequest request, Object handler);

}

public class ModelAndView {

	private Object view;

	private ModelMap model;

	private HttpStatus status;

	private boolean cleared = false;
}

HandlerAdapter继承关系:
Spring MVC分析篇——HandlerAdapter

  1. SimpleControllerHandlerAdapter:适配实现了Controller接口的handler
  2. RequestMappingHandlerAdapter:适配通过@RequestMapping注解的handler,@RequestMapping注解的方法,会封装为HandleMethod对象,HandleMethod对象也就是真正的handler
  3. HttpRequestHandler:适配实现了HttpRequestHandler接口的handler
  4. SimpleServletHandlerAdapter:适配实现了Servlet接口的handler

除了RequestMappingHandlerAdapter外,其他的HandlerAdapter其实都比较简单,下面我们详细的分析一下RequestMappingHandlerAdapter。

二.RequestMappingHandlerAdapter