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

java代码:
查看复制到剪贴板打印
ExpressionParser parser = new SpelExpressionParser(); 
EvaluationContext context = new StandardEvaluationContext(); 
context.setVariable("variable", "hello1"); 
context.setVariable("variable", "hello2"); 
String result1 = parser.parseExpression("#variable").getValue(context, String.class); 
System.out.println("r1=="+result1); 
  
context = new StandardEvaluationContext(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使用StandardEvaluationContext的registerFunction方法进行注册自定义函数,其实完全可以使用setVariable代替,两者其本质是一样的。示例如下:

java代码:
查看复制到剪贴板打印
ExpressionParser parser = new SpelExpressionParser(); 
StandardEvaluationContext context = new StandardEvaluationContext(); 
Method parseInt = 
       Integer.class.getDeclaredMethod("parseInt", String.class); 
context.registerFunction("regParseInt", parseInt); 
context.setVariable("parseInt2", parseInt); 
String expression1 = "#regParseInt('3') == #parseInt2('3')"; 
boolean result = 
    parser.parseExpression(expression1).getValue(context, boolean.class); 
System.out.println("result="+result); 
可以看出“registerFunction”和“setVariable”都可以注册自定义函数,但是两个方法的含义不一样,推荐使用“registerFunction”方法注册自定义函数。
赋值表达式
SpEL即允许给自定义变量赋值,也允许给跟对象赋值,直接使用“#variableName=value”即可赋值。示例如下:

java代码:
查看复制到剪贴板打印
1:parser.parseExpression("#root=‘Hi'").getValue(context, String.class); 
2:parser.parseExpression("#this=‘Hi'").getValue(context, String.class); 
3:context.setVariable("#variable", "variable"); 
  
对象属性存取及安全导航表达式
对象属性获取非常简单,使用如“a.property.property”这种点缀式获取,SpEL对于属性名首字母是不区分大小写的;
SpEL还引入了Groovy语言中的安全导航运算符“(对象|属性)?.属性”,用来避免当“?.”前边的表达式为null时抛出空指针异常,而是返回null;
修改属性值可以通过赋值表达式或Expression接口的setValue方法修改。
示例如下:

java代码:
查看复制到剪贴板打印
UserModel um = new UserModel(); 
um.setUuid("User1"); 
um.setName("UserName1"); 
ExpressionParser parser = new SpelExpressionParser(); 
StandardEvaluationContext context = new StandardEvaluationContext(); 
context.setVariable("um",um); 
//取值 
Expression expression = parser.parseExpression("'uuid='+#um.uuid + ',name='+#um.name"); 
String v =  expression.getValue(context,String.class); 
System.out.println("v=="+v); 
//赋值 
expression = parser.parseExpression("'uuid='+(#um.uuid='newUser') + ',name='+#um.name"); 
v =  expression.getValue(context,String.class); 
System.out.println("v2=="+v); 
输出结果: 
v==uuid=User1,name=UserName1 
v2==uuid=newUser,name=UserName1 
对象方法调用
对象方法调用更简单,跟Java语法一样;如“‘Hello’.substring(1,3)”将返回“el”;而对于根对象可以直接调用方法。
Bean引用
SpEL支持使用“@”符号来引用Bean,在引用Bean时需要使用BeanResolver接口实现来查找Bean,Spring提供BeanFactoryResolver实现,示例如下: