IntelliJ + springmvc + freemarker 開發環境 緩存設置
2015-05-26 13:31
通過閱讀源碼搞定了
- 先查看web.xml的緩存控制。這是最高優先級的緩存控制,如果開了緩存,生成的頁面就會緩存在tomcat里。
- 再設置springmvc的緩存控制。一旦springmvc發現沒有緩存開啟,就會進行cache,如果發現緩存沒開啟,則會每次生成一個view(通過調用freemarker的方法來進行)。
- 再設置freemakre的緩存控制。freemakre通過一個時間長度來控制緩存
- 在上面兩步完成之后,一般來說就可以了。但是還有一個問題是,web訪問的是target目錄下的classpath和WEB-INFO目錄,而我們開發環境修改的模板文件不是target目錄下。這就要求IntelliJ要有熱部署功能,也就是在修改文件后,能自動更新target目錄下的文件數據。
web.xml 緩存
如果web.xml里面存在類似下面的代碼,就要把它注釋掉,否則修改freemarker頁面再刷新瀏覽器是不會生效的。
<filter>
<filter-name>productCacheFilter</filter-name>
<filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class>
<init-param>
<param-name>cacheName</param-name>
<param-value>product</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>productCacheFilter</filter-name>
<url-pattern>/product/list/*</url-pattern>
</filter-mapping>
這段代碼是采用ehcache來緩存頁面。
springmvc 設置解析器 緩存設置
<bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix" value=".ftl"/>
<property name="order" value="0"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
<!-- 此變量值為pageContext.request, 頁面使用方法:rc.contextPath -->
<property name="requestContextAttribute" value="rc"/>
<property name="cache" value="false"/>
</bean>
這里關鍵是讓 cache設置為 false.
開發環境下為false, 線上環境是true, 避免所有緩存
freemarker 緩存設置
<!-- 配置FreeMarkerConfigurer -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
</props>
</property>
</bean>
這里關鍵是設置 template_update_delay 為0 ,因此每次在刷新 free marker頁面時,均會進行修改時間 的校驗,判斷是否應該重新載入。
IntelliJ 熱部署設置
通過熱部署,就可以在更改任意文件時,都不用重啟,就可以將文件或數據拷貝到 target目錄下。

