freemarke之TemplateDirectiveModel詳解

TemplateDirectiveModel接口是freemarker自定標籤或者自定義指令的核心處理接口通過實現該接口,用戶可以自定義標籤(指令)進行任意操作,、 任意文本寫入模板的輸出
     該接口中只定義瞭如下方法,當模板頁面遇到用戶自定義的標籤指令時,該方法會被執行。
public void execute(Environment env, Map params, TemplateModel[] loopVars, 
            TemplateDirectiveBody body) throws TemplateException, IOException;
java代碼如下: 

Java代碼  
  1. import freemarker.core.Environment;    
  2. import freemarker.template.ObjectWrapper;    
  3. import freemarker.template.TemplateDirectiveModel;    
  4.     
  5. /**  
  6.  * FreeMarker自定義宏  
  7.  * 獲取App下載排行列表  
  8.  * 參數包括 length(列表長度) mtypeCode(主類型代碼) typeCode(小類型代碼) rankMode(排行模式1、2、3)  
  9.  * @author shannon  
  10.  *  
  11.  */    
  12. public class FMAppRankDirective implements TemplateDirectiveModel {    
  13.     
  14.     @Resource(name = "appRankService")    
  15.     private AppRankService appRankService;    
  16.         
  17.         
  18.     @SuppressWarnings("unchecked")    
  19.     @Override    
  20.     public void execute(Environment env, Map params, TemplateModel[] loopVars,    
  21.             TemplateDirectiveBody body) throws TemplateException, IOException {    
  22.         //DirectiveUtils是借用jeecms項目中的工具類,主要是因爲它集成了一些異常處理功能,     
  23.         //其實完全可以不用它,params是個Map,自己通過key取值就可以了,做一下空值判斷     
  24.         Integer length = DirectiveUtils.getInt("length", params);    
  25.         Integer mtypeCode = DirectiveUtils.getInt("mtypeCode", params);    
  26.         Integer typeCode = DirectiveUtils.getInt("typeCode", params);    
  27.         Integer rankMode = DirectiveUtils.getInt("rankMode", params);    
  28.         ArrayList<App> rankList = appRankService.getRankList(length, mtypeCode, typeCode, rankMode);    
  29.             
  30.         env.setVariable("appRankList", ObjectWrapper.DEFAULT_WRAPPER.wrap(rankList));    
  31.         if (body != null) {    
  32.             body.render(env.getOut());    
  33.         }    
  34.     }    
  35. }    


頁面引用有多種方法: 
一: 
Java代碼  
  1. <bean id="fp" class="xxxx.tag.FMAppRankDirective"></bean>  
  2.     <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  3.         此處省略          
  4. <property name="freemarkerVariables">  
  5.             <map>  
  6.                 <entry key="fp" value-ref="fp"/>  
  7.             </map>  
  8.         </property>  
  9.     </bean>  


然後頁面直接用 <@fp 的方式調用, 

二:在頁面上直接導入,如: 
<#assign fp= "xxxx.tag.FMAppRankDirective"?new()> 

推薦用第一種
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章