我们都知道在SpringMVC请求流程中,会将Handler交给HandlerAdapter处理,HandlerAdapter调用具体的实现类来处理Handler。适配器模式就是屏蔽了不一致的细节。
SpringMVC请求流程
https://blog.csdn.net/qq_36781505/article/details/89509213
1.先看一下HandlerAdapter的继承关系图
HandlerAdapter接口有四个实现类。
2.然后是HandlerAdapter接口的方法
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
接口里面一共三个方法
boolean supports(Object handler)
:通过看名字就能猜出来,就是判断该适配器是否支持这个Handler。我们看一个它的实现类。来看一下这个方法具体是怎么实现的
public class HttpRequestHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof HttpRequestHandler);
}
...
}
是不是很简单呢,就判断handler是不是该HTTPRequestHandler的子类就行了。其它适配器也是这样实现的,这里便不再赘述。
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
: 这个方法就是具体的逻辑处理方法了。我们同样来看一个他的实现类的方法
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
((HttpRequestHandler) handler).handleRequest(request, response);
return null;
}
在这个方法里来调用传递过来的Handler里面的方法
3.具体流程
DispatcherServlet.java
部分源码
private List<HandlerAdapter> handlerAdapters;
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
处理的时候遍历List里面的HandlerAdapter。然后调用其supports(Handler handleer)
方法找到对应的适配器。