(1)文件位置
Maven工程,静态文件放在src/main/webapp/下。
引用
Project Root
└─src
└─ main
└─ webapp # Web应用的根目录
└─ static
└─ css
└─ app.css
└─src
└─ main
└─ webapp # Web应用的根目录
└─ static
└─ css
└─ app.css
打包发布到Tomcat后文件路径是:
引用
<TOMCAT_HOME>/webapps/spring-boot-sample/static/css/app.css
访问URL:
http://localhost:8080/spring-boot-sample/static/css/app.css
(2)Tomcat的请求响应
Tomcat通过 org.apache.catalina.servlets.DefaultServlet 来响应所有请求处理。
<TOMCAT_HOME>\conf\web.xml。
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
Servlet 3.0+以后war中jar文件 META-INF/resources 也是Web应用的根目录。
引用
spring-boot-sample.war
└─ WEB-INF
└─ lib
└─ foo.jar
└─ META-INF
└─ resources # Web应用的根目录
└─ static
└─ css
└─ foo.css
└─ WEB-INF
└─ lib
└─ foo.jar
└─ META-INF
└─ resources # Web应用的根目录
└─ static
└─ css
└─ foo.css
访问URL:
http://localhost:8080/spring-boot-sample/static/css/foo.css
(2)Spring MVC的请求响应
通常Spring工程将所有请求都分发给DispatcherServlet,这样就不会调用Tomcat的DefaultServlet,静态文件也就访问不到了。
src/main/webapp/WEB-INF/web.xml
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
继续使用DefaultServlet响应静态文件的话,需要开启请求Forward到DefaultServlet。
org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler
@Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
或者采用Spring MVC自己的静态文件处理
org.springframework.web.servlet.resource.ResourceHttpRequestHandler
@Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/") .setCachePeriod(604800); } }
(3)SpringBoot的请求响应
SpringBoot已经自动将「/static」「/public」「/resources」「/META-INF/resources」识别为资源文件夹。
引用
Project Root
└─src
└─ main
└─ resources
├─ static
| └─ css
| └─ a.css
├─ public
| └─ css
| └─ b.css
├─ resources
| └─ css
| └─ b.css
└─ META-INF
└─ resources
└─ css
└─ d.css
└─src
└─ main
└─ resources
├─ static
| └─ css
| └─ a.css
├─ public
| └─ css
| └─ b.css
├─ resources
| └─ css
| └─ b.css
└─ META-INF
└─ resources
└─ css
└─ d.css
访问URL:
http://localhost:8080/css/a.css
http://localhost:8080/css/b.css
http://localhost:8080/css/c.css
http://localhost:8080/css/d.css
详细配置:
src/main/resources/application.properties
引用
spring.resources.static-locations=classpath:/static/
spring.resources.cache-period=604800
spring.resources.chain.gzipped=true
spring.resources.chain.cache=false
spring.resources.add-mappings=false
spring.resources.cache-period=604800
spring.resources.chain.gzipped=true
spring.resources.chain.cache=false
spring.resources.add-mappings=false
使用方法:
引用
──resources
├─static
│ ├─css
│ │ index.css
│ └─js
│ index.js
└─templates
index.ftl
├─static
│ ├─css
│ │ index.css
│ └─js
│ index.js
└─templates
index.ftl
<link rel="stylesheet" type="text/css" href="/css/index.css"> <script type="text/javascript" src="/js/index.js"></script>
版本管理:
由于浏览器会对静态文件进行缓存,所有服务器端修改后的静态文件不会立即被浏览器重新加载,通常会在资源文件URL的后边添加一个标示(时间戳或版本号),修改时也同时修改该标示,由于URL不同,浏览器就会重新加载该资源文件了。
<script type="text/javascript" src="/js/sample.js?201702091030"></script> <script type="text/javascript" src="/js/sample.js?v=1.0.1"></script>
a - 资源名MD5 方式
src/main/resources/application.properties
引用
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.content.paths=/**
b - 版本号 方式
src/main/resources/application.properties
引用
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/**,/v1.0.0/**
spring.resources.chain.strategy.fixed.version=v1.0.0
spring.resources.chain.strategy.fixed.paths=/js/**,/v1.0.0/**
spring.resources.chain.strategy.fixed.version=v1.0.0