当前位置: 代码迷 >> Web前端 >> struts2上扩展freemarker(代码方式)
  详细解决方案

struts2上扩展freemarker(代码方式)

热度:373   发布时间:2012-09-03 09:48:39.0
struts2下扩展freemarker(代码方式)

用FreeMarker直接在页面上获取当前时间,直接扩展FreeMarker的方法来实现。使用扩展Struts2的FreemarkerManager来实现。 (也可以通过宏的方式实现)

一、写一个类继承Struts2的FreemarkerManager

package com.yourcompany.freemarker;   
   
import javax.servlet.ServletContext;   
   
import org.apache.struts2.views.freemarker.FreemarkerManager;   
   
import freemarker.template.Configuration;   
import freemarker.template.TemplateException;   
   
public class ExtendedFreemarkerManager extends FreemarkerManager {   
   
    @Override   
    protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException {   
        Configuration configuration = super.createConfiguration(servletContext);   
        configuration.setSharedVariable("datetime", new DatetimeMethod()); // 加入时间日期处理   
        return configuration;   
    }   
}  


二、设置Struts2的常量,可以在struts.properties或者struts.xml文件中配置

<constant name="struts.freemarker.manager.classname"   
    value="com.yourcompany.freemarker.ExtendedFreemarkerManager" />  


三、编写一个DatetimeMethod类来处理时间

package com.yourcompany.freemarker;   
   
import java.text.SimpleDateFormat;   
import java.util.Date;   
import java.util.List;   
   
import freemarker.template.TemplateMethodModel;   
import freemarker.template.TemplateModelException;   
   
/**  
 * 根据传入的日期时间格式,在页面上直接取得当前时间的格式化结果  
 * 如果格式为空或者错误,将返回yyyy-MM-dd HH:mm:ss  
 * 页面调用${datetime("yyyy")}/${datetime('yyyy')}  
 * @see com.yourcompany.ExtendedFreemarkerManager#createConfiguration  
 * @author Sunshine  
 *  
 */   
public class DatetimeMethod implements TemplateMethodModel {   
   
    private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";   
   
    @SuppressWarnings("unchecked")   
    public Object exec(List args) throws TemplateModelException {   
        Date date = new Date();   
        String pattern = args.get(0).toString();   
        try {   
            return new SimpleDateFormat(pattern).format(date);   
        } catch (RuntimeException e) {   
            return new SimpleDateFormat(DEFAULT_PATTERN).format(date);   
        }   
    }   
}  



四、页面调用

${datetime("yyyy年M月d日")}



五、实现更多的方法

?实现TemplateMethodModel接口,然后configuration.setSharedVariable("yourMethod", new YourMethodMethod());

?

六、接口的实现类可以以内部类形式放在FreemarkerManager的子类中,更简便

?

?

?

?

?

  相关解决方案