Spring SpEL 中的EvaluationContext 及Root

Spring SpEL 中的EvaluationContext 及Root_第1张图片

理解:
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 list = new ArrayList();
        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

你可能感兴趣的:(Spring,SSM,spring)