Spring3开发实战 之 第八章:Spring3的表达式语言(2)

时间:2017-06-15 16:40

java代码:
查看复制到剪贴板打印
1:String str1 = parser.parseExpression("'Hello World!'").getValue(String.class); 
2:String str2 = parser.parseExpression("\"Hello World!\"").getValue(String.class); 
3:int int1 = parser.parseExpression("1").getValue(Integer.class); 
4:float float1 = parser.parseExpression("1.1").getValue(Float.class); 
5:boolean true1 = parser.parseExpression("true").getValue(boolean.class); 
6:Object null1 = parser.parseExpression("null").getValue(Object.class); 
  
算数运算表达式 :
SpEL支持加(+)、减(-)、乘(*)、除(/)、求余(%)、幂(^)运算,示例如下:
1:int result1 = parser.parseExpression("1+2-3*4/2").getValue(Integer.class);
2:int result2 = parser.parseExpression(“4%3”).getValue(Integer.class) ;
3:int result3 = parser.parseExpression("2^3").getValue(Integer.class);
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<String> result1 = parser.parseExpression("T(String)").getValue(Class.class);
2:访问其他包下的类 :
String expression2 = "T(cn.javass.spring.chapter5.SpELTest)";
    Class<String> result2 = parser.parseExpression(expression2).getValue(Class.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);
2:Date result2 = parser.parseExpression("new java.util.Date()").getValue(Date.class);
 
instanceof表达式
SpEL支持instanceof运算符,跟Java内使用同义;如“hello‘ instanceof T(String)”将返回true。
 
变量定义及引用
1:变量通过EvaluationContext接口的setVariable(variableName, value)方法定义
2:在表达式中使用“#variableName”引用;
3:除了引用自定义变量,SpE还允许引用根对象及当前上下文对象,使用“#root”引用根对象,使用“#this”引用当前上下文对象;
示例如下: