§指令 Directive
§1. 模板选项 #options
#options (
loadmacro = "/macors/commons.jetx",
loadmacro = "/macors/users.jetx",
import = "java.lang.*",
import = "java.util.*",
safecall = true,
strict = true,
trimWhitespaces = true
)
其中:
strict = true代表模板中用到的变量必须先进行#define, 否则出错safecall = true开启安全调用import引入 packageloadmacro引入外部文件中的 macro 定义trimLeadingWhitespaces删除文件头上的空白内容
§2. 变量类型声明 #define
为了让模板的可读性更好,以及防止一些未知的错误发生,我们提倡为模板中用到的每个变量声明变量类型。
语法:
#define(type name, ...)
示例:
#define(String name)
#define(UserInfo user, List userlist)
注意:
- 在同一个模板中,不允许重复声明变量类型
- 变量必须先声明,再使用
- 在
strict模式中,变量必须进行声明类型
§3. 赋值语句 #set
语法:
#set([type] name = value, ...)
示例:
#set(int num = 1+2*3)
#set(color1 = "#ff0000", color2 = "#00ff00")
注意:在同一个模板中,不允许重复声明变量类型。
§4. 条件语句 #if, #elseif, #else
如果 #if 条件表达式计算结果为 true 或非空,则输出指令所包含的块, 否则输出 #else 指令块。
语法:
#if(expression)...#end#if(expression)...#else...#end#if(expression)...#elseif(expression)...#else...#end
示例:
#if (user.role == "admin")
...
#elseif (user.role == "vip")
...
#elseif (user.role == "guest")
...
#else
...
#end
提示:
- 对于
expression为非Boolean值:非零数字,非空字串,非空集合,非null对象,即为true。- 如果
#else后面紧跟着其他文本,比如#elseABC,那么可以通过添加一对空括号来分割,修改成#else()ABC。这样可读性就能加强,模板解析也不会出现问题。所有的无参数指令,比如#end,#break,#stop都支持这样的语法。()前面和之间请不要插入任何空格。
§5. 循环语句 #for
循环重复输出指令所包含的块,如果是空的集合对象,那么输出 #else 块。
语法:
#for([type] id: expression)...#end#for([type] id: expression)...#else...#end
#for 支持以下类型的 expression
- Iterator
- Iterable (Collection, ...)
- Map
- Enumeration
- Array
- Enum
- null (空循环)
- Object (只循环一次)
示例:
#for (Book book : user.books)
${for.index} // 内部循环计数器,从 1 开始计数
...
#end
§5.1 #for 内部对象 for
for.index可用于内部循环计数,从1开始计数。for.size获取循环总数。for.first是否第一个元素。for.last是否最后一个元素。for.odd是否第奇数个元素。for.even是否第偶数个元素。for.outer获取外部#for指令的for对象
§5.2 for-else
指令 #else 可用于循环为空时的内容输出。
#for (Book book : user.books)
...
#else
No books are found in here.
#end
§5.3 count-loop
要使用 count-loop 循环, 我们可以借助于 range() 函数,比如:
#for (int i : range(1, 100))
...
#end
§5.4 for in map
对一个 Map 进行 for 循环,那么返回的是一个 Map.Entry 对象。
#for (Map.Entry entry : map)
KEY: ${entry.key}
VALUE: ${entry.value}
#end
§6. 循环中断或继续语句 #break, #continue
当 expression 为 true,#break 中断当前循环,而 #continue 跳过余下的内容,跳到下一个循环。
语法:
#break#break(expression)#continue#continue(expression)
示例:
#for (book : user.books)
...
#break(book.price > 100)
...
#continue(book.price < 50)
...
#end
提示:无参数格式代表
expression永远为true。
§7. 停止解析语句 #stop
当 expression 为真或非空时,停止模板运行,立刻返回。
语法:
#stop#stop(expression)
示例:
#stop(error != null)
提示:无参数格式代表
expression永远为true。
§8. 嵌套模板语句 #include
嵌入一个子模板,将子模板内容输出到当前位置。
语法:
#include(file, [parameters], [returnName])
示例:
#include("/include/header.jetx") // 绝对路径
#include("../userinfo.jetx") // 相对路径
#include(file) // 动态路径
#include("/include/header.jetx", {role: "admin"}) // 传递参数
#include("/include/header.jetx", {}, "result") // 获取返回值
注意:
- 子模板自动共享父模板
Context变量,同时还可以另外传递一些私有参数parameters给子模板。- 子模板可以用
#return指令返回一个对象给父模板,并存储在父模板中returnName指定的变量名中。- 如果
returnName为 null,那么默认为RESULT
具体用法请移步: 嵌入子模板 #include
§9. 宏定义 #macro, #call
定义一个代码片段,然后可以重复使用。
宏定义语法:
#macro name([type] name, ...)...#end
注意: 每个宏可以定义 0~N 个参数,并可以选择声明类型。
宏调用语法:
#call macro_name(args...)
示例:
#macro header(String name)
Hello ${name}!
#end
#call header("张三")
#call header("李四")
输出结果:
Hello 张三!
Hello 李四!
更多关于宏 Macro 的内容请查看:宏 Macro
§10. 自定义标签 #tag
jetbrick-template 支持自定义 Tag,类似于 JSP Taglib,但是要比 JSP Taglib 更简单更好用。
语法:
#tag name(args ...)...#end
注意:
- 需要在 Java 端先定义 Tag 标签的实现,并进行注册。
- Tag 调用的参数必须和定义的一致。
示例:
#tag layout_block("list")
<ul>
<li>Home</li>
<li>Document</li>
<li>Download</li>
<li>About</li>
</ul>
#end
更多关于标签 Tag 的内容请查看:标签 Tag