文档章节

Freemaker 自定义指令和函数

郭恩洲_OSC博客
 郭恩洲_OSC博客
发布于 2015/11/09 18:43
字数 739
阅读 54
收藏 0

Freemaker 自定义指令和函数

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

个人理解:指令的作用,主要是进行页面调整之后进行输出;函数的作用,主要是为了进行运算,返回运算结果供前台展示。

(一) 自定义指令

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

<@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 { // 检查参数是否传入 if (!params.isEmpty()) { throw new TemplateModelException("This directive doesn't allow parameters.");
         } if (loopVars.length != 0) { throw new TemplateModelException("This directive doesn't allow loop variables.");
        } // 是否有非空的嵌入内容 if (body != null) { // 执行嵌入体部分,和FTL中的<#nested>一样,除了 // 我们使用我们自己的writer来代替当前的output writer. body.render(new UpperCaseFilterWriter(env.getOut()));
      } else { throw new RuntimeException("missing body");
     }
} /** * {@link Writer}改变字符流到大写形式,
* 而且把它发送到另外一个{@link Writer}中。 */ private static class UpperCaseFilterWriter extends Writer { private final Writer out;
       UpperCaseFilterWriter (Writer out) { this.out = out;
        } public void write(char[] cbuf, int off, int len) throws IOException { char[] transformedCbuf = new char[len]; for (int i = 0; i < len; i++) {
              transformedCbuf[i] = Character.
              toUpperCase(cbuf[i + off]);
         }
        out.write(transformedCbuf);
       } public void flush() throws IOException {
           out.flush();
       }
}
复制代码
例子:
复制代码
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

本文转载自:http://www.cnblogs.com/beiyeren/p/3873683.html

郭恩洲_OSC博客
粉丝 37
博文 254
码字总数 117699
作品 0
徐汇
高级程序员
私信 提问
FreeMaker一篇通

FreeMaker一篇通 前言 Freemaker是一个强大的模板引擎,相比velocity而言,其强大的过程调用、递归和闭包回调功能让freemaker可以完成几乎所有我们所想的功能。从个人看法而言,freemaker完全...

长平狐
2012/10/23
576
0
freemaker 可以自定义像 ?html ?length 这样的指令吗?

freemaker 可以自定义像 ?html ?length 这样的指令吗?

独孤小败
2014/07/29
300
4
freemaker常见语法(二)

以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即...

mifans
2016/10/20
16
0
Spring Boot 最佳实践(三)模板引擎FreeMarker集成

一、FreeMaker介绍 FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT、电子邮件、配置文件、源代码等)的工具,它不是面向最终用户的,而是一款程序员使用的组件。 ...

王磊
2018/08/31
0
0
freemaker操作一二 转载

FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,...

李永china
2016/04/26
38
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
5
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
10
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
1K
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部