上文中提到在DispatcherServlet.doDispatch()方法中,通过this.getHandlerAdapter(mappedHandler.getHandler());获取了请求适配器。
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
Iterator var2 = this.handlerAdapters.iterator();
HandlerAdapter ha;
do {
if (!var2.hasNext()) {
throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
ha = (HandlerAdapter)var2.next();
if (this.logger.isTraceEnabled()) {
this.logger.trace("Testing handler adapter [" + ha + "]");
}
} while(!ha.supports(handler));
return ha;
}
从以上代码中可以看出,通过遍历
private List<HandlerAdapter> handlerAdapters;
并调用 HandlerAdapter 的supports()来比较是否匹配handler
实现类为:
获取到HandlerAdapter对象后将会执行DispatchServlet类方法doDispatch()的以下代码段:
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (this.logger.isDebugEnabled()) {
this.logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
}
if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
return;
}
}
这段代码主要用来返回HTTP 304状态码。HTTP 304状态码作用是,客户端有缓存的文档并发出了一个条件性的请求后,服务器会通知客户端,原来缓存的文档对应的服务器端资源并未被修改,客户端还可以继续使用缓存文件。