| 程序包 | 说明 |
|---|---|
| com.jfinal.kit | |
| com.jfinal.template | |
| com.jfinal.template.ext.directive | |
| com.jfinal.template.stat.ast |
| 限定符和类型 | 类和说明 |
|---|---|
static class |
ElKit.InnerEvalDirective |
| 限定符和类型 | 类和说明 |
|---|---|
class |
Directive
Directive 供用户继承并扩展自定义指令,具体用法可以参考
com.jfinal.template.ext.directive 包下面的例子
|
| 限定符和类型 | 字段和说明 |
|---|---|
protected Stat |
Directive.stat
具有 #end 结束符的指令内部嵌套的所有内容,调用 stat.exec(env, scope, writer)
即可执行指令内部嵌入所有指令与表达式,如果指令没有 #end 结束符,该属性无效
|
| 限定符和类型 | 方法和说明 |
|---|---|
void |
Template.Func.call(Stat ast,
Env env,
Scope scope,
T t) |
void |
Directive.setStat(Stat stat)
指令被解析时注入指令 body 内容,仅对于具有 #end 结束符的指令有效
|
| 构造器和说明 |
|---|
Template(Env env,
Stat ast) |
| 限定符和类型 | 类和说明 |
|---|---|
class |
CallDirective
CallDirective 动态调用模板函数
模板函数的名称与参数都可以动态指定,提升模板函数调用的灵活性
例如:
#call(funcName, p1, p2, ..., pn)
其中 funcName,为函数名,p1、p2、pn 为被调用函数所使用的参数
如果希望模板函数不存在时忽略其调用,添加常量值 true 在第一个参数位置即可
例如:
#call(true, funcName, p1, p2, ..., pn)
TODO 后续优化看一下 ast.Call.java
|
class |
DateDirective
#date 日期格式化输出指令
三种用法:
1:#date(createAt) 用默认 datePattern 配置,输出 createAt 变量中的日期值
2:#date(createAt, "yyyy-MM-dd HH:mm:ss") 用第二个参数指定的 datePattern,输出 createAt 变量中的日期值
3:#date() 用默认 datePattern 配置,输出 “当前” 日期值
注意:
1:#date 指令中的参数可以是变量,例如:#date(d, p) 中的 d 与 p 可以全都是变量
2:默认 datePattern 可通过 Engine.setDatePattern(...)
|
class |
EscapeDirective
Escape 对字符串进行转义
用法:
#escape(value)
|
class |
NowDirective
根据 datePattern 参数输出当前时间,未指定 datePattern 参数时默认使用以下配置
env.getEngineConfig().getDatePattern()
注意该指令需要配置才能使用:
engine.addDirective("now", NowDirective.class, true);
例子:
1:#now()
2:#now("HH:mm:ss")
3:#now("yyyy-MM-dd HH:mm:ss")
|
class |
NumberDirective
#number 数字格式化输出指令
优化时要注意 DecimalFormat 并非线程安全
两种用法:
1:#number(n) 用默认 pattern 输出变量中的值
2:#number(n, "#.##") 用第二个参数指定的 pattern 输出变量中的值
注意:
1:pattern 的使用与 java.text.DecimalFormat 的完全一样
在拿不定主意的时候可以在搜索引擎中搜索关键字:DecimalFormat
2:#number 指令中的参数可以是变量,例如:#number(n, p) 中的 n 与 p 可以全都是变量
示例:
#number(3.1415926, "#.##")
#number(0.9518, "#.##%")
#number(300000, "光速为每秒 ,### 公里。")
|
class |
RandomDirective
输出 int 型随机数
|
class |
RenderDirective
#render 指令用于动态渲染子模板,作为 include 指令的补充
两种用法:
1:只传入一个参数,参数可以是 String 常量,也可以是任意表达式
#render("_hot.html")
#render(subFile)
2:传入任意多个参数,除第一个参数以外的所有参数必须是赋值表达式,用于实现参数传递功能
#render("_hot.html", title = "热门新闻", list = newsList)
上例中传递了 title、list 两个参数,可以代替父模板中的 #set 指令传参方式
并且此方式传入的参数只在子模板作用域有效,不会污染父模板作用域
这种传参方式有利于将子模板模块化,例如上例的调用改成如下的参数:
#render("_hot.html", title = "热门项目", list = projectList)
通过这种传参方式在子模板 _hot.html 之中,完全不需要修改对于 title 与 list
这两个变量的处理代码,就实现了对 “热门项目” 数据的渲染
|
static class |
RenderDirective.SubStat |
class |
StringDirective
#string 指令方便定义大量的多行文本变量,这个是 java 语言中极为需要的功能
定义:
#string(name)
在此是大量的字符串
#end
使用:
#(name)
|
| 限定符和类型 | 字段和说明 |
|---|---|
Stat |
RenderDirective.SubStat.stat |
| 构造器和说明 |
|---|
SubStat(RenderDirective.SubEnv env,
Stat stat,
ISource source) |
| 限定符和类型 | 类和说明 |
|---|---|
class |
Break
Break
java 中 break、continue 可出现在 for 中的最后一行,不一定要套在 if 中
|
class |
Call
Call 调用模板函数,两种用法:
1:常规调用
#@funcName(p1, p2, ..., pn)
2:安全调用,函数被定义才调用,否则跳过
#@funcName?
|
class |
Case
Case
|
class |
Continue
Continue
|
class |
Default
Default
#switch 指令内部的 #default 指令
|
class |
Define
Define 定义模板函数:
#define funcName(p1, p2, ..., pn)
body
#end
模板函数类型:
1:全局共享的模板函数
通过 engine.addSharedFunction(...)
|
class |
Else
Else
|
class |
ElseIf
ElseIf
|
class |
For
For 循环控制,支持 List、Map、数组、Collection、Iterator、Iterable
Enumeration、null 以及任意单个对象的迭代,简单说是支持所有对象迭代
主要用法:
1:#for(item : list) #(item) #end
2:#for(item : list) #(item) #else content #end
3:#for(i=0; i<9; i++) #(item) #end
4:#for(i=0; i<9; i++) #(item) #else content #end
|
class |
If
If
|
class |
Include
Include
1:父模板被缓存时,被 include 的模板会被间接缓存,无需关心缓存问题
2:同一个模板文件被多个父模板 include,所处的背景环境不同,例如各父模板中定义的模板函数不同
各父模板所处的相对路径不同,所以多个父模板不能共用一次 parse 出来的结果,而是在每个被include
的地方重新 parse
两种用法:
1:只传入一个参数,参数必须是 String 常量,如果希望第一个参数是变量可以使用 #render 指令去实现
#include("_hot.html")
2:传入任意多个参数,除第一个参数以外的所有参数必须是赋值表达式,用于实现参数传递功能
#include("_hot.html", title = "热门新闻", list = newsList)
上例中传递了 title、list 两个参数,可以代替父模板中的 #set 指令传参方式
并且此方式传入的参数只在子模板作用域有效,不会污染父模板作用域
这种传参方式有利于将子模板模块化,例如上例的调用改成如下的参数:
#include("_hot.html", title = "热门项目", list = projectList)
通过这种传参方式在子模板 _hot.html 之中,完全不需要修改对于 title 与 list
这两个变量的处理代码,就实现了对 “热门项目” 数据的渲染
|
class |
NullStat
NullStat
|
class |
Output
Output 输出指令
用法:
1:#(value)
2:#(x = 1, y = 2, x + y)
3:#(seoTitle ??
|
class |
Return
Return
通常用于 #define 指令内部,不支持返回值
|
class |
ReturnIf
#returnIf(expr) 指令,当 expr 为 true 时返回,等价于:
#if (expr)
#return
#end
|
class |
Set
Set 赋值,从内向外作用域查找变量,找到则替换变量值,否则在顶层作用域赋值
用法:
1:#set(k = v)
2:#set(k1 = v1, k2 = v2, ..., kn = vn)
3:#set(x = 1+2)
4:#set(x = 1+2, y = 3>4, ..., z = c ?
|
class |
SetGlobal
SetGlobal 设置全局变量,全局作用域是指本次请求的整个 template
适用于极少数的在内层作用域中希望直接操作顶层作用域的场景
|
class |
SetLocal
SetLocal 设置局部变量
通常用于 #define #include 指令内部需要与外层作用域区分,以便于定义重用型模块的场景
也常用于 #for 循环内部的临时变量
|
class |
StatList
StatList
|
class |
Switch
Switch
#switch 指令与 Java 12 switch 新特性的设计相似: http://openjdk.java.net/jeps/325
在与 java 老版本指令基本用法相同的基础上,主要变化与特性有:
1: 移除 java 语法中的 fall-through semantics,即不需要 break 关键字进行断开
2: 不引入 #break 指令,代码更少、更优雅
3: #case 参数可使用多个用逗号分隔的表达式,每个表达式求值后与 #switch 参数求值后比较,
从根本上消除了 #break 指令的必要性
4: #case 支持任意类型数据与表达式(java 语言只支持少数常量类型)
示例:
#switch (month)
#case (1, 3, 5, 7, 8, 10, 12)
#(month) 月有 31 天
#case (2)
#(month) 月平年有28天,闰年有29天
#default
月份错误: #(month ??
|
class |
Text
Text 输出纯文本块以及使用 "#[[" 与 "]]#" 定义的原样输出块
|
| 限定符和类型 | 字段和说明 |
|---|---|
static Stat |
StatList.NULL_STAT |
static Stat[] |
StatList.NULL_STAT_ARRAY |
| 限定符和类型 | 方法和说明 |
|---|---|
Stat |
StatList.getActualStat()
持有 StatList 的指令可以通过此方法提升 AST 执行性能
1:当 statArray.length > 1 时返回 StatList 自身
2:当 statArray.length == 1 时返回 statArray[0]
3:其它情况返回 NullStat
意义在于,当满足前面两个条件时,避免掉了 StatList.exec(...)
|
Stat |
StatList.getStat(int index) |
Stat |
Stat.setLocation(Location location) |
| 限定符和类型 | 方法和说明 |
|---|---|
void |
If.setStat(Stat elseIfOrElse)
take over setStat(...) method of super class
|
void |
ElseIf.setStat(Stat elseIfOrElse)
take over setStat(...) method of super class
|
void |
Stat.setStat(Stat stat) |
| 构造器和说明 |
|---|
For(ForCtrl forCtrl,
StatList statList,
Stat _else) |
| 构造器和说明 |
|---|
StatList(List<Stat> statList) |
Copyright © 2024. All rights reserved.