下面的三步为Spring + Freemarker组合添加自定义标签:compareTime
compareTime标签的目的是比较传入的日期对象与系统当前日期,返回特定字符串。这里并没最格式化日期的操作,如果仅需要对比到天可以格式化下日期。
1. 修改Spring配置文件:
<bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="WEB-INF/templates/"/>
<property name="freemarkerSettings">
<props>
<prop key="datetime_format">yyyy-MM-dd HH:mm</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="number_format">0.##########</prop>
</props>
</property>
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape"/>
<entry key="compareTime" value-ref="compareTime"/>
</map>
</property>
</bean>
...
<bean id="compareTime" class="com.hhdem.sample.utils.freemarker.CompareTime"></bean>
2. 添加CompareTime类,实现TemplateDirectiveModel接口
package com.hhdem.sample.utils.freemarker;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
import freemarker.core.Environment;
import freemarker.template.SimpleDate;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
/**
* @since 2012-1-9,下午05:16:53
* @author <a href="mailto:liubingchina@gmail.com">hhdem</a>
* @version $Id$
* @comment
*
*/
public class CompareTime implements TemplateDirectiveModel{
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
Date date = new Date();
String showStr = "";
try {
SimpleDate cdate = (SimpleDate) params.get("cdate");
if(date.compareTo(cdate.getAsDate()) == 0) {
showStr = params.get("eStr").toString();
} else if (date.compareTo(cdate.getAsDate()) > 0) {
showStr = params.get("lStr").toString(); // 未来
} else if (date.compareTo(cdate.getAsDate()) < 0) {
showStr = params.get("fStr").toString(); // 过去
}
env.getOut().write(showStr);
} catch (RuntimeException e) {
env.getOut().write(showStr);
}
}
}
3. freemarker模板中直接通过下面代码调用即可
<@compareTime cdate=s.startDate lStr='已经过期' fStr='尚未过期'/>
评论关闭。