SpEL还提供求余(MOD)和除(DIV)运算符,与“%”和“/”等价,不区分大小写。
关系表达式
等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=),区间(between)运算,示例如下:
1:“parser.parseExpression(”1>2“).getValue(boolean.class);”将返回false;
2:“parser.parseExpression(”1 between {1, 2}“).getValue(boolean.class);”将返回true。
SpEL同样提供了等价的“EQ” 、“NE”、 “GT”、“GE”、 “LT” 、“LE”来表示等于、不等于、大于、大于等于、小于、小于等于,不区分大小写
逻辑表达式:且(and)、或(or)、非(!或NOT)。 示例如下:
1:String expression1 = "2>1 and (!true or !false)";
boolean result1 = parser.parseExpression(expression1).getValue(boolean.class);
注意:逻辑运算符不支持 Java中的 && 和 ||
字符串连接及截取表达式
使用“+”进行字符串连接,使用“‘String’ [index]”来获取一个字符,目前只支持获取一个字符,如“'Hello ' + 'World!'”得到“Hello World!”;而“'Hello World!'[0]”将返回“H”
三目运算及Elivis运算表达式
1:三目运算符 “表达式1 表达式2:表达式3”用于构造三目运算表达式,如“2>1 true:false”将返回true;
2:Elivis运算符“表达式1 :表达式2”从Groovy语言引入,用于简化三目运算符的,当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2,如“null :false”将返回false,而“true :false”将返回true;
正则表达式
使用“str matches regex,如“‘123’ matches ‘\\d{3}’”将返回true;
括号优先级表达式
使用“(表达式)”构造,括号里的具有高优先级。
类类型表达式
使用“T(Type)”来表示java.lang.Class实例,“Type”必须是类全限定名,“java.lang”包除外,即该包下的类可以不指定包名;使用类类型表达式还可以进行访问类静态方法及类静态字段。 示例如下:
1:访问java.lang包的类
Class
2:访问其他包下的类 :
String expression2 = "T(cn.javass.spring.chapter5.SpELTest)";
Class
3:访问类的静态字段
int result3=parser.parseExpression("T(Integer).MAX_VALUE").getValue(int.class);
4:访问类的静态方法
int result4 = parser.parseExpression("T(Integer).parseInt('1')").getValue(int.class);
类实例化
类实例化同样使用java关键字“new”,类名必须是全限定名,但java.lang包内的类型除外,如String、Integer。示例如下:
1:String result1 = parser.parseExpression("new String('hello')").getValue(String.class);
instanceof表达式
SpEL支持instanceof运算符,跟Java内使用同义;如“hello‘ instanceof T(String)”将返回true。
变量定义及引用
1:变量通过eva luationContext接口的setVariable(variableName, value)方法定义
2:在表达式中使用“#variableName”引用;
3:除了引用自定义变量,SpE还允许引用根对象及当前上下文对象,使用“#root”引用根对象,使用“#this”引用当前上下文对象;
示例如下:
java代码:
查看复制到剪贴板打印
ExpressionParser parser = new SpelExpressionParser();
eva luationContext context = new Standardeva luationContext();
context.setVariable("variable", "hello1");
context.setVariable("variable", "hello2");
String result1 = parser.parseExpression("#variable").getValue(context, String.class);
System.out.println("r1=="+result1);
context = new Standardeva luationContext(12);
String result2 = parser.parseExpression("#root-1").getValue(context, String.class);
System.out.println("r2=="+result2);
String result3 = parser.parseExpression("#this").getValue(context, String.class);
System.out.println("r3=="+result3);
输出结果:
r1==hello2
r2==11
r3==12
自定义函数
目前只支持类静态方法注册为自定义函数;SpEL使用Standardeva luationContext的registerFunction方法进行注册自定义函数,其实完全可以使用setVariable代替,两者其本质是一样的。示例如下:
java代码:
查看复制到剪贴板打印
ExpressionParser parser = new SpelExpressionParser();
Standardeva luationContext context = new Standardeva luationContext();
Method parseInt =
Integer.class.getDeclaredMethod("parseInt", String.class);
context.registerFunction("regParseInt", parseInt);
context.setVariable("pars