Springboot中访问静态资源也是通过DispatcherServlet。与访问方法请求一样也是走的这个方法:
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
不过使用的handlerAdapter类是HttpRequestHandlerAdapter.在上面mapperHandler.getHandler()方法中获取的handler是ResourceHttpRequestHandler类然后进入其方法:
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// For very general mappings (e.g. "/") we need to check 404 first
Resource resource = getResource(request);
@Override
@Nullable
public Resource resolveResource(
@Nullable HttpServletRequest request, String requestPath, List<? extends Resource> locations) {
ResourceResolver resolver = getNext();
if (resolver == null) {
return null;
}
try {
return resolver.resolveResource(request, requestPath, locations, this);
}
finally {
this.index--;
}
}
在resolver.resolveResource(request, requestPath, locations, this);方法中使用的是PathResourceResolver类,然后进入了其getResource()方法:
@Nullable
private Resource getResource(String resourcePath, @Nullable HttpServletRequest request,
List<? extends Resource> locations) {
for (Resource location : locations) {
try {
if (logger.isTraceEnabled()) {
logger.trace("Checking location: " + location);
}
String pathToUse = encodeIfNecessary(resourcePath, request, location);
Resource resource = getResource(pathToUse, location);
locations是resources下面的路径,有5个,分别是:/META-INF/resources,resources,/static, /public,以及一个ServletContext获取的路径,也是在resources文件夹下面,如果我们的静态文件在上面四个地址,可以通过http请求直接访问,同时通过ServletContext类也可以访问到resources文件夹下面的文件。
同时Springboot还提供了一个访问jar文件的路径:具有路径的任何资源 /webjars/**
都是从jar文件提供的