跟我学Spring3(5.3):Spring 表达式语言之 SpEL 语法

时间:2017-10-06 10:43

原文出处: 张开涛

5.3 SpEL语法

5.3.1 基本表达式

一、字面量表达式: SpEL支持的字面量包括:字符串、数字类型(int、long、float、double)、布尔类型、null类型。
类型
示例
字符串

String str1 = parser.parseExpression(“‘Hello World!’”).getValue(String.class);
String str2 = parser.parseExpression(“\”Hello World!\”").getValue(String.class);

数字类型

int int1 = parser.parseExpression(“1″).getValue(Integer.class);
long long1 = parser.parseExpression(“-1L”).getValue(long.class);
float float1 = parser.parseExpression(“1.1″).getValue(Float.class);
double double1 = parser.parseExpression(“1.1E+2″).getValue(double.class);
int hex1 = parser.parseExpression(“0xa”).getValue(Integer.class);
long hex2 = parser.parseExpression(“0xaL”).getValue(long.class);

布尔类型

boolean true1 = parser.parseExpression(“true”).getValue(boolean.class);
boolean false1 = parser.parseExpression(“false”).getValue(boolean.class);

null类型

Object null1 = parser.parseExpression(“null”).getValue(Object.class);

二、算数运算表达式: SpEL支持加(+)、减(-)、乘(*)、除(/)、求余(%)、幂(^)运算。
类型
示例
加减乘除

int result1 = parser.parseExpression(“1+2-3*4/2″).getValue(Integer.class);//-3
求余

int result2 = parser.parseExpression(“4%3″).getValue(Integer.class);//1

幂运算

int result3 = parser.parseExpression(“2^3″).getValue(Integer.class);//8

SpEL还提供求余(MOD)和除(DIV)而外两个运算符,与“%”和“/”等价,不区分大小写。

三、关系表达式:

等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=),区间(between)运算,如“parser.parseExpression(“1>2″).getValue(boolean.class);”将返回false;而“parser.parseExpression(“1 between {1, 2}”).getValue(boolean.class);”将返回true。

between运算符右边操作数必须是列表类型,且只能包含2个元素。第一个元素为开始,第二个元素为结束,区间运算是包含边界值的,即 xxx>=list.get(0) && xxx<=list.get(1)。

SpEL同样提供了等价的“EQ” 、“NE”、 “GT”、“GE”、 “LT” 、“LE”来表示等于、不等于、大于、大于等于、小于、小于等于,不区分大小写。

四、逻辑表达式:且(and)、或(or)、非(!或NOT)。

java代码:

String expression1 = "2>1 and (!true or !false)"; boolean result1 = parser.parseExpression(expression1).getValue(boolean.class); Assert.assertEquals(true, result1); String expression2 = "2>1 and (NOT true or NOT false)"; boolean result2 = parser.parseExpression(expression2).getValue(boolean.class); Assert.assertEquals(true, result2);

注:逻辑运算符不支持 Java中的 && 和 || 。

五、字符串连接及截取表达式:

使用“+”进行字符串连接,使用“’String’[0] [index]”来截取一个字符,目前只支持截取一个,如“’Hello ‘ + ‘World!’”得到“Hello World!”;而“’Hello World!’[0]”将返回“H”。

六、三目运算及Elivis运算表达式:

三目运算符 “表达式1?表达式2:表达式3”用于构造三目运算表达式,如“2>1?true:false”将返回true;
Elivis运算符“表达式1?:表达式2”从Groovy语言引入用于简化三目运算符的,当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2,简化了三目运算符方式“表达式1? 表达式1:表达式2”,如“null?:false”将返回false,而“true?:false”将返回true;

七、正则表达式:

使用“str matches regex,如“’123′ matches ‘\\d{3}’”将返回true;

八、括号优先级表达式:

使用“(表达式)”构造,括号里的具有高优先级。

5.3.3 类相关表达式

一、类类型表达式:

使用“T(Type)”来表示java.lang.Class实例,“Type”必须是类全限定名,“java.lang”包除外,即该包下的类可以不指定包名;使用类类型表达式还可以进行访问类静态方法及类静态字段。
具体使用方法如下:

java代码:

@Test public void testClassTypeExpression() { ExpressionParser parser = new SpelExpressionParser(); //java.lang包类访问 Class<String> result1 = parser.parseExpression("T(String)").getValue(Class.class); Assert.assertEquals(String.class, result1); //其他包类访问 String expression2 = "T(cn.javass.spring.chapter5.SpELTest)"; Class<String> result2 = parser.parseExpression(expression2).getValue(Class.class); Assert.assertEquals(SpELTest.class, result2); //类静态字段访问 int result3=parser.parseExpression("T(Integer).MAX_VALUE").getValue(int.class); Assert.assertEquals(Integer.MAX_VALUE, result3); //类静态方法调用 int result4 = parser.parseExpression("T(Integer).parseInt('1')").getValue(int.class); Assert.assertEquals(1, result4); }