Spring3开发实战 之 第八章:Spring3的表达式语言
是什么
Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并能与Spring功能完美整合。
表达式语言给静态Java语言增加了动态功能。
SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可单独使用。
能干什么
表达式语言一般是用较为简单的形式完成主要的工作,减少开发的工作量。
SpEL支持如下表达式:
一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;
二、类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;
三、集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持易做图内联数组初始化;不支持内联字典定义;
四、其他表达式:模板表达式。
在Java中使用SpringEL是非常简单的,示例如下:
java代码:
查看复制到剪贴板打印
public class HelloWorld {
public static void main(String[] args) {
//构造上下文:准备比如变量定义等等表达式运行需要的上下文数据
EvaluationContext context = new StandardEvaluationContext();
//创建解析器:提供SpelExpressionParser默认实现
ExpressionParser parser = new SpelExpressionParser();
//解析表达式:使用ExpressionParser来解析表达式为相应的Expression对象
Expression expression =
parser.parseExpression("('Hello' + ' World').concat(#end)");
//设置上下文中的变量的值
context.setVariable("end", "!SpringEL");
//执行表达式,获取运行结果
String str = (String)expression.getValue(context);
System.out.println("the str="+str);
}
}
ExpressionParser接口
表示解析器,默认实现是org.springframework.expression.spel.standard包中的SpelExpressionParser类,使用parseExpression方法将字符串表达式转换为Expression对象。
配合 ExpressionParser 接口使用的ParserContext接口用于定义字符串表达式是不是模板,及模板开始与结束字符,示例如下:
java代码:
查看复制到剪贴板打印
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
//自定义一个解析模板的规则
ParserContext parserContext = new ParserContext() {
public boolean isTemplate() { return true; }
public String getExpressionPrefix() { return "#{"; }
public String getExpressionSuffix() { return "}"; }
};
String template = "#{'Hello '}#{'World!'}";
Expression expression = parser.parseExpression(template, parserContext);
System.out.println( expression.getValue());
}
说明
1:在此演示的是使用ParserContext的情况,此处定义了ParserContext实现:定义表达式是模块,表达式前缀为“#{”,后缀为“}”;
2:使用parseExpression解析时传入的模板必须以“#{”开头,以“}”结尾,如“#{‘Hello ’}#{‘World!’}”。
3:请注意默认传入的字符串表达式不是模板形式,如之前演示的Hello World。
Expression接口
表示表达式对象,默认实现是org.springframework.expression.spel.standard包中的SpelExpression,提供getValue方法用于获取表达式值,提供setValue方法用于设置对象值
EvaluationContext接口
表示上下文环境,默认实现是org.springframework.expression.spel.support包中的StandardEvaluationContext类,使用setRootObject方法来设置根对象,使用setVariable方法来注册自定义变量,使用registerFunction来注册自定义函数等等。
字面量表达式:
SpEL支持的字面量包括:字符串、数字类型(int、long、float、double)、布尔类型、null类型 ,示例如下:
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 =
补充:软件开发 , Java ,