虽然ZCF为ZHTML内置了常见的函数,但我们仍可以根据开发的需要自定义新的函数。下面以自定义一个幂运算的函数为例来演示自定义函数的流程。
1. 新建一个类实现IFunction接口,如下所示
package com.zving.example;
import com.zving.framework.expression.core.ExpressionException;
import com.zving.framework.expression.core.IFunction;
import com.zving.framework.expression.core.IVariableResolver;
import com.zving.framework.utility.NumberUtil;
public class Pow implements IFunction {
/**
* 函数的全局ID,一般可以是类名
*/
public String getID() {
return "com.zving.example.Pow";
}
public String getName() {
return "幂运算按指定精度输出";
}
/**
* 指定函数前缀。如果有前缀,则使用函数时类似于${prefix:func(a,b)};
* 如果前缀为空或者null,则使用函数时类似于${func(a,b)}。
*/
public String getFunctionPrefix() {
return null;
}
/**
* 指定函数名
*/
public String getFunctionName() {
return "pow";
}
/**
* 指定函数的参数,模板机制会将传入的参数转换成你指定的类型
*/
public Class>[] getArgumentTypes() {
return new Class>[] { Double.class, Double.class, Integer.class };
}
/**
* 返回执行结果。其中args为传入的参数数组
*/
public Object execute(IVariableResolver resolver, Object... args) throws ExpressionException {
Double base = (Double) args[0];// 底数
Double exponent = (Double) args[1];// 指数
Integer precision = 2;// 默认精度为2
if (args.length > 2) {// 如果有第三个参数,则重置精度
precision = (Integer) args[2];
}
double result = Math.pow(base, exponent);
return NumberUtil.round(result, precision);
}
}
2. 将这个类作为一个扩展项注册到com.zving.framework.ui.zhtml.ZhtmlFunctionService,如下图所示:
3. 新建一个ZHTML页面,如下所示:
FunctionTest:
pow(1,2):${ pow(1,2)}
pow(2,10):${ pow(2,10)}
pow("2",10):${ pow("2",10)}
pow("1.1","10","3"):${pow("1.1","10","3")}
base:${base}
exponent:${exponent}
precision:${precision}
pow(base,exponent,precision):${pow(base,exponent,precision)}
4. 访问这个页面,效果如下:
FunctionTest:
pow(1,2):1.0
pow(2,10):1024.0
pow("2",10):1024.0
pow("1.1","10","3"):2.594
base:15.2
exponent:3
precision:4
pow(base,exponent,precision):3511.808