javascript
java httprequesthandler_Spring-webmvc源码解析之ResourceHttpRequestHandler
基于4.1.7.RELEASE
該類繼承了WebContentGenerator,WebContentGenerator可以對response進行設(shè)置header,設(shè)置緩存時間等操作,并且提供了對request的method的檢查功能。
ResourceHttpRequestHandler 在xml文件中的配置方法
當(dāng)spring檢測到這樣的配置,啟動時會在SimpleUrlHandlerMapping中將mapping中的值與ResourceHttpRequestHandler映射起來,當(dāng)有mapping對應(yīng)的請求進來時,spring會將請求轉(zhuǎn)給ResourceHttpRequestHandler處理
可以通過外界來設(shè)置其需要處理的locations和resourceResovlers,主要是通過下面這兩個方法
public void setLocations(List locations) {
Assert.notNull(locations, "Locations list must not be null");
this.locations.clear();
this.locations.addAll(locations);
}
public void setResourceResolvers(List resourceResolvers) {
this.resourceResolvers.clear();
if (resourceResolvers != null) {
this.resourceResolvers.addAll(resourceResolvers);
}
}
從構(gòu)造函數(shù)中可以看出
public ResourceHttpRequestHandler() {
super(METHOD_GET, METHOD_HEAD);
this.resourceResolvers.add(new PathResourceResolver());
}
在處理resourceResovlers時,默認會配置一個PathResourceResolver,如果是指定Resolvers列表,spring建議將PathResourceResolver放在列表中最后一個。那么PathResourceResolver是干什么的呢?來看看它的注釋(已刪除無關(guān)注釋)
/**
* A simple {@code ResourceResolver} that tries to find a resource under the given
* locations matching to the request path.
*/
public class PathResourceResolver extends AbstractResourceResolver
注釋里講明了這個類會在request請求來時,根據(jù)request的path嘗試在配置好的locations中尋找對應(yīng)的資源。那么它是怎么判斷是否是對應(yīng)的資源呢?
后面ResourceResolver會講到。
下面我們來看handlerRequest方法,這個方法會對response返回3種情況
404 : 檢查請求的資源是否在配置列表中?如果請求的資源不在列表中則返回404。
304 : 請求的資源已存在配置列表中,但是請求header中的last-modified參數(shù)比資源的last-modified的時間戳新,則返回304。
返回數(shù)據(jù) : 請求的header時間戳比資源時間戳舊,或者header中沒有l(wèi)ast-modified,那么返回正常數(shù)據(jù)并設(shè)置header緩存為1年。
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
checkAndPrepare(request, response, true);
// 檢查請求路徑與資源文件對應(yīng)關(guān)系
Resource resource = getResource(request);
if (resource == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
// check the resource's media type
MediaType mediaType = getMediaType(resource);
//代碼已簡潔 作用為log日志mediaType是否存在
// 檢查時間戳 會給response設(shè)置304
if (new ServletWebRequest(request, response).checkNotModified(resource.lastModified())) {
logger.trace("Resource not modified - returning 304");
return;
}
setHeaders(response, resource, mediaType);
// http method 方法
if (METHOD_HEAD.equals(request.getMethod())) {
logger.trace("HEAD request - skipping content");
return;
}
//將資源內(nèi)容寫入response的outPutStream
writeContent(response, resource);
}
總結(jié)
以上是生活随笔為你收集整理的java httprequesthandler_Spring-webmvc源码解析之ResourceHttpRequestHandler的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 营口银行属于民营的吗 哪一年成立的
- 下一篇: 二战M5坦克歼击车