Freemarker的使用

来源:互联网 发布:淘宝c 编辑:程序博客网 时间:2024/06/10 00:32

Freemarker简介 
Freemakrer是用于java中通过向已定义好的模板文件中传递map或JavaBean,从而生成<<文本>>文件的一个工具。

网站 :http://freemarker.sourceforge.net/ 
在线文档 :http://freemarker.sourceforge.net/docs/index.html 
当然,网上也有中文版的pdf文档,也很实用。

书写javaBean 
由于我想实验传递javaBean,毕竟Map的使用还是有些麻烦。在这个javaBean中将一般常用类型都包含了。

Java代码  收藏代码
  1. import java.math.BigDecimal;  
  2. import java.sql.Date;  
  3. import java.sql.Time;  
  4. import java.sql.Timestamp;  
  5.   
  6. public class SimpleBean {  
  7.     private boolean bolField;  
  8.     private int intField;  
  9.     private BigDecimal bigDecimal;  
  10.     private String string;  
  11.     private Date date;  
  12.     private Time time;  
  13.     private Timestamp timestamp;  
  14. }  

 

书写Freemarker的模板文件

其实就是从源码中帖过来小小改动即可。

Java代码  收藏代码
  1. <@license/>  
  2.   
  3. <#list list as bean>   
  4. static class SimpleBean {  
  5.     private boolean bolField;         <#if bean.bolField>true<#else>false</#if>  ${bean.bolField?string("yes","no")}  
  6.     private int intField;             ${bean.intField}  
  7.     private BigDecimal bigDecimal;    ${bean.bigDecimal!'default value while empty'}  
  8.     private String string;            ${bean.string!}  
  9.     private Date date;                ${bean.date!}  
  10.     private Time time;                ${bean.time!}  
  11.     private Timestamp timestamp;      ${bean.timestamp!}  
  12. }  
  13. </#list>  

 

自定义的tag标记

请注意,我使用了一个自定义的tag标记,这个实现也很简单,实现TemplateDirectiveModel即可。

Java代码  收藏代码
  1. public class LicenseDirective implements TemplateDirectiveModel {  
  2.   
  3.     public void execute(Environment env, Map params, TemplateModel[] loopVars,  
  4.             TemplateDirectiveBody body) throws TemplateException, IOException {  
  5.         env.getOut().append("/**\n * @author colin\n */");  
  6.     }  
  7.   
  8. }  

 

程序主体的代码

Java代码  收藏代码
  1. public class UsingFreemarker {  
  2.     public static void main(String[] args) throws Exception {  
  3.         Configuration cfg = new Configuration();  
  4.         cfg.setObjectWrapper(new DefaultObjectWrapper());  
  5.         cfg.setClassForTemplateLoading(UsingFreemarker.class"");  
  6.         cfg.setNumberFormat("0.####");  
  7.         cfg.setDateFormat("yyyy-MM-dd");  
  8.         cfg.setTimeFormat("hh:mm");  
  9.         cfg.setDateTimeFormat("yyyy-MM-dd hh:mm");  
  10.         // cfg.setBooleanFormat("true,false"); // 无效果  
  11.   
  12.         cfg.setSharedVariable("license"new LicenseDirective());  
  13.   
  14.         List list = new ArrayList();  
  15.         list.add(new SimpleBean(false0nullnullnullnullnull));  
  16.         long now = new java.util.Date().getTime();  
  17.         list.add(new SimpleBean(true1new BigDecimal("12.345678"),  
  18.                 "freemarker"new Date(now), new Time(now), new Timestamp(now)));  
  19.           
  20.         Map root = new HashMap();  
  21.         root.put("list", list);  
  22.           
  23. //      File file = new File("Hello.txt");  
  24. //      FileOutputStream fos = new FileOutputStream(file);  
  25. //      Writer out = new OutputStreamWriter(fos);  
  26.         Writer out = new OutputStreamWriter(System.out);  
  27.           
  28.         Template t = cfg.getTemplate("hello.ftl");  
  29.         t.process(root, out);  
  30.         out.flush();  
  31.     }  
  32. }  

 

运行

Java代码  收藏代码
  1. /** 
  2.  * @author colin 
  3.  */  
  4. static class SimpleBean {  
  5.     private boolean bolField;         false  no  
  6.     private int intField;             0  
  7.     private BigDecimal bigDecimal;    default value while empty  
  8.     private String string;              
  9.     private Date date;                  
  10.     private Time time;                  
  11.     private Timestamp timestamp;        
  12. }  
  13. static class SimpleBean {  
  14.     private boolean bolField;         true  yes  
  15.     private int intField;             1  
  16.     private BigDecimal bigDecimal;    12.3457  
  17.     private String string;            freemarker  
  18.     private Date date;                2011-03-13  
  19.     private Time time;                10:22  
  20.     private Timestamp timestamp;      2011-03-13 10:22  
  21. }  
 


注意事项:

  1. Freemarker对于null的结果会抛异常,需要自己处理。比如:
    1. ! 输出空格
    2. !'the default while empty' 指定一个为空时候的默认值
  2. Freemarker对于boolean的结果会抛异常,需要自己处理。比如:
    1. cfg.setBooleanFormat("true,false"); 在我这边尝试,没有效果,还是需要额外处理boolean的输出
    2. <#if bean.bolField>true<#else>false</#if> 用if else 判断一下,输出自定义的值
    3. ${bean.bolField?string(“yes”,”no”)} 转义
原创粉丝点击