您的位置:首页 > 其它

freemarke之TemplateDirectiveModel详解

2016-05-17 10:11 281 查看
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()> 

推荐用第一种
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  freemarker