轉自:http://ibeetl.com/guide/#beetl
2.20. 安全輸出
安全輸出是任何一個模板引擎必須重視的問題,否則,將極大困擾模板開發者。Beetl中,如果要輸出的模板變量為null,則beetl將不做輸出,這點不同於JSP,JSP輸出null,也不同於Freemarker,如果沒有用!,它會報錯.
模板中還有倆種情況會導致模板輸出異常
- 有時候模板變量並不存在(譬如子模板里)
- 模板變量為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將會忽略此異常,繼續渲染
值得注意的是,在變量后加上!不僅僅可以應用於占位符輸出(但主要是應用於占位符輸出),也可以用於表達式中,如:
<%
var k = user.name!'N/A'+user.age!;
%> <% ${k} %>
如果user為null,則k值將為N/A
在有些模板里,可能整個模板都需要安全輸出,也可能模板的部分需要安全輸出,使用者不必為每一個表達式使用!,可以使用beetl的安全指示符號來完成安全輸出 如:
<%
DIRECTIVE SAFE_OUTPUT_OPEN;
%> ${user.wife.name} 模板其他內容,均能安全輸出…… <% //關閉安全輸出。 DIRECTIVE SAFE_OUTPUT_CLOSE; %>
Beetl不建議每一個頁面都使用DIRECTIVE SAFE_OUTPUT_OPEN,這樣,如果如果真有不期望的錯誤,不容易及時發現,其次,安全輸出意味着beetl會有額外的代碼檢測值是否存在或者是否為null,性能會略差點。所以建議及時關閉安全輸出(這不是必須的,但頁面所有地方是安全輸出,可能不容易發現錯誤)
在for-in 循環中 ,也可以為集合變量增加安全輸出指示符號,這樣,如果集合變量為null,也可以不進入循環體,如:
<%
var list = null; for(item in list!){ }elsefor{ print("no data"); } %>