Freemarker自定义指令

原创 2015年11月18日 15:56:24

场景

在做一个CMS网站时,要列出网站栏目,比如有新闻,科技,体育,财经等栏目。栏目内容存放在数据库中。

调用语法

                //没有循环变量
        <@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN/>

                //有循环变量
        <@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN ;lv1, lv2, ..., lvN/>

自定义指令使用

cms_chanel_list指令的作用是按传入的参数count找出指定数量的栏目,并且过滤掉名字为“体育”的栏目。

    <@cms_chanel_list count=5 exclude="体育">
        <#list chllist as c>
        <dt>
        <a href="#" target="_self"><span>${c.name}</span></a>
        </dt>
        </#list>
    </@cms_chanel_list> 

自定定义指令

首先要实现TemplateDirectiveModel接口。

public class ChanelListDirective implements TemplateDirectiveModel {
    @Inject
    private ChanelDao chanelDao;
    /*
     * @param 传入的参数,params类型为Map<String,
     * TemplateModel>,由于历史原因没用泛型。比如传入参数“count=5”,String为count,TemplateModel为5
     * 
     * @loopVars 循环变量
     * 
     * @see freemarker.template.TemplateDirectiveModel#execute(freemarker.core.
     * Environment, java.util.Map, freemarker.template.TemplateModel[],
     * freemarker.template.TemplateDirectiveBody)
     */
    public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, TemplateModel[] loopVars,
            TemplateDirectiveBody body) throws TemplateException, IOException {
        // TODO Auto-generated method stub
        if (params == null || params.size() == 0) {
            throw new TemplateException("params can not be empty", env);
        }
        int count = 0;
        String excludeStr = null;
        // 处理传入的参数
        for (Object key : params.keySet()) {
            String name = (String) key;
            if (name.equalsIgnoreCase("count")) {
                if (params.get(key) instanceof TemplateNumberModel)
                    count = ((TemplateNumberModel) params.get(key)).getAsNumber().intValue();
                else
                    throw new TemplateException("count param must be number", env);
            }
            if (name.equalsIgnoreCase("exclude")) {
                if (params.get(key) instanceof TemplateScalarModel)
                    excludeStr = ((TemplateScalarModel) params.get(key)).getAsString();
                else
                    throw new TemplateException("execlude param must be string", env);
            }
        }
        List<Chanel> chanleList = chanelDao.loadAll();
        List<Chanel> list = new ArrayList<>();
        for (int i = 0; i < count && i < chanleList.size(); i++) {
            if (chanleList.get(i).getName().equals(excludeStr))
                continue;
            list.add(chanleList.get(i));
        }
        env.setVariable("chllist", ObjectWrapper.DEFAULT_WRAPPER.wrap(list));
        if (body != null) {
            body.render(env.getOut());
        }
    }
}

在freemarker中配置

需要绑定该指令为cms_chanel_list

    ...
    <bean id="chanelListDirective" class="com.ydoing.web.directives.ChanelListDirective"/>
    <!-- 配置freeMarker的模板路径 -->
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/t/cms/www/default/" />
        <property name="defaultEncoding" value="UTF-8" />
        <property name="freemarkerVariables">
            <map>
                <entry key="cms_chanel_list" value-ref="chanelListDirective"/>
            </map>
        </property> 
    ...
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Freemarker自定义方法和指令

1.  自定义方法,继承TemplateMethodModel即可。例子如下: public class IndexOfMethod implements TemplateMethodModel { ...

FreeMarker 自定义指令(三)

1. 模板文件 test04.ftlfoo bar f ${color} baaz wombat2. 自定义指令类 UpperDire...

freemarker自定义指令及方法

“一节复一节,千枝攒万叶”竹子每生长一段就会总结一下打个节,今天我也总结一下最近处理的一个小问题,希望我的小节,对各位看官有所帮助。 背景描述: 最近项目做了一个月报功能,由于生产环境不是所有人都能访...

freemarker 实现自定义标签的方法

freemarker 实现自定义标签的方法 : 使用    宏定定义标签实现  TemplateDirectiveModel的 execute() 方法,写相应的Java代码(这种方式更加的灵活)...

FreeMarker标签与使用

模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选...
  • nengyu
  • nengyu
  • 2011-09-28 11:46
  • 89493

FreeMarker 自定义方法(二)

1. 模板文件 test303.ftl ${indexOf("met", x)} ${indexOf("foo", x)}2. 自定义方法 IndexOfMethod.javaps: 返回第一个字符串...

一次分布式架构cms系统页面静态化模块开发经历

项目背景公司开发新的项目,选择了分布式系统架构,同时项目中有大量图文展示的需求,考虑到开发效率和性能问题,需要集成cms的功能,程序实现后台录入数据静态化。技术架构java开发、jdk1.8,项目整体...

Hibernate+Freemarker分页控件实现

传到前端的Pagepublic class Page implements Serializable { private static final long serialVersionUID ...

经典排序算法(1)——冒泡排序算法详解

冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)