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.