虽然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)};<br> * 如果前缀为空或者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:<br> pow(1,2):${ pow(1,2)}<br> pow(2,10):${ pow(2,10)}<br> pow("2",10):${ pow("2",10)}<br> pow("1.1","10","3"):${pow("1.1","10","3")}<br> <z:var name="base" value="15.2" /> <z:var name="exponent" value="3" /> <z:var name="precision" value="4" /> base:${base}<br> exponent:${exponent}<br> precision:${precision}<br> pow(base,exponent,precision):${pow(base,exponent,precision)}<br>
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
匿名评论 所有评论仅代表网友意见
王工
陈工
扫一扫关注
所有评论仅代表网友意见