理解:
EvaluationContext可以理解为parser 在这个环境里执行parseExpression解析操作,比如说我们现在往ctx(一个EvaluationContext )中放入一个 对象list (注:假设list里面已经有数据,即list[0]=true).
ctx.setVariable("list" , list);//可以理解为往ctx域 里放了一个list变量
接下来要想获取或设置list的值都要在ctx范围内才能找到:
(!!!!! #号用来取通过setVariable()放进去的变量)
parser.parseExpression("#list[0]").getValue(ctx);//在ctx这个环境里解析出list[0]的值
parser.parseExpression("#list[0]").setValue(ctx , "false");//在ctx这个环境中奖 list[0]设为false
假如我们又往ctx中放入一个person对象(假设person已经实例化并且person.name的值是fc)
ctx.setVariable("p", person);
那么取其中name属性要像下面这样:
parser.parseExpression("#p.name").getValue(ctx);//结果是 fc
但是若是我们将ctx的root设为person 取name的时候就可以省略root对象这个前缀了
//StandardEvaluationContext是EvaluationContext的子类 提供了setRootObject方法
((StandardEvaluationContext)ctx2).setRootObject(person);
parser.parseExpression("name").getValue(ctx2); //访问rootobject即person的属性那么 结果:fc
当然其实也可以完全不用ctx直接用下面的方式活得name:
parser.parseExpression("name").getValue(person);//在person上解析name属性 即可得到 fc
下面贴出我实验时的代码:
//创建一个ExpressionParser对象,用于解析表达式
ExpressionParser parser = new SpelExpressionParser();
//最简单的字符串表达式
Expression exp = parser.parseExpression("'HelloWorld'");
System.out.println("'HelloWorld'的结果: " + exp.getValue());
//调用方法的表达式
exp = parser.parseExpression("'HelloWorld'.concat('!')");
System.out.println("'HelloWorld'.concat('!')的结果: "
+ exp.getValue());
//调用对象的getter方法
exp = parser.parseExpression("'HelloWorld'.bytes");
System.out.println("'HelloWorld'.bytes的结果: "
+ exp.getValue());
//访问对象的属性(d相当于HelloWorld.getBytes().length)
exp = parser.parseExpression("'HelloWorld'.bytes.length");
System.out.println("'HelloWorld'.bytes.length的结果:"
+ exp.getValue());
//使用构造器来创建对象
exp = parser.parseExpression("new String('helloworld')"
+ ".toUpperCase()");
System.out.println("new String('helloworld')"
+ ".toUpperCase()的结果是: "
+ exp.getValue(String.class));
Person person = new Person(6 , "孙悟空12", new Date());
exp = parser.parseExpression("name");
//以指定对象作为root来计算表达式的值
//相当于调用person.name表达式的值
exp.setValue(person, "fc"); //将person 对象的 name属性设为 fc,没有这一句下面就会输出 孙悟空12
System.out.println("以persn为root,name表达式的值是: "
+ exp.getValue(person , String.class));
exp = parser.parseExpression("name=='fc'");
StandardEvaluationContext ctx = new StandardEvaluationContext();
ctx.setRootObject(person);
//以指定Context来计算表达式的值
System.out.println(exp.getValue(ctx , Boolean.class));//true 此时都是 fc
List<Boolean> list = new ArrayList<Boolean>();
list.add(true);
EvaluationContext ctx2 = new StandardEvaluationContext();
//将list设置成EvaluationContext的一个变量
ctx2.setVariable("list" , list);
ctx2.setVariable("p", person);
((StandardEvaluationContext) ctx2).setRootObject(person);
//修饰list变量的第一个元素的值
System.out.println(parser.parseExpression("#list[0]").getValue(ctx2));//true
parser.parseExpression("#list[0]").setValue(ctx2 , "false"); //修改 现在变为false 下面输出也是false
//list集合的第一个元素被改变
System.out.println("list集合的第一个元素为: "
+ list.get(0));
System.out.println(parser.parseExpression("#p.name").getValue(ctx2));//fc
System.out.println(parser.parseExpression("name").getValue(ctx2));//fc