1. 介绍
IKExpressoin 是基于java 语言开发的轻量级的公式语言解析执行工具包,它不依赖第三方java库,可作为.jar文件集成于系统中IKExpressoin 分为两部分,一是项目src下java源代码,二是项目下的IKExpressoin.cfg.xml( 函数定义配置文件)文件。
2. 安装部署
将IKExpressoin.jar 文件放到新部署项目的lib目录中
将IKExpressoin.cfg.xml 文件放置代码根目录(如:web项目,WEB-INF/classes目录)
3. 主要调用类
org.wltea.expression.ExpressionEvaluator这个类是IKExpressoin 的主要调用类,打多数执行方法都在这里,此类下的方法都是静态的
org.wltea.expreesion.datameta.Variable 此类主要用于存放表达式上下文变量集合
org.wltea.expression.PreparedExpression需要表达式预编译时所要用到的类
4. ExpressionEvaluator类具体使用
1.先创建上下文变量集合
ArrayList<Variable> variables = new ArrayList<Variable>();
variables.add(Variable.createVariable("vInt", new Integer(3)));
variables.add(Variable.createVariable("vString", "testChar"));
variables.add(Variable.createVariable("vDate",date));
variables.add(Variable.createVariable("vDouble",newuble(223.0)));
variables.add(Variable.createVariable("vBoolean", new Boolean(true)));
第一参数的 vInt,vString 等只是我们对后面参数起的别名
第二参数是我们要校验的数据,也可以是页面传过来的数据
2. 直接执行方法获取校验结果
Object result = ExpressionEvaluator.evaluate("$contains(vString,\"testString\")", variables);
方法evaluate(参数1,参数2)分解如下
参数1 :自己定义的表达式公式
参数2 : 在第一步所创建的上下文集合
函数 $contains (参数1,参数2)分解如下
$是调用函数的规则在写的过程中必须带有
Contains函数名称,可以通过函数配置文件找到(用户自定义时可是是中文名称)
<function-configuration>
<bean class="org.wltea.expression.function.SystemFunctions">
<function name="contains" method="contains">
<parameter-type>java.lang.String</parameter-type>
<parameter-type>java.lang.String</parameter-type>
</function>
</bean>
</function-configuration>
public class SystemFunctions {
public boolean contains(String str1, String str2) {
if (str1 == null || str2 == null) {
throw new NullPointerException("函数\"CONTAINS\"参数为空");
}
return str1.indexOf(str2) >= 0;
}
}
Bean节点里面的class 属性指定的是当前函数属于那个类
Function 节点 name 属性是我们执行调用的名称$contains名称必须和属性名称一样
Funciont 节点 method 属性里的名称必须和类里面方法名称一样
parameter-type 里面的text值是我们调用当前函数所必须提供的参数类型(在此要注意顺序)
参数1 :vString就是上下文集合我们定义的需要校验的数据别名
参数2: 用户要校验的匹配内容是什么
执行后可通过result 来进行下一步操作
5. PreparedExpression类的使用
1. 定义表达式公式
String expression = "$contains(vString1,vString2)";
2.创建上下文变量集合
ArrayList<Variable> variables = new ArrayList<Variable>();
variables.add(Variable.createVariable("vString1", "testChar"));
variables.add(Variable.createVariable("vString2", "testChar"));
3.直接执行方法返回结果
PreparedExpression pe=ExpressionEvaluator.preparedCompile(expression,variables);
Object result = pe.execute();
在校验出结果后可继续操作主要调用setArgument()方法
pe.setArgument("vString1", "testString");
pe.setArgument("vString2", "testString");
result = pe.execute();
得到result 结果后来进行下一步操作
6. 开发人员扩展函数
扩展前有以下几步要自己去编写(这里创建一个中文函数)
1. 创建一个类里面有我们要最加的函数,比如:
public class TestFunctions {
public String sayHello(String str) {
//函数主体
return str;
}
}
2. 在IKExpressoin.cfg.xml来注册函数和类,将bean 节点添加到 function_configuration 下
<bean class="类路径.TestFunctions">
<function name="你好" method="sayHello">
<parameter-type>java.lang.String</parameter-type>
</function>
</bean>
3. 调用自己定义的函数测试是否成功
ArrayList<Variable> variables = new ArrayList<Variable>();
variables.add(Variable.createVariable("vString", "测试用户"));
Object result = ExpressionEvaluator.evaluate("$你好(vString)",variables);
7. 校验框架内置函数
1. $contains(java.lang.String, java.lang.String) 字符串包含比较返回boolean
2. $startWith(java.lang.Stirng, java.lang.String) 字符串前缀比较返回boolean
3. $endWith(java.lang.String, java.lang.String) 字符串后缀比较返回boolean
4. $calcDate(java.Util.Date(原始日期),int(年),int(月),int(日),int(小时),int(分),int(秒)) 日期计算返回 Date
5. $sysdate() 获取系统时间返回 Date
6. $dayEquals(java.Util.Date,java.Util.Date) 日期比较,精确到天返回boolean
7. $dateBig(java.Util.Date,java.Util.Date)日期比大,返回boolean
8. 项目扩展函数(以下函数按照项目需求会返回两种参数,一种为boolean,一种为对象org.wltea.expression.function.CheckResultBean(包含两个属性一个为错误code,一个为错误信息))函数名称比如$checkTypeRM后面带有RM(ReturnMessage)缩写词的都返回CheckResultBean对象,没有的均返回boolean 值。
1. 数据类型校验
$checkType(java.lang.String,java.lang.String),$checkTypeRM(java.lang.String,java,lang,String) 参数1为上下文集合变量,参数2为类型常量包含(varchar字符,email邮件,mobile手机,phone电话,postcode邮编,chineseName中文,money金额,number数字).
2. 空值校验
$checkNE(java.lang.String), $checkNERM(java.lang.String)
3. 最大值校验
$maxValue(java.lang.String,java.lang.String),$maxValueRM(java.lang,String,java.lang.String)
4. 最小值校验
$minValue(java.lang.String,java.lang.String),$minValueRM(java.lang,String,java.lang.String)
5. 最大长度校验
$maxLen(java.lang.String,int) ,$maxLenRM(java.lang,String,int)
6. 最小长度校验
$minValue(java.lang.String,int),$minValueRM(java.lang,String,int)
7. 枚举数据类型校验(手机)
$checkEnum(java.lang.String,java.lang.String),$checkEnumRM(java.lang,String,java.lang.String)
8. CheckResultBean返回信息描述
Code |
Message |
Code |
Message |
000000 |
执行成功 |
010110 |
数据不在取值范围内 |
010101 |
不是有效的字符串 |
010201 |
不是有效的整数 |
010102 |
不是有效的邮箱 |
010202 |
不是有效的金额 |
010103 |
不是有效的手机号 |
010203 |
超过最大值限制 |
010104 |
不是有效的电话号码 |
010204 |
超过最小值限制 |
010105 |
不是有效的数字 |
010205 |
字符串长度超过最大长度限制 |
010106 |
包含非中文字符 |
010206 |
字符串长度低于最小长度限制 |
010107 |
不是有效的邮政编码 |
|
|
010108 |
不是有效的身份证 |
|
|
010109 |
数据为空 |
|
|
9. 多个函数校验使用(只能使用返回boolean类型的函数)
ExpressionEvaluator.evaluate("$checkNE(vString1)&&$checkType(vString1,varchar)||$contains(vString1,vString2))", variables);
10.语法约束
1. 变量名遵循java变量命名规范。
2. 函数声明以”$”符号打头,自定义函数命名遵循java命名规范。
3. 日期常量使用”[]”,格式应为[yyyy-MM-dd 24h-mm-ss],不支持毫秒
4. 用户自定义函数名不能重复
5. 用户自定义函数的参数和返回值类型限定于:
Int,Long,Float,Double,Boolean,String,Date,List,Object.