Beetl配置文件的其他元素

##方法

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來對其進行格式化。

所以如果要增加一些默認格式化函數,也可以這樣增加。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章