Spring MVC分析篇——HandlerAdapter
一.HandlerAdapter设计原理
SpringMVC的第一步,通过HandleMapping找到了某个请求对应的Handler,现在Handler有了,但是不同的handler的执行逻辑完全不一样,实现了Controller接口的handler,直接调用handler的handleRequest(……)
方法就行,使用RequestMapping注解的handler,需要找到具体的方法再执行。所以为了统一Handler的处理逻辑,最合适的方法是采用适配器模式。
那么一个Handler适配器需要具备哪些功能呢?
- 统一的执行方法,方法的入参很简单,HttpServletRequest、HttpServletResponse和具体的handler,出参需要定义一个统一的模型,该模型尤为重要,一方面需要包括所有的内容请求处理的数据,另一方面需要指出这些数据的处理方式
- 第一步,我们有了一个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继承关系:
- SimpleControllerHandlerAdapter:适配实现了Controller接口的handler
- RequestMappingHandlerAdapter:适配通过@RequestMapping注解的handler,@RequestMapping注解的方法,会封装为HandleMethod对象,HandleMethod对象也就是真正的handler
- HttpRequestHandler:适配实现了HttpRequestHandler接口的handler
- SimpleServletHandlerAdapter:适配实现了Servlet接口的handler
除了RequestMappingHandlerAdapter外,其他的HandlerAdapter其实都比较简单,下面我们详细的分析一下RequestMappingHandlerAdapter。