§表达式 Expression
支持几乎所有 Java 表达式 (based on Java 6.0),并对其进行了一些有用的扩展。
§1. 与 Java 相同的地方 (运算符优先级和 Java 保存一致)
- 数字常量: 
123123L0.01D99.99E-10D - 字符串常量: 
"abc\r\n"'abc\u00A0\r\n' - BOOLEAN 常量:
truefalse - NULL 常量: 
null - 算术运行: 
+-*/% - 位运算: 
~&| - 移位运算: 
>>>>><< - 比较运算: 
==!=>>=<<= - 逻辑运算: 
!&&|| - 三元表达式: 
? : - 实例对象判断: 
instanceof - NEW 对象:
new Object(...) - 数组存取:
array[i] - 字段访问:
obj.field - 方法调用:
obj.method(...) - 支持数组定义:
String[] 
提示: 方法调用支持可变参数方法(Varargs)和重载方法(Overload)
§2. 与 Java 不同的地方 (扩展语法/语义)
扩展语法:
- 单引号字符串:
'abc\u00A0\r\n' - 内存地址比较:
===!== - 简化的三元表达式:
a ?: b,等价于:(a) ? a : b - NULL 默认值:
a ?! b,等价于:(a != null) ? a : b(支持级联检查 NULL 错误,如a.b.c ?! defaultValue) - 静态字段调用:
Long::MAX_VALUE - 静态方法调用:
Long::valueOf("123") - List 常量:
[1,2,3] - Map 常量:
{name:"jetbrick", version: 2.0} 
扩展语义:
- 双等号 
==会被解析成equals()方法比较,而不是比内存地址。 - Bean 属性默认会解析成 getter 方法调用,
${user.name}等价于${user.getName()} - 所有实现 
Comparable的对象都支持比较运算符,比如:#if(date1 < date2),可以比较日期的先后。 - 所有对象都支持条件测试,并返回 
true或者false。对于非Boolean对象,所有非零数字,非空字串,非空集合,非null对象,即为true。 Map支持.访问内部的对象(属性调用),如:map.key。List和Map支持方括号取值:list[0]等价于list.get(0),map["abc"]等价于map.get("abc")
§3. 不支持的 Java 语法
- 不支持 
++,--表达式 - 不支持泛型
 - 不支持强制类型转换
 
§4. 变量名 Variable
可以是任意合法的 Java 变量名:
- 其中 
$开头的变量为模板内部变量,不允许直接使用。 - 不允许使用 Java 关键字和保留字。
 
合法的变量名范例:user, user_name, userName
内置的特殊变量:
for: 用于#for指令内部状态对象。具体参考#for指令用法。
§5. List 常量
语法:
[item, ...]
示例:
[] // empty List
[1, 2, 3, 4, 5]
["abc", 123, new Date(), 1+2*3]
 
取值:
${list[index]}
${list.get(index)}
 
§6. Map 常量
语法:
{key: value, ...}
key 可以加单双引号,也可以不加 (和 JSON 一样)
示例:
{} // empty Map {name: "Jason", "statue": 0}  
取值:
${map.key}
${map["key"]}
${map.get("key")}
 
§7. Bean 属性调用 bean.property
Bean 属性默认会被解析成 getter 方法调用。
属性查找顺序,以 ${obj.foo} 为例:
- 查找 obj.getFoo() 方法
 - 查找 obj.isFoo() 方法
 - 查找 obj class 的 foo 字段
 - 查找 map.get(name) 方法 (如果是 
Map) - 自定义的 Getter Resolver
 
§8. Bean 方法调用 bean.method(...)
- 支持普通方法调用
 - 支持不定长参数方法调用 Varargs
 - 支持方法重载 Overload
 - 支持扩展方法调用。参考:扩展方法调用
 
示例:
${"Hello".substring(2)}
${"Hello".substring(2, 3)}
 
§9. 函数调用 function
jetbrick-template 还支持函数调用,如 ${now()}, ${fileGet("/test.txt")}。
具体参考:扩展函数调用
§10. 静态字段调用 Class::Field
语法:
Class::Field
示例:
${Long::MAX_VALUE}
${java.lang.Long::MAX_VALUE}
 
§11. 静态方法调用 Class::method
语法:
Class::method(...)
示例:
${Collections::emptyList()}
${java.lang.Long::valueOf("123")}
 
§12. NULL 默认值
语法:
expression ?! defaultValue
类似于 Freemarker 中的 ! 操作符,如果 expression 为 NULL,则返回 defaultValue。
提示:
?!支持级联操作,如果obj.name这样的表达式中obj为NULL,即使safecall=false的情况下,同样不会抛出NullPointerException。
示例:
${status ?! 0}
${user.status ?! 0}  #// 如果 user==null, 同样会返回 0 (无需开启 safecall)