1.如果表达式跟定界符或者占位符有冲突,可以在用 “\” 符号
@for(user in users){ email is ${user.name}\@163.com @} ${[1,2,3]} //输出一个json列表 ${ {key:1,value:2 \} } //输出一个json map,} 需要加上\
2.Beetl里定义的临时变量类型默认对应的java是Int型或者double类型,对于模板常用情况说,已经够了.如果需要定义长精度类型(对应java的BigDecimal),则需要在数字末尾加上h以表示这是长精度BigDecimal,其后的计算和输出以及逻辑表达式都将按照长精度类型来考虑。
<% var a = 1; var b = "hi"; var c = a++; var d = a+100.232; var e = (d+12)*a; var f = 122228833330322.1112h %>
3.三元表达式如果只考虑true条件对应的值的话,可以做简化,如下俩行效果是一样的。
<% var a = 1 ; %> ${a==1?"ok":‘‘} ${a==1?"ok"}
4.如果没有进入for循环体,还可以执行elsefor指定的语句。
<% var list = []; for(item in list){ }elsefor{ print("未有记录"); } %>
5.for-in循环支持遍历集合对象,对于List和数组来说以及Iterator,对象就是集合对象,对于Map来说,对象就是Map.entry,如下俩个例子
<% for(user in userList){ print(userLP.index); print(user.name); } %>
<% for(entry in map){ var key = entry.key; var value = entry.value; print(value.name); } %>
6.userLP是Beetl隐含定义的变量,能在循环体内使用。其命名规范是item名称后加上LP,他提供了当前循环的信息
userLP.index :当前的索引,从1开始 userLP.size:集合的长度 userLP.first 是否是第一个 userLP.last 是否是最后一个 userLP.even 索引是否是偶数 userLP.odd 索引是否是奇数
7.Beetl 还可以定位额外的对象属性,而无需更改java对象,这叫着虚拟属性,如,对于所有集合,数组,都有共同的虚拟熟悉size.虚拟属性是“.~”+虚拟1属性名
template.binding("list",service.getUserList()); template.binding("pageMap",service.getPage()); //在模板里 总共 ${list.~size} <% for(user in list){ %> hello,${user.name}; <%}%> 当前页${pageMap[‘page‘]},总共${pageMap["total"]}
8.同js一样,支持switch-case,switch变量可以支持任何类型,而不像js那样只能是整形
<% var b = 1; switch(b){ case 0: print("it‘s 0"); break; case 1: print("it‘s 1"); break; default: print("error"); } %>
9.select-case 是switch case的增强版。他允许case 里有逻辑表达式,同时,也不需要每个case都break一下,默认遇到合乎条件的case执行后就退出。
<% var b = 1; select(b){ case 0,1: print("it‘s small int"); case 2,3: print("it‘s big int"); default: print("error"); } %>
select 后也不需要一个变量,这样case 后的逻辑表达式将决定执行哪个case
<% var b = 1; select{ case b<1,b>10: print("it‘s out of range"); break; case b==1: print("it‘s 1"); break; default: print("error"); } %>
10.通常模板渲染逻辑很少用到try-catch 但考虑到渲染逻辑复杂性,以及模板也有不可控的地方,所以提供try catch,在渲染失败的时候仍然能保证输出正常
<% try{ callOtherSystemView() }catch(error){ print("暂时无数据"); } %>
error代表了一个异常,你可以通过error.message 来获取可能的错误信息
也可以省略catch部分,这样出现异常,不做任何操作
11.虚拟属性也是对象的属性,但是虚拟的,非模型对象的真实属性,这样的好处是当模板需要额外的用于显示的属性的时候但又不想更改模型,便可以采用这种办法 如beetl内置的虚拟属性.~size 针对了数组以及集合类型。
${user.gender} ${user.~genderShowName}
~genderShowName 是虚拟属性,其内部实现根据boolean变量gender来显示性别
12.安全输出是任何一个模板引擎必须重视的问题,否则,将极大困扰模板开发者。Beetl中,如果要输出的模板变量为null,则beetl将不做输出,这点不同于JSP,JSP输出null,也不同于Feemarker,如果没有用!,它会报错.
模板中还有俩种情况会导致模板输出异常 有时候模板变量并不存在(譬如子模板里) 模板变量为null,但输出的是此变量的一个属性,如${user.wife.name}
针对前俩种种情况,可以在变量引用后加上!以提醒beetl这是一个安全输出的变量。 如${user.wife.name! },即使user不存在,或者user为null,或者user.wife为null,或者user.wife.name为null beetl都不将输出 可以在!后增加一个常量(字符串,数字类型等),或者另外一个变量,方法,本地调用,作为默认输出,譬如: ${user.wife.name!”单身”},如果user为null,或者user.wife为null,或者user.wife.name为null,输出”单身” 譬如 ${user.birthday!@System.constants.DefaultBir}, 表示如果user为null,或者user. birthday为null,输出System.constants.DefaultBir 还有一种情况很少发生,但也有可能,输出模板变量发生的任何异常,如变量内部抛出的一个异常 这需要使用格式${!(变量)},这样,在变量引用发生任何异常情况下,都不作输出,譬如 ${!(user.name)},,beetl将会调用user.getName()方法,如果发生异常,beetl将会忽略此异常,继续渲染
13.在变量后加上!不仅仅可以应用于占位符输出(但主要是应用于占位符输出),也可以用于表达式中
<% <% var k = user.name!‘N/A‘+user.age!; %> ${k} %> 如果user为null,则k值将为N/A
14.在有些模板里,可能整个模板都需要安全输出,也可能模板的部分需要安全输出,使用者不必为每一个表达式使用!,可以使用beetl的安全指示符号来完成安全输出 如:
<% DIRECTIVE SAFE_OUTPUT_OPEN; %> ${user.wife.name} 模板其他内容,均能安全输出…… <% //关闭安全输出。 DIRECTIVE SAFE_OUTPUT_CLOSE; %>
15.在for-in 循环中 ,也可以为集合变量增加安全输出指示符号,这样,如果集合变量为null,也可以不进入循环体
<% var list = null; for(item in list!){ }eslefor{ print("no data"); } %>
16.2.21