码迷,mamicode.com
首页 > 其他好文 > 详细

Freemaker 自定义指令和函数

时间:2014-07-29 10:25:18      阅读:330      评论:0      收藏:0      [点我收藏+]

标签:style   blog   java   color   使用   strong   数据   io   

自定义函数和指令都可以在前台或者后台进行指定。

(一) 自定义指令

使用以下格式调用自定义指令:

<@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN/>

定义在前台:

<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>

例子:

<#macro test foo bar baaz>
Test text, and the params: ${foo}, ${bar}, ${baaz}
</#macro>
<#-- call the macro: -->
<@test foo="a" bar="b" baaz=5*5-2/>

输出结果:

Test text, and the params: a, b, 23

定义在后台:

Java程序员可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。详情可以参加API文档。
注意:
TemplateDirectiveModel在FreeMarker 2.3.11版本时才加入。用来代替快被废弃的TemplateTransformModel。

public class UpperDirective implements TemplateDirectiveModel {
     public void execute(Environment env, Map params,
              TemplateModel[] loopVars, TemplateDirectiveBody body)
                                 throws TemplateException, IOException {
    //TODO 具体的业务逻辑
     }
}

例子:

foo
<@upper>
  bar
  <#-- 这里允许使用所有的FTL -->
     <#list ["red", "green", "blue"] as color>
       ${color}
      </#list>
   baaz
</@upper>
wombat

输出结果:

foo
   BAR
      RED
      GREEN
      BLUE
   BAAZ
wombat

(二) 自定义函数

使用类似格式  ${avg(10, 20)}  其中avg为函数名,10,20为传入的参数

定义在前台:

<#function name param1 param2 ... paramN>
   ...
  <#return returnValue>
  ...
</#function>

例子:

<#function avg x y>
    <#return (x + y) / 2>
</#function>

输出结果:

15

定义在后台:

        方法变量在存于实现了TemplateMethodModel接口的模板中。这个接口仅包含一个方法:TemplateModel exec(java.util.List arguments)。当使用方法调用表达式调用方法时,exec方法将会被调用。形参将会包含FTL方法调用形参的值。exec方法的返回值给出了FTL方法调用表达式的返回值。
         TemplateMethodModelEx接口扩展了TemplateMethodModel接口。它没有任何新增的方法。事实上这个对象实现这个标记接口暗示给FTL引擎,形式参数应该直接以TemplateModel-s形式放进java.util.List。否则将会以String-s形式放入List。

public class IndexOfMethod implements TemplateMethodModel {
        public TemplateModel exec(List args) throws TemplateModelException {
               if (args.size() != 2) {
                     throw new TemplateModelException("Wrong arguments");
                }
              return new SimpleNumber(((String) args.get(1)).indexOf((String) args.get(0))); 
       }
}

然后将实例放入到根数据模型中:

root.put("indexOf", new IndexOfMethod());

例子:

<#assign x = "something">
${indexOf("met", x)}
${indexOf("foo", x)}

输出结果:

2
-1

Freemaker 自定义指令和函数,布布扣,bubuko.com

Freemaker 自定义指令和函数

标签:style   blog   java   color   使用   strong   数据   io   

原文地址:http://www.cnblogs.com/beiyeren/p/3873683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!