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标签与使用

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

FreeMarker 自定义指令(三)

1. 模板文件 test04.ftlfoo bar f ${color} baaz wombat2. 自定义指令类 UpperDire...
  • hanshileiai
  • hanshileiai
  • 2015年07月13日 11:20
  • 2357

(三) Freemarker 常用指令

1. assign: 自定义变量 2. if else :流程判断指令 3. list: 变量sequence 4. marco: 宏指令(自定义方法) ...
  • zgf19930504
  • zgf19930504
  • 2016年03月01日 17:36
  • 1042

FreeMarker自定义指令--代码实现

在进行FreeMarker开发时,应该都会使用到FreeMarker的指令,但是FreeMarker为我们提供指令是很有限的,因此需要我们自定义指令,实现我们需要的功能。 在我的学习过程中,遇到了一...
  • u011425751
  • u011425751
  • 2016年04月27日 11:18
  • 640

freemarker编写自定义标签

freemarker提供了TemplateDirectiveModel接口,我们可以利用它来实现自定义标签的编写。...
  • xuzengqiang2
  • xuzengqiang2
  • 2014年03月06日 10:36
  • 1977

freemarker 实现自定义标签的方法

freemarker 实现自定义标签的方法 : 使用    宏定定义标签实现  TemplateDirectiveModel的 execute() 方法,写相应的Java代码(这种方式更加的灵活)...
  • luoliehe
  • luoliehe
  • 2015年07月14日 23:17
  • 2546

Freemarker 自定义标签实现

摘要: 采用的是freemarker版本 2.3.21 采用 BeansWrapperBuilder替代DEFAULT_WRAPPER 的方式。 1  自定义标签需要实现TemplateDir...
  • laukicn
  • laukicn
  • 2017年05月26日 09:34
  • 1490

freemarker自定义指令及方法

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

FreeMarker 自定义指令,并增加参数(四)

1. 模板文件 test05.ftl Test ${x} Test ${cnt}. Test 2. 自定义指令类(带参数)RepeatD...
  • hanshileiai
  • hanshileiai
  • 2015年07月13日 12:35
  • 3927

FreeMarker自定义TemplateDirectiveModel

在采用FreeMarker做前台视图模板的情况下,我们可以通过标签和自定义宏来解决很多重复性工作。 一个简单的FreeMarker宏: hello ${name} 然后通过如下的形...
  • fangzhangsc2006
  • fangzhangsc2006
  • 2013年03月18日 15:23
  • 8437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Freemarker自定义指令
举报原因:
原因补充:

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