Spring+Freemarker的自定义标签 实现标签给定时间与当前时间对比

下面的三步为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='尚未过期'/>

相关文章

评论关闭。