freemarker 自己定义指令
1 简单介绍
自己定义指令能够使用 macro 指令来定义,这是模板设计者所关心的内容。
Java 程序猿若不想在模板中实 现定义指令 ,而是在 Java 语言中实现指令 的定义,这时 能够使用freemarker.template.TemplateDirectiveModel 类来扩展
2 基本内容
macro 指令自身不打印不论什么内容,它仅仅是用来创建宏变量,所以就会有一个名为greet 的变量。在 <#macro greet> 和 </#macro> 之间的内容(称为宏定义体)当使用它作为指令时将会被运行。
<#macro greet>
<font size="+2">Hello Joe!</font>
</#macro>
能够在 FTL 标记中通过 @ 取代 # 来使用自己定义指令。使用变量名作为指令名。
<@greet></@greet>
<@greet/>
3 參数
宏名称的后面位置是用来定义变量的。
<#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
那么就能够这样来使用这个宏:
<@greet person="Fred"/> and <@greet person="Batman"/>
使用提前定义指令时,參数的值( = 号后边的值)能够是 FTL 表达式。
这样,不像 HTML, "Fred"和 "Batman" 的引號就能够不用要了。 <
@greet person=Fred/> 也意味着使用变量的值 Fred 作为 person 參数,而不是字符串 "Fred" 。
也能够在 = 号左边使用复杂表达式(比方someParam=(price + 50)*1.25 )。
能够有多个參数。
<#macro greet person color>
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
宏就能够这样来使用:
<@greet person="Fred" color="black"/>
<@greet color="black" person="Fred"/>
你只能够使用在 macro 指令中定义的參数,同 时 也 必 须 给 出 在 宏 中 定 义 所 有 參 数 的 值 。
指定默认值:
<#macro greet person color="black">
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
<@greet person="Fred"/> ,由于它和<@greet person="Fred" color="black"/> 是同样的
如 果 想 给 color 设 置 为 ”red” , 那 么 就 写 成 : <@greet person="Fred" color="red"/>
someParam=foo 和someParam="${foo}" 是不同的。假设指令须要 someParam是一个数字值,那么就不要用另外一种方式。
4 嵌套内容
<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</td></tr></table>
</#macro>
<#nested> 指令运行位于開始和结束标记指令之间的模板代码段。假设这样写:
<@border>The bordered text</@border>
那么就会输出:
<table border=4 cellspacing=0 cellpadding=4><tr><td>
The bordered text
</td></tr></table>
nested 指令也能够多次被调用
<#macro do_thrice>
<#nested>
<#nested>
<#nested>
</#macro>
<@do_thrice>
Anything.
</@do_thrice>
就会输出:
Anything.
Anything.
Anything.
嵌套的内容能够是随意有效的 FTL,包括其它的用户自己定义指令,这样也是对的:
<@border>
<ul>
<@do_thrice>
<li><@greet person="Joe"/>
</@do_thrice>
</ul>
</@border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<ul>
<li><font size="+2">Hello Joe!</font>
<li><font size="+2">Hello Joe!</font>
<li><font size="+2">Hello Joe!</font>
</ul>
</tr></td></table>
在嵌套的内容中,宏的局部变量是不可见的。
<#macro repeat count>
<#local y = "test">
<#list 1..count as x>
${y} ${count}/${x}: <#nested>
</#list>
</#macro>
<@repeat count=3>${y!"?"} ${x!"?"} ${count!"?"}</@repeat>
test 3/1: ? ? ?
test 3/2: ? ? ?
test 3/3: ? ? ?
局部变量的设置是为每一个宏自己调用的
<#macro test foo>${foo} (<#nested>) ${foo}</#macro>
<@test foo="A"><@test foo="B"><@test foo="C"/></@test></@test>
A (B (C () C) B) A
5 宏和循环变量
循环变量的名字是已经给定的,变量值的设置是由指令本身完毕的。
<#macro do_thrice>
<#nested 1>
<#nested 2>
<#nested 3>
</#macro>
<@do_thrice ; x> <#-- 用户自己定义指令 使用";"取代"as" -->
${x} Anything.
</@do_thrice>
1 Anything.
2 Anything.
3 Anything.
语法规则是为特
nested 指令(当然參数能够是随意的表达式)的參数。
循环变量的名称是在自己定义指令的開始标记( <@...> )的參数后面通过分号确定的。
能够使用多个循环变量(变量的顺序是非常重要的):
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
</#list>
</#macro>
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if>
</@repeat>
1.
2.
3.
4.
0.5
1
1.5
2 Last!
变量能够不指定,例如以下所看到的都是能够的:
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if>
</@repeat>
<@repeat count=4 ; c, halfc>
${c}. ${halfc}
</@repeat>
<@repeat count=4>
Just repeat it...
</@repeat>
假设在分号后面指定了比 nested 指令还多的变量,那么最后的循环变量将不会被创建(在嵌套内容中不会被定义)。
freemarker 自己定义指令的更多相关文章
- FreeMarker 自己定义指令(三)
1. 模板文件 test04.ftl foo <@customUpper> bar f <#-- 这里同意使用全部的 FTL --> <#list ["red& ...
- freemarker自己定义标签报错(七)
1.错误描写叙述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template pr ...
- freemarker自己定义标签(一)
freemarker自己定义标签 1.自己定义标签说明 宏变量存储模板片段能够被用作自己定义指令macro 2.演示样例说明 <html> <head> <meta ht ...
- AngularJS--自定义指令和模板
一.自定义指令: 1. 先创建模块 var app=angular.module("myApp",[]); 2. 创建自定义指令 (directive后面的参数一:自定义指令 ...
- AngularJS---自定义指令
AngularJS提供了一系列的内置指令,如ng开头的指令,同时AngularJS也允许用户自定义指令. 目录: 1.自定义指令 2.使用自定义指令 3.自定义指令的内嵌使用 自定义指令 Angula ...
- 你知道用AngularJs怎么定义指令吗?
前言 最近学习了下angularjs指令的相关知识,也参考了前人的一些文章,在此总结下. 欢迎批评指出错误的地方. Angularjs指令定义的API AngularJs的指令定义大致如下 ang ...
- 带你走近AngularJS - 创建自己定义指令
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自己定义指令 ------------ ...
- freemarker自己定义标签报错(三)
freemarker自己定义标签 1.错误描写叙述 freemarker.core.ParseException: Encountered " " at line 14, colu ...
- freemarker自己定义标签(二)
freemarker自己定义标签 1.自己定义标签 通过自己定义标签,写一个反复指定字符串 2.实现源代码 <html> <head> <meta http-equiv= ...
随机推荐
- java修改远程服务器密码
积累: 1. echo 用户名:新密码 | chpasswd
- easyui源码翻译1.32--accordion(手风琴)
前言 前几天加班比较忙 未能及时更新翻译的 今天多发布几篇..下载该插件翻译源码 Accordion 分类空间允许用户使用多面板,但在同一时间只会显示一个.每个面板都内建支持展开和折叠功能.点击一个面 ...
- 10行Python代码解决约瑟夫环(模拟)
http://blog.csdn.net/dengyaolongacmblog/article/details/39208675 #!/usr/bin/env python # coding: utf ...
- MyEclipse中文乱码,编码格式设置,文件编码格式 总结
一.设置新建常见文件的默认编码格式,也就是文件保存的格式.在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致, ...
- CSS选择器一览
CSS选择器一览 CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. "CSS" 列指示该属性是在哪个 CSS 版本中定义的.(CSS1.CSS2 还 ...
- C# DataGridView添加新行的2个方法
可以静态绑定数据源,这样就自动为DataGridView控件添加 相应的行.假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控件动态添加新行 ...
- c# 模拟http post 带cookie
下面的代码是自动向cnblogs中的小组发帖.........注意小组ID,主题ID,小组类型 首先采用firebug分析到发帖时的post地址以及参数,其中在headers中包含了cookies,把 ...
- UVA 11754 Code Feat 中国剩余定理+暴力
lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...
- hive的安装步骤
在node2里安装一下hive1.2.1,步骤如下: 1.解压hive的安装包 2.改变目录:mv apache-hive-1.2.1-bin /home/install/hive-1.2 3.vi ...
- [codevs1073]家族
题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和 ...