> For the complete documentation index, see [llms.txt](https://jack80342.gitbook.io/spring-boot/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jack80342.gitbook.io/spring-boot/iv.-spring-boot-features/27.-developing-web-applications/27.1.-the-spring-web-mvc-framework/27.1.5.-static-content.md).

# 27.1.5. 静态内容

默认情况下，Spring Boot从classpath下的`/static`（`/public`，`/resources`或`/META-INF/resources`）文件夹，或从`ServletContext`根目录提供静态内容。这是通过Spring MVC的`ResourceHttpRequestHandler`实现的，你可以自定义`WebMvcConfigurer`并覆写`addResourceHandlers`方法来改变该行为（加载静态文件）。

在单机web应用中，容器会启动默认的servlet，并用它加载`ServletContext`根目录下的内容以响应那些Spring不处理的请求。大多数情况下这都不会发生（除非你修改默认的MVC配置），因为Spring总能够通过`DispatcherServlet`处理这些请求。

默认地，资源放置在`/**`，但是你可以通过`spring.mvc.static-path-pattern`属性进行调整。例如，迁移所有的资源到`/resources/**`可以按照如下方式实现：

```
spring.mvc.static-path-pattern=/resources/**
```

你可以设置`spring.resources.static-locations`属性自定义静态资源的位置（配置一系列目录位置代替默认的值）。根Servlet的上下文路径“/”也会被作为一个位置自动添加。

此外，除了上述标准的静态资源位置，有个例外情况是[Webjars内容](http://www.webjars.org/)。任何在`/webjars/**`路径下的资源都将从jar文件中提供，只要它们以Webjars的格式打包。

**注** 如果你的应用将被打包成jar，那就不要使用`src/main/webapp`文件夹。尽管该文件夹是通常的标准格式，但它仅在打包成war的情况下起作用，在打包成jar时，多数构建工具都会默认忽略它。

Spring Boot也支持Spring MVC提供的高级资源处理特性，可用于清除缓存的静态资源或对WebJar使用版本无感知的URLs。

如果想使用针对WebJars版本无感知的URLs（version agnostic），只需要添加`webjars-locator`依赖，然后声明你的Webjar。以jQuery为例，`"/webjars/jquery/dist/jquery.min.js"`实际为`"/webjars/jquery/x.y.z/dist/jquery.min.js"`，`x.y.z`为Webjar的版本。

**注** 如果使用JBoss，你需要声明`webjars-locator-jboss-vfs`依赖而不是`webjars-locator-core`，否则所有的Webjars将解析为`404`。

以下的配置为所有的静态资源提供一种缓存清除（cache busting）方案，实际上是将内容hash添加到URLs中，比如`<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>`：

```
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
```

**注** 实现该功能的是`ResourceUrlEncodingFilter`，它在模板运行期会重写资源链接，Thymeleaf和FreeMarker会自动配置该filter，JSP需要手动配置。其他模板引擎还没自动支持，不过你可以使用[ResourceUrlProvider](https://docs.spring.io/spring/docs/5.0.4.RELEASE/javadoc-api/org/springframework/web/servlet/resource/ResourceUrlProvider.html)自定义模块宏或帮助类。

当使用比如JavaScript模块加载器动态加载资源时，重命名文件是不行的，这也是提供其他策略并能结合使用的原因。下面是一个"fixed"策略，在URL中添加一个静态version字符串而不需要改变文件名：

```
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/lib/
spring.resources.chain.strategy.fixed.version=v12
```

使用以上策略，JavaScript模块加载器加载`"/js/lib/"`下的文件时会使用一个固定的版本策略（`"/v12/js/lib/mymodule.js"`），其他资源仍旧使用内容hash的方式（`<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>`）。查看[ResourceProperties](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java)获取更多支持的选项。

**注** 该特性在一个专门的[博文](https://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources)和Spring框架[参考文档](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/htmlsingle/#mvc-config-static-resources)中有透彻描述。
