jetbrick-template-1.x 旧版文档请看这里:http://subchen.github.io/jetbrick-template/1x/

§指令 Directive

§1. 模板选项 #options

#options (
    loadmacro = "/macors/commons.jetx",
    loadmacro = "/macors/users.jetx",
    import = "java.lang.*",
    import = "java.util.*",
    safecall = true,
    strict = true,
    trimWhitespaces = true
)

其中:

§2. 变量类型声明 #define

为了让模板的可读性更好,以及防止一些未知的错误发生,我们提倡为模板中用到的每个变量声明变量类型。

语法:

示例:

#define(String name)
#define(UserInfo user, List userlist)

注意

  • 在同一个模板中,不允许重复声明变量类型
  • 变量必须先声明,再使用
  • strict 模式中,变量必须进行声明类型

§3. 赋值语句 #set

语法:

示例:

#set(int num = 1+2*3)
#set(color1 = "#ff0000", color2 = "#00ff00")

注意:在同一个模板中,不允许重复声明变量类型。

§4. 条件语句 #if, #elseif, #else

如果 #if 条件表达式计算结果为 true 或非空,则输出指令所包含的块, 否则输出 #else 指令块。

语法:

示例:

#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 支持以下类型的 expression

示例:

#for (Book book : user.books)
    ${for.index} // 内部循环计数器,从 1 开始计数
    ...
#end

§5.1 #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

expressiontrue#break 中断当前循环,而 #continue 跳过余下的内容,跳到下一个循环。

语法:

示例:

#for (book : user.books)
    ...
    #break(book.price > 100)
    ...
    #continue(book.price < 50)
    ...
#end

提示:无参数格式代表 expression 永远为 true

§7. 停止解析语句 #stop

expression 为真或非空时,停止模板运行,立刻返回。

语法:

示例:

#stop(error != null)

提示:无参数格式代表 expression 永远为 true

§8. 嵌套模板语句 #include

嵌入一个子模板,将子模板内容输出到当前位置。

语法:

示例:

#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

定义一个代码片段,然后可以重复使用。

宏定义语法:

注意: 每个宏可以定义 0~N 个参数,并可以选择声明类型。

宏调用语法:

示例:

#macro header(String name)
    Hello ${name}!
#end

#call header("张三")
#call header("李四")

输出结果:

    Hello 张三!
    Hello 李四!

更多关于宏 Macro 的内容请查看:宏 Macro

§10. 自定义标签 #tag

jetbrick-template 支持自定义 Tag,类似于 JSP Taglib,但是要比 JSP Taglib 更简单更好用。

语法:

注意

  • 需要在 Java 端先定义 Tag 标签的实现,并进行注册。
  • Tag 调用的参数必须和定义的一致。

示例:

#tag layout_block("list")
    <ul>
        <li>Home</li>
        <li>Document</li>
        <li>Download</li>
        <li>About</li>
    </ul>
#end

更多关于标签 Tag 的内容请查看:标签 Tag