论坛首页 Java企业应用论坛

在FreeMarker3.8-版本中实现FreeMarker3.8+的!功能

浏览 3502 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-10  
       FreeMarker3.8中引入了一个非常实用的!功能,在FreeMarker3.8-中,如果要显示类似${user.phone.areacode}的值,需要层层判断是否为NULL,譬如如上的表达式一般在FTL中需要写成<#if user?exists><#if user.phone?exists><#if user.phone.areacode?exists>${user.phone.areacode}},不胜烦琐,而在FreeMarker3.8中可以使用${(user.phone.areacode)!}达到同样的目的。那么如果使用的是FreeMarker3.8-,有什么可选的替代方案呢?下面是我想的一种解决方案

java 代码
 
  1. /** 
  2.  * @author Ray (ayufox@gmail.com) 
  3.  */  
  4. public class EmptyTemplateHashModel implements TemplateHashModel, TemplateScalarModel  
  5. {  
  6.     public final static EmptyTemplateHashModel INSTANCE = new EmptyTemplateHashModel();  
  7.   
  8.     public TemplateModel get(String n) throws TemplateModelException  
  9.     {  
  10.         return INSTANCE;  
  11.     }  
  12.   
  13.     public boolean isEmpty() throws TemplateModelException  
  14.     {  
  15.         return true;  
  16.     }  
  17.   
  18.     public String getAsString() throws TemplateModelException  
  19.     {  
  20.         return "";  
  21.     }  
  22. }  
  23.          
  24.       
  25. /** 
  26.  * @author Ray (ayufox@gmail.com) 
  27.  */  
  28. public class DelegatingTemplateHashModel implements TemplateHashModel  
  29. {  
  30.     private TemplateHashModel target;  
  31.   
  32.     public DelegatingTemplateHashModel(TemplateHashModel target)  
  33.     {  
  34.         this.target = target;  
  35.     }  
  36.   
  37.     public TemplateModel get(String name) throws TemplateModelException  
  38.     {  
  39.         TemplateModel model = this.target.get(name);  
  40.         if (model == null)  
  41.         {  
  42.             return EmptyTemplateHashModel.INSTANCE;  
  43.         }  
  44.         if (model instanceof TemplateHashModel)  
  45.         {  
  46.             return new DelegatingTemplateHashModel((TemplateHashModel) model);  
  47.         }  
  48.         return model;  
  49.     }  
  50.   
  51.     public boolean isEmpty() throws TemplateModelException  
  52.     {  
  53.         return this.target.isEmpty();  
  54.     }  
  55. }  

    
   发表时间:2007-03-10  


FreeMarker是2.3.8吧? 现在最新版本是2.3.9.
0 请登录后投票
   发表时间:2007-03-10  
N个版本以前就可以这样写了:
${(user.phone.areacode)?if_exists}

新版本只不过是把?if_eixsts替换成了!
0 请登录后投票
   发表时间:2007-03-10  
受教,看来对freemarker了解的太少
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics