【1】FreeMarker 的缓存

FreeMarker 的缓存处理主要用于模版文件的缓存。一般来讲,模版文件改动不会很频繁,在一个流量非常大的网站中,如果频繁的读取模版文件对系统的负担还是很重的。

因此 FreeMarker 通过将模版文件的内容进行缓存,来降低模版文件读取的频次,降低系统的负载。

当处理某个模版时,FreeMarker直接从缓存中返回对应的 Template 对象,并有一个默认的机制来保证该模版对象是跟模版文件同步的。

如果使用 FreemarkerServlet 时,有一个配置项template_update_delay用来指定更新模版文件的间隔时间,相当于多长时间检测一下是否有必要重新加载模版文件,0 表示每次都重新加载,否则为多少毫秒钟检测一下模版是否更改。

template_update_delay=0

FreeMarker定义了一个统一的缓存处理接口CacheStorage,默认的实现是 MruCacheStorage 最近最少使用的缓存策略。

一般情况下,很少需要对缓存进行扩展处理。可以通过下面的代码指定最大缓存的模版数:

cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))

其中第一个参数是最大的强引用对象数,第二个为最大的弱引用对象数。

这两个值FreeMarker默认的是0和 Integer.MAX_VALUE,表明模版缓存数是无限的


【2】SpringMVC禁用缓存配置

①先设置springmvc的缓存控制。

这是最高优先级的缓存控制。一旦springmvc发现没有缓存开启,就会进行cache。如果发现缓存没开启,则会每次生成一个view(通过调用freemarker的方法来进行)。

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="false" />
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8"/>
<!-- 此变量值为pageContext.request, 页面使用方法:request.contextPath -->
<property name="requestContextAttribute" value="request" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
</bean>

② 再设置freemakre的缓存控制。

freemakre通过一个时间长度来控制缓存。

<bean id="freemarkerConfigurer"    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
<property name="templateLoaderPath" value="/WEB-INF/views/" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="number_format">#.##</prop>
</props>
</property>
</bean>

这里关键是设置 template_update_delay 为0 ,0标示不检测模板,每次都重新载入。

【3】Freemarker常见应用实践

① Freemarker实现三目运算符

Freemarker里面不支持三目运算符,如果要使用请参考如下格式:

<select id="type" name="type" class="">
<option ${(member.type==1)?string('selected','')} value="1">普通用户</option>
<option ${(member.type==2)?string('selected','')} value="2">商家</option>
<option ${(member.type==3)?string('selected','')} value="3">普通管理员</option>
</select>