TemplateDirectiveModel接口是freemarker自定標籤或者自定義指令的核心處理接口。通過實現該接口,用戶可以自定義標籤(指令)進行任意操作,、
任意文本寫入模板的輸出。
該接口中只定義瞭如下方法,當模板頁面遇到用戶自定義的標籤指令時,該方法會被執行。
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException;
java代碼如下:
Java代碼
-
import freemarker.core.Environment;
-
import freemarker.template.ObjectWrapper;
-
import freemarker.template.TemplateDirectiveModel;
-
-
/**
-
* FreeMarker自定義宏
-
* 獲取App下載排行列表
-
* 參數包括 length(列表長度) mtypeCode(主類型代碼) typeCode(小類型代碼) rankMode(排行模式1、2、3)
-
* @author shannon
-
*
-
*/
-
public class FMAppRankDirective implements TemplateDirectiveModel {
-
-
@Resource(name = "appRankService")
-
private AppRankService appRankService;
-
-
-
@SuppressWarnings("unchecked")
-
@Override
-
public void execute(Environment env, Map params, TemplateModel[] loopVars,
-
TemplateDirectiveBody body) throws TemplateException, IOException {
-
//DirectiveUtils是借用jeecms項目中的工具類,主要是因爲它集成了一些異常處理功能,
-
//其實完全可以不用它,params是個Map,自己通過key取值就可以了,做一下空值判斷
-
Integer length = DirectiveUtils.getInt("length", params);
-
Integer mtypeCode = DirectiveUtils.getInt("mtypeCode", params);
-
Integer typeCode = DirectiveUtils.getInt("typeCode", params);
-
Integer rankMode = DirectiveUtils.getInt("rankMode", params);
-
ArrayList<App> rankList = appRankService.getRankList(length, mtypeCode, typeCode, rankMode);
-
-
env.setVariable("appRankList", ObjectWrapper.DEFAULT_WRAPPER.wrap(rankList));
-
if (body != null) {
-
body.render(env.getOut());
-
}
-
}
-
}
頁面引用有多種方法:
一:
Java代碼
-
<bean id="fp" class="xxxx.tag.FMAppRankDirective"></bean>
-
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
-
此處省略
-
<property name="freemarkerVariables">
-
<map>
-
<entry key="fp" value-ref="fp"/>
-
</map>
-
</property>
-
</bean>
然後頁面直接用 <@fp 的方式調用,
二:在頁面上直接導入,如:
<#assign fp= "xxxx.tag.FMAppRankDirective"?new()>
推薦用第一種