##方法
FN.isEmpty = org.beetl.ext.fn.EmptyExpressionFunction
##內置的功能包
FNP.strutil = org.beetl.ext.fn.StringUtil
##內置的格式化函數
FT.dateFormat = org.beetl.ext.format.DateFormat
##內置的默認格式化函數
FTC.java.util.Date = org.beetl.ext.format.DateFormat
FTC.java.sql.Date = org.beetl.ext.format.DateFormat
FN:即方法。
在模板裏面可以直接調用:如上所示的isEmpty()方法,調用如下:
@ if(isEmpty(aaa)){}
這個方法實際上走的就是org.beetl.ext.fn.EmptyExpressionFunction.call()方法。查看源碼可以得知,EmptyExpressionFunction實現自Function接口。function接口只有一個方法:
public interface Function
{
public Object call(Object[] paras, Context ctx);
}
其中paras是參數,ctx是整個beetl的上下文,Object是返回值。
那麼EmptyExpressionFunction就是這樣簡單的實現,判斷參數paras[0]是否爲null如果爲null,則返回true,否則返回false(當然實際上不是這樣簡單的判斷,但大致意思如此。)
那麼在模板遇到isEmpty的時候就會調用EmptyExpressionFunction的call方法的。
根據這個原理,我們也可以寫任意一個類來實現自Function,然後在beetl.properties裏填寫並註冊進去。
FNP:工具類
很多時候,我們針對某種特殊處理並不只需要一個方法,如我們常用的StringUtils這個類,裏面大約有好幾個方法需要使用。難道我爲了在beetl裏使用這些功能,我要新建好幾個function嗎?並不是,你可以將一個類註冊爲FNP,那麼就可以在beetl裏使用了。
仔細看看beetl-default.properties他配置的FNP大概就知道怎麼用的了。和FN差不多。
FT:格式化函數。
這個仔細查看,會發現,它和function方法差不多,但是它不是實現function接口,而是實現format接口。那麼我們利用funcition來做到這個格式化功能行不行呢?
行,當然行,只是有個問題:
function接口裏接參是用數組接參的,這個就類似於可變參數一樣,是一種嚴重抽象和嚴重不規範的行爲。
那麼對於formart業務來說,實際上就需要兩個參數:初始值和pattrn。
而formart就是兩個參數,Object和pattrn。
所以作者應該是因此再來個formart接口來實現這種function的行爲。
而且在模板裏調用時也與function不同,如下:
${date,dateFormat="yyyy-MM-dd"}.
意思是:使用dateformat格式化函數,傳入參數:(date,“yyyy-MM-dd”)
根據beetl-default.properties的記錄,FT.dateformat = org.beetl.ext.format.DateFormat
所以,它執行的就是DateFormat.format(date,“yyyy-MM-dd”)
它的寫法和function也不一樣了。需要中間來個逗號,後面緊跟着format函數名以及另外一個參數。
FTC:默認格式化函數
${date,dateFormat="yyyy-MM-dd"}這種寫法也實在是太繁瑣了,那麼作者可能根據各個方面的原因綜合考慮吧,弄了一個默認格式化函數。
比如上面這個可以寫成:${date,"yyyy-MM-dd"}
它是什麼原理呢?
首先${}裏是帶逗號的,那麼這就是一個格式化函數,
然後發現逗號後面省略了格式化函數名。那麼就需要根據類型去推斷是哪個格式化函數了。
檢查date是個Java.util.date的類型的。
那麼去beetl-default.properties配置裏發現FNP下面Java.util.date對應的是org.beetl.ext.format.DateFormat,
於是便使用DateFormat來對其進行格式化。
所以如果要增加一些默認格式化函數,也可以這樣增加。