天天看點

04.Beetl常用内置函數以及安全輸出---《Beetl視訊課程》常用内置方法安全輸出

本期視訊實作了三個功能,模糊搜尋、标簽分類、登入/登出功能;

内容簡介:使用了常用内置函數,以及安全輸出,實作了上面提到的三個業務

一起學beetl目錄:

https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598 作者:GK

常用内置方法

  • date 傳回一個java.util.Date類型的變量,如 date() 傳回一個目前時間(對應java的java.util.Date); ${date( "2011-1-1" , "yyyy-MM-dd" )} 傳回指定日期
  • print 列印一個對象 print(user.name);
  • println 列印一個對象以及回車換行符号,回車換号符号使用的是模闆本身的,而不是本地系統的.如果僅僅列印一個換行符,則直接調用println() 即可
  • printFile 直接答應檔案,檔案路徑以模闆根目錄為相對目錄,printFile(‘‘/common/header.html’’);
  • nvl 函數nvl,如果對象為null,則傳回第二個參數,否則,傳回自己 nvl(user,"不存在")
  • isEmpty 判斷變量或者表達式是否為空,變量不存在,變量為null,變量是空字元串,變量是空集合,變量是空數組,此函數都将傳回true
  • isNotEmpty 同上,判斷對象是否不為空
  • has 變量名為參數,判斷是否存在此全局變量,如 has(userList),類似于1.x版本的exist("userList"),但不需要輸入引号了
  • assert 如果表達式為false,則抛出異常
  • trim 截取數字或者日期,傳回字元,如trim(12.456,2)傳回"12.45",trim(date,'yyyy')傳回"2017"
  • trunc 截取數字,保留指定的小數位,如trunc(12.456,2) 輸出是12.45.不推薦使用,因為處理float有問題,相容原因保留了
  • decode 一個簡化的if else 結構,如 ${decode(a,1,"a=1",2,"a=2","不知道了")},如果a是1,這decode輸出"a=1",如果a是2,則輸出"a==2", 如果是其他值,則輸出"不知道了"
  • debug 在控制台輸出debug指定的對象以及所在模闆檔案以及模闆中的行數,如debug(1),則輸出1 [在3行@/org/beetl/core/lab/hello.txt],也可以輸出多個,如debug("hi",a),則輸出hi,a=123,[在3行@/org/beetl/core/lab/hello.txt]
  • parseInt 将數字或者字元解析為整形 如 parseInt("123");
  • parseLong 将數字或者字元解析為長整形,parseInt(123.12);
  • parseDouble 将數字或者字元解析為浮點類型 如parseDouble("1.23")
  • range 接收三個參數,初始值,結束值,還有步增(可以不需要,則預設為1),傳回一個Iterator,常用于循環中,如for(var i in range(1,5)) {print(i)},将依次列印1234.
  • flush 強制io輸出。
  • json,将對象轉成json字元串,如 var data = json(userList) 可以跟一個序列化規則 如,var data = json(userList,"[*].id:i"),具體參考 https://git.oschina.net/xiandafu/beetl-json
  • pageCtx ,僅僅在web開發中,設定一個變量,然後可以在頁面渲染過程中,調用此api擷取,如pageCtx("title","使用者添加頁面"),在其後任何地方,可以pageCtx("title") 擷取該變量
  • type.new 建立一個對象執行個體,如 var user = type.new("com.xx.User"); 如果配置了IMPORT_PACKAGE,則可以省略包名,type.new("User")
  • type.name 傳回一個執行個體的名字,var userClassName = type.name(user),傳回"User"
  • global 傳回一個全局變量值,參數是一個字元串,如 var user = global("user_"+i);
  • cookie 傳回指定的cookie對象 ,如var userCook = cookie("user"),allCookies = cookie();

字元串相關方法

  • strutil方法對參數均不做空指針檢測,你可自定義方法來覆寫這些内置的方法
  • strutil.startWith ${ strutil.startWith("hello","he")} 輸出是true
  • strutil.endWith ${ strutil.endWith("hello","o")} 輸出是true
  • strutil.length ${ strutil. length ("hello")},輸出是5
  • strutil.subString ${ strutil.subString ("hello",1)},輸出是"ello"
  • strutil.subStringTo ${ strutil.subStringTo ("hello",1,2)},輸出是"e"
  • strutil.split ${ strutil.split ("hello,joeli",",")},參數第一個是字元串,第二個是正規表達式。輸出是數組:傳回第一個是"hello",第二個是"joelli"
  • strutil.contain ${ strutil.contain ("hello,"el")},輸出是true
  • strutil.toUpperCase ${ strutil.toUpperCase ("hello")},輸出是HELLO
  • strutil.toLowerCase ${ strutil.toLowerCase ("hello")},輸出是hello
  • strutil.replace ${ strutil.replace ("hello","lo","loooo")},輸出是helloooo
  • strutil.format ${ strutil.format ("hello,{0}, my age is {1}","joeli",15)},輸出是hello,joeli, my age is 15. 具體請參考 http://docs.oracle.com/javase/6/docs/api/java/text/MessageFormat.html
  • strutil.trim 去掉字元串的尾部空格
  • strutil.formatDate var a = strutil.formatDate(user.bir,'yyyy-MM-dd')};
  • strutil.index var index = strutil.index("abc","a");傳回 索引0
  • strutil.lastIndex var index = strutil.lastIndex("aba","a");傳回索引2

數組相關方法

  • array.range 傳回數組或者Collection一部分,接受三個參數,第一個是數組或者Collection子類,第二,三個參數分别是起始位置
  • array.remove 删除某個數組或者Collection的一個元素,并傳回該數組或者Collection.第一個是數組或者Collection子類,第二個參數是元素
  • array.add 向數組或者Collection添加一個元素,并傳回該數組或者Collection。第一個是數組或者Collection子類,第二個參數是元素
  • array.contain 判斷數組或者元素是否包含元素,如果包含,傳回true。否則false。第一個是數組或者Collection子類,第二個參數是元素
  • array.toArray 轉化成數組,如array.toArray(1,2,"a");
  • array.collection2Array 将java集合轉化為數組 array.collection2Array([1,2,''])

正規表達式相關方法

  • reg.match(str,regex) str為需要處理的字元串,regex是表達式
  • reg.replace(str,regex,replace),str為需要處理的字元串,regex是表達式,替換的字元串替換字元串
  • reg.find(str,regex) 傳回找到的符合表達式的第一個字元串,否則傳回空字元串
  • reg.findList(str,regex) 找到所有符合表達式的字元串,否則傳回空清單
  • reg.split(str,regex),對字元串進行切分,傳回清單
  • reg.split(str,regex,limit) 同上,limit是最多傳回個數

安全輸出

變量後面加一個感歎号辨別安全輸出,占位符,定界符都可以使用,感歎号後面可以寫預設值

例如:

${userName!}
${userName!"預設值"}
<%if(userName!"xxxx"=="xxxx"){......}%>           

安全輸出是任何一個模闆引擎必須重視的問題,否則,将極大困擾模闆開發者。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,輸出”單身”

譬如

${[email protected]}, 表示如果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           

項目git位址:

https://gitee.com/gavink/beetl-blog

視訊位址:下載下傳下來會更清晰,視訊比較長,可使用倍速看,主要實作業務比較的地方耗費時間長

百度網盤下載下傳:

https://pan.baidu.com/s/1LyxAxlKpVXgVjwSXIbzBuA

提取碼: 68im

bilibili (可以調節清晰度):

https://www.bilibili.com/video/av36278644/?p=4

部落格目錄: