##方法
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
在模板里面可以直接调用:如上所示的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里填写并注册进去。
很多时候,我们针对某种特殊处理并不只需要一个方法,如我们常用的StringUtils这个类,里面大约有好几个方法需要使用。难道我为了在beetl里使用这些功能,我要新建好几个function吗?并不是,你可以将一个类注册为FNP,那么就可以在beetl里使用了。
仔细看看beetl-default.properties他配置的FNP大概就知道怎么用的了。和FN差不多。
这个仔细查看,会发现,它和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函数名以及另外一个参数。
${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来对其进行格式化。
所以如果要增加一些默认格式化函数,也可以这样增加。