SpEL快速入门
Spring表达式语言(简称SpEL)是一种鱼JSP2 EL功能类似的变道时语言,它可以在运行时查询和操作对象图。与JSP 2的EL相比,SpEL功能更加强大,它甚至支持方法的调用和基本字符串模板。
SpEL可以独立Spring容器使用——只是当初简单的表达式语言来使用;也可以在Annotation或XML配置中使用SpEL,这样可以充分利用SpEL简化Spring Bean的配置。
Spring的SpEL可以单独使用,可以使用SpEL对表达式计算,求值。SpEL主要提供如下两个重要的接口。
》ExpressionParser:该接口的实例负责解析一个SpEL表达式,返回一个Expression对象。
》Expression: 该接口的实例代表一个表达式。
Expression实例代表一个表达式,它包含了如下方法可用于计算,得到表达式的值。
》Object getValue():计算表达式的值。
》<T>T getValue(Class<T> desiredResultType):计算表达式的值,而且尝试将该表达式的值当成desiredResultType类型处理。
》Object getValue(EvaluationContext context):使用指定的EvaluationContext来计算表达式的值
》<T> T getValue(EvaluationContext context, Class<T> desiredResultType):使用指定EvaluationContext来计算表达式的值。而且尝试将该表达式的值当成desiredResultType类型处理
》Object getValue(Object rootObject):以rootObject作为表达式的root对象来计算表达式的值。
》<T> getValue(Object rootObject, Class<T> desiredResultType):以rootObject作为表达式的root对象来计算表达式的值。而且尝试将该表达式的值当成desiredResultType类型处理。
下面的程序示范了如何利用ExpressionParser和Expression来计算表达式的值
1 import org.springframework.expression.*; 2 import org.springframework.expression.spel.standard.*; 3 import org.springframework.expression.spel.support.*; 4 5 import java.util.*; 6 7 public class SpELTest 8 { 9 public static void main(String[] args) 10 { 11 //创建一个ExpressionParser对象,用于解析表达式 12 ExpressionParser parser = new SpelExpressionParser(); 13 //最简单的字符串表达式 14 Expression exp = parser.parseExpression("'HelloWorld'"); 15 System.out.println("'HelloWorld'的结果: " + exp.getValue()); 16 //调用方法的表达式 17 exp = parser.parseExpression("'HelloWorld'.concat('!')"); 18 System.out.println("'HelloWorld'.concat('!')的结果: " 19 + exp.getValue()); 20 //调用对象的getter方法 21 exp = parser.parseExpression("'HelloWorld'.bytes"); 22 System.out.println("'HelloWorld'.bytes的结果: " 23 + exp.getValue()); 24 //访问对象的属性(d相当于HelloWorld.getBytes().length) 25 exp = parser.parseExpression("'HelloWorld'.bytes.length"); 26 System.out.println("'HelloWorld'.bytes.length的结果:" 27 + exp.getValue()); 28 //使用构造器来创建对象 29 exp = parser.parseExpression("new String('helloworld')" 30 + ".toUpperCase()"); 31 System.out.println("new String('helloworld')" 32 + ".toUpperCase()的结果是: " 33 + exp.getValue(String.class)); 34 35 Person person = new Person(1 , "孙悟空", new Date()); 36 exp = parser.parseExpression("name"); 37 //以指定对象作为root来计算表达式的值 38 //相当于调用person.name表达式的值 39 System.out.println("以persn为root,name表达式的值是: " 40 + exp.getValue(person , String.class)); 41 exp = parser.parseExpression("name=='孙悟空'"); 42 StandardEvaluationContext ctx = new StandardEvaluationContext(); 43 ctx.setRootObject(person); 44 //以指定Context来计算表达式的值 45 System.out.println(exp.getValue(ctx , Boolean.class)); 46 47 List<Boolean> list = new ArrayList<Boolean>(); 48 list.add(true); 49 EvaluationContext ctx2 = new StandardEvaluationContext(); 50 //将list设置成EvaluationContext的一个变量 51 ctx2.setVariable("list" , list); 52 //修饰list变量的第一个元素的值 53 parser.parseExpression("#list[0]").setValue(ctx2 , "false"); 54 //list集合的第一个元素被改变 55 System.out.println("list集合的第一个元素为: " 56 + list.get(0)); 57 } 58 }
上面的程序使用了ExpressionParser多次解析了不同类型的表达式,ExpressionParser调用parserExpression()方法将会返回一个Expression实例(表达式对象)。程序调用Expression对象的getValue()方法即可获取该表达式的值。
上面的程序还涉及一个EvaluationContext对象,它是SpEL计算表达式值的“上下文”对象,这个Context对象可以包含多个对象,但只能有一个root(跟)对象
EvaluationContext有点类似于OGNL的Stack Context,EvaluationContext可以包含多个对象,但只能有一个root对象。
为了往EvaluationContext里放入对象(SpEL称之为变量),可以调用该对象的如下方法。
》setVariable(String name, Object value):向EvaluationContext中放入Value对象,该对象名为name
为了在SpEL访问EvaluationContext中指定对象,应采用OGNL类似的格式
1 #name
StandardEvaluationContext提供了如下方法来设置root对象。
》setRootObject(Object rootObject)
在SpEL中访问root对象属性时,可以省略root对象前缀,例如如下代码:
1 foo.bar //访问rootObject的foo属性的bar属性
当然是用Expression对象计算表达式时,也可以直接指定root对象,例如上面的程序中的代码:
1 exp.getValue(person, String.class) //以person对象为root对象来计算表达式的值
posted on 2013-09-13 17:09 Arts&Crafts 阅读(1757) 评论(0) 编辑 收藏 举报