04.Beetl常用内置函数以及安全输出---《Beetl视频课程》
本期視頻實(shí)現(xiàn)了三個(gè)功能,模糊搜索、標(biāo)簽分類、登錄/注銷功能;
內(nèi)容簡介:使用了常用內(nèi)置函數(shù),以及安全輸出,實(shí)現(xiàn)了上面提到的三個(gè)業(yè)務(wù)
一起學(xué)beetl目錄:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598
作者:GK
常用內(nèi)置方法
- date 返回一個(gè)java.util.Date類型的變量,如 date() 返回一個(gè)當(dāng)前時(shí)間(對(duì)應(yīng)java的java.util.Date); ${date( "2011-1-1" , "yyyy-MM-dd" )} 返回指定日期
- print 打印一個(gè)對(duì)象 print(user.name);
- println 打印一個(gè)對(duì)象以及回車換行符號(hào),回車換號(hào)符號(hào)使用的是模板本身的,而不是本地系統(tǒng)的.如果僅僅打印一個(gè)換行符,則直接調(diào)用println() 即可
- printFile 直接答應(yīng)文件,文件路徑以模板根目錄為相對(duì)目錄,printFile(‘‘/common/header.html’’);
- nvl 函數(shù)nvl,如果對(duì)象為null,則返回第二個(gè)參數(shù),否則,返回自己 nvl(user,"不存在")
- isEmpty 判斷變量或者表達(dá)式是否為空,變量不存在,變量為null,變量是空字符串,變量是空集合,變量是空數(shù)組,此函數(shù)都將返回true
- isNotEmpty 同上,判斷對(duì)象是否不為空
- has 變量名為參數(shù),判斷是否存在此全局變量,如 has(userList),類似于1.x版本的exist("userList"),但不需要輸入引號(hào)了
- assert 如果表達(dá)式為false,則拋出異常
- trim 截取數(shù)字或者日期,返回字符,如trim(12.456,2)返回"12.45",trim(date,'yyyy')返回"2017"
- trunc 截取數(shù)字,保留指定的小數(shù)位,如trunc(12.456,2) 輸出是12.45.不推薦使用,因?yàn)樘幚韋loat有問題,兼容原因保留了
- decode 一個(gè)簡化的if else 結(jié)構(gòu),如 ${decode(a,1,"a=1",2,"a=2","不知道了")},如果a是1,這decode輸出"a=1",如果a是2,則輸出"a==2", 如果是其他值,則輸出"不知道了"
- debug 在控制臺(tái)輸出debug指定的對(duì)象以及所在模板文件以及模板中的行數(shù),如debug(1),則輸出1 [在3行@/org/beetl/core/lab/hello.txt],也可以輸出多個(gè),如debug("hi",a),則輸出hi,a=123,[在3行@/org/beetl/core/lab/hello.txt]
- parseInt 將數(shù)字或者字符解析為整形 如 parseInt("123");
- parseLong 將數(shù)字或者字符解析為長整形,parseInt(123.12);
- parseDouble 將數(shù)字或者字符解析為浮點(diǎn)類型 如parseDouble("1.23")
- range 接收三個(gè)參數(shù),初始值,結(jié)束值,還有步增(可以不需要,則默認(rèn)為1),返回一個(gè)Iterator,常用于循環(huán)中,如for(var i in range(1,5)) {print(i)},將依次打印1234.
- flush 強(qiáng)制io輸出。
- json,將對(duì)象轉(zhuǎn)成json字符串,如 var data = json(userList) 可以跟一個(gè)序列化規(guī)則 如,var data = json(userList,"[*].id:i"),具體參考 https://git.oschina.net/xiandafu/beetl-json
- pageCtx ,僅僅在web開發(fā)中,設(shè)置一個(gè)變量,然后可以在頁面渲染過程中,調(diào)用此api獲取,如pageCtx("title","用戶添加頁面"),在其后任何地方,可以pageCtx("title") 獲取該變量
- type.new 創(chuàng)建一個(gè)對(duì)象實(shí)例,如 var user = type.new("com.xx.User"); 如果配置了IMPORT_PACKAGE,則可以省略包名,type.new("User")
- type.name 返回一個(gè)實(shí)例的名字,var userClassName = type.name(user),返回"User"
- global 返回一個(gè)全局變量值,參數(shù)是一個(gè)字符串,如 var user = global("user_"+i);
- cookie 返回指定的cookie對(duì)象 ,如var userCook = cookie("user"),allCookies = cookie();
字符串相關(guān)方法
- strutil方法對(duì)參數(shù)均不做空指針檢測,你可自定義方法來覆蓋這些內(nèi)置的方法
- 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",",")},參數(shù)第一個(gè)是字符串,第二個(gè)是正則表達(dá)式。輸出是數(shù)組:返回第一個(gè)是"hello",第二個(gè)是"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. 具體請(qǐng)參考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
數(shù)組相關(guān)方法
- array.range 返回?cái)?shù)組或者Collection一部分,接受三個(gè)參數(shù),第一個(gè)是數(shù)組或者Collection子類,第二,三個(gè)參數(shù)分別是起始位置
- array.remove 刪除某個(gè)數(shù)組或者Collection的一個(gè)元素,并返回該數(shù)組或者Collection.第一個(gè)是數(shù)組或者Collection子類,第二個(gè)參數(shù)是元素
- array.add 向數(shù)組或者Collection添加一個(gè)元素,并返回該數(shù)組或者Collection。第一個(gè)是數(shù)組或者Collection子類,第二個(gè)參數(shù)是元素
- array.contain 判斷數(shù)組或者元素是否包含元素,如果包含,返回true。否則false。第一個(gè)是數(shù)組或者Collection子類,第二個(gè)參數(shù)是元素
- array.toArray 轉(zhuǎn)化成數(shù)組,如array.toArray(1,2,"a");
- array.collection2Array 將java集合轉(zhuǎn)化為數(shù)組 array.collection2Array([1,2,''])
正則表達(dá)式相關(guān)方法
- reg.match(str,regex) str為需要處理的字符串,regex是表達(dá)式
- reg.replace(str,regex,replace),str為需要處理的字符串,regex是表達(dá)式,替換的字符串替換字符串
- reg.find(str,regex) 返回找到的符合表達(dá)式的第一個(gè)字符串,否則返回空字符串
- reg.findList(str,regex) 找到所有符合表達(dá)式的字符串,否則返回空列表
- reg.split(str,regex),對(duì)字符串進(jìn)行切分,返回列表
- reg.split(str,regex,limit) 同上,limit是最多返回個(gè)數(shù)
安全輸出
變量后面加一個(gè)感嘆號(hào)標(biāo)識(shí)安全輸出,占位符,定界符都可以使用,感嘆號(hào)后面可以寫默認(rèn)值
例如:
安全輸出是任何一個(gè)模板引擎必須重視的問題,否則,將極大困擾模板開發(fā)者。Beetl中,如果要輸出的模板變量為null,則beetl將不做輸出,這點(diǎn)不同于JSP,JSP輸出null,也不同于Freemarker,如果沒有用!,它會(huì)報(bào)錯(cuò).
模板中還有倆種情況會(huì)導(dǎo)致模板輸出異常
有時(shí)候模板變量并不存在(譬如子模板里)
模板變量為null,但輸出的是此變量的一個(gè)屬性,如${user.wife.name}
針對(duì)前倆種情況,可以在變量引用后加上!以提醒beetl這是一個(gè)安全輸出的變量。
如${user.wife.name! },即使user不存在,或者user為null,或者user.wife為null,或者user.wife.name為null beetl都不將輸出
可以在!后增加一個(gè)常量(字符串,數(shù)字類型等),或者另外一個(gè)變量,方法,本地調(diào)用,作為默認(rèn)輸出,譬如:
${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
還有一種情況很少發(fā)生,但也有可能,輸出模板變量發(fā)生的任何異常,如變量內(nèi)部拋出的一個(gè)異常
這需要使用格式${!(變量)},這樣,在變量引用發(fā)生任何異常情況下,都不作輸出,譬如
${!(user.name)},,beetl將會(huì)調(diào)用user.getName()方法,如果發(fā)生異常,beetl將會(huì)忽略此異常,繼續(xù)渲染
值得注意的是,在變量后加上!不僅僅可以應(yīng)用于占位符輸出(但主要是應(yīng)用于占位符輸出),也可以用于表達(dá)式中,如:
<% var k = user.name!'N/A'+user.age!; %> <% ${k} %> 如果user為null,則k值將為N/A項(xiàng)目git地址:https://gitee.com/gavink/beetl-blog
視頻地址:下載下來會(huì)更清晰,視頻比較長,可使用倍速看,主要實(shí)現(xiàn)業(yè)務(wù)比較的地方耗費(fèi)時(shí)間長
百度網(wǎng)盤下載: https://pan.baidu.com/s/1LyxAxlKpVXgVjwSXIbzBuA 提取碼: 68im
bilibili (可以調(diào)節(jié)清晰度): https://www.bilibili.com/video/av36278644/?p=4
博客目錄:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的04.Beetl常用内置函数以及安全输出---《Beetl视频课程》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看是否安装android sdk
- 下一篇: 团队任务3:软件设计与开发准备