2018/7/15

  1. 先建立 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 中使用 (參考同上)

  2. 在 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() 也會有所不同,故需以 / 確定其參考到的靜態檔案的路徑是正確的

  3. 在 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 (參考)

  4. 在 Spring 的 xml 設定檔中加入:

    <beans xmlns="http://www.springframework.org/schema/beans" ... >
        ...
        <context:component-scan base-package="idv.shunyi.config" /> <!-- MvcConfig.java 所在的 package -->
        ...
    </beans>
    
  5. 若要在 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());
    }
    

參考資料