2018/7/15
先建立 Java Config 檔案
@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
.resourceChain(false)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
...
}
1.1 若使用了 @EnableWebMvc
,就不能在 XML 中使用 <annotation-driven />
(參考)
1.2 WebMvcConfigurerAdapter 只能在 @EnableWebMvc
中使用 (參考同上)
在 JSP 中改用以下方式來指定靜態檔案路徑
<script type="text/javascript" src="<c:url value="/resources/js/cache.js" />"></script>
2.1 其中 /resources/js/cache.js
必須以 /
作為開頭,才能正確轉換成 /${contextPath}/resources/js/cache-d347bec25f38177ca4e18844b11f1d42.js
2.2 推測這麼做的可能原因是同一個 .jsp 檔案有可能被不同的 @RequestMapping 所使用,因此 requestURI() 也會有所不同,故需以 /
確定其參考到的靜態檔案的路徑是正確的
在 web.xml 加入以下設定:
<filter>
<filter-name>resourceUrlEncodingFilter</filter-name>
<filter-class>
org.springframework.web.servlet.resource.ResourceUrlEncodingFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>resourceUrlEncodingFilter</filter-name>
<servlet-name>appServlet</servlet-name>
</filter-mapping>
3.1 其中 <servlet-name>
應設為 org.springframework.web.servlet.DispatcherServlet 所使用的 servlet name (參考)
在 Spring 的 xml 設定檔中加入:
<beans xmlns="http://www.springframework.org/schema/beans" ... >
...
<context:component-scan base-package="idv.shunyi.config" /> <!-- MvcConfig.java 所在的 package -->
...
</beans>
若要在 CSS 中 import 其他 CSS
@import "cache.css";
5.1 則需改寫 addResourceHandler()
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
...
registry.addResourceHandler("/resources/css/**")
.addResourceLocations("/resources/css/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
.resourceChain(false)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"))
.addTransformer(new CssLinkResourceTransformer());
}