Beetl使用注意事项

摘要:
varb=“hi”;%对于(userinuserList){print(userLP.index);print(user.name);print(value.name));//总计${list.~size}<在模板中;当前页面${pageMap['page']};开关(b){case0;选择(b)}{case 0;打印(“it'sbigint”):

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.可以调用instance的public方法和属性,也可以调用静态类的属性和方法 ,需要加一个 @指示此调用是直接调用class,其后的表达式是java风格的。

${@user.getMaxFriend(“lucy”)}
${@user.maxFriend[0].getName()}
${@com.xxxx.constants.Order.getMaxNum()}
${@com.xxxx.User$Gender.MAN}
<%
var max = @com.xxxx.constants.Order.MAX_NUM;
%>

17.

 

免责声明:文章转载自《Beetl使用注意事项》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JAVA中不用+ 如何实现加法文档根元素 "select" 必须匹配 DOCTYPE 根 "null"下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

loadrunner 打印变量

打印userid变量参数的信息 web_submit_form("ValidateLoginAction.do_2","Snapshot=t2.inf",ITEMDATA,"Name=userid", "Value={userid}", ENDITEM,"Name=pword", "Value={password}", ENDITEM,"Name=prog...

Android studio常用快捷键

Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似eclipseADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试,基于Gradle的构建支持。 最常用快捷键1.Ctrl+E,可以显示最近编辑的文件列表2.Shift+Click可以关闭文件3.Ctrl+[或]可以跳到大括号...

Vim 命令整理

1. 文件命令 2. 模式切换 3. 移动命令 4. 书签命令 5. 修改命令 6. 可视化操作 7. 区域选择 8. 宏命令 9. 分屏 10. 系统设置命令 1. 文件命令 [:]开始的命令需要输入[Enter]结束   :q:退出 :q!:退出不保存 :qa!:退出所有文件不保存 :w:保存 :e <file>:关闭当前文件并打开另一个...

【看书】关于for循环中定义变量的后续讨论

想想除了看书时之外 有时也会幸运地有点想法 所以再开一个类别来记录吧~ 在下希望这个分类下的博文越多越好 -.- ——中午记录——— 晚上有场个人赛 感觉略紧张啊…… 万一爆零肿么办 -_- 感觉晚上还会来编辑一次 先立个flag 【关于for循环中定义变量的后续讨论】 上次在书中看到了关于for循环中定义的变量问题1【看书】for循环中的定...

java内存及数据区

Java运行时的数据区包括:(其中前两个是线程共享的) 1.方法区(Method Area) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 2.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存 3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Fram...

Axure 入门

Axure RP是一个专业的快速原型设计工具。Axure(发音:Ack-sure),代表美国Axure公司;RP则是Rapid Prototyping(快速原型)的缩写。 Axure RP是美国Axure Software Solution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软件或Web网站...