Spring EL表达式详细讲解及使用实例
Spring EL表达式详细讲解及使用实例
转自:
http://www.manongjc.com/article/8467.html
简介
用法
1、文本表达式
Double.parseDouble()进行表达式类型转换。parser.parseExpression("'hello'").getValue(String.class); // hello , 注意单引号parser.parseExpression("1.024E+3").getValue(Long.class); // 1024 , 指数形式parser.parseExpression("0xFFFF").getValue(Integer.class); // 65535 , 十六进制parser.parseExpression("true").getValue(Boolean.class); // trueparser.parseExpression("null").getValue();
2、变量
// 定义变量String name = "Tom";EvaluationContext context = new StandardEvaluationContext(); // 表达式的上下文,context.setVariable("myName", name); // 为了让表达式可以访问该对象, 先把对象放到上下文中ExpressionParser parser = new SpelExpressionParser();// 访问变量parser.parseExpression("#myName").getValue(context, String.class); // Tom , 使用变量// 直接使用构造方法创建对象parser.parseExpression("new String('aaa')").getValue(String.class); // aaa
3、属性和方法调用
•属性可直接使用属性名,属性名首字母大小写均可(只有首字母可不区分大小写);•数组、列表可直接通过下表形式( list[index] )访问;•map 可以直接把 key 当成索引来访问( map[key] );•方法可以直接访问;
// 准备工作Person person = new Person("Tom", 18); // 一个普通的POJOList<String> list = Lists.newArrayList("a", "b");Map<String, String> map = Maps.newHashMap();map.put("A", "1");map.put("B", "2");EvaluationContext context = new StandardEvaluationContext(); // 表达式的上下文,context.setVariable("person", person); // 为了让表达式可以访问该对象, 先把对象放到上下文中context.setVariable("map", map);context.setVariable("list", list);ExpressionParser parser = new SpelExpressionParser();// 属性parser.parseExpression("#person.name").getValue(context, String.class); // Tom , 属性访问parser.parseExpression("#person.Name").getValue(context, String.class); // Tom , 属性访问, 但是首字母大写了// 列表parser.parseExpression("#list[0]").getValue(context, String.class) // a , 下标// mapparser.parseExpression("#map[A]").getValue(context, String.class); // 1 , key// 方法parser.parseExpression("#person.getAge()").getValue(context, Integer.class); // 18 , 方法访问
4、类型
T 操作符可以获取类型, 可以调用对象的静态方法.// 获取类型parser.parseExpression("T(java.util.Date)").getValue(Class.class); // class java.util.Date// 访问静态成员(方法或属性)parser.parseExpression("T(Math).abs(-1)").getValue(Integer.class); // 1// 判断类型parser.parseExpression("'asdf' instanceof T(String)").getValue(Boolean.class); // true;
5、操作符
•关系操作符, 包括: eq(==), ne(!=), lt()<, le(<=), gt(>), ge(>=)•逻辑运算符, 包括: and(&&), or(||), not(!)•数学操作符, 包括: 加(+), 减(-), 乘(*), 除(/), 取模(%), 幂指数(^)•其他操作符, 如: 三元操作符, instanceof, 赋值(=), 正则匹配
parseExpression("#name?:'defaultName'"), 如果变量name为空时设置默认值.parser.parseExpression("1 > -1").getValue(Boolean.class); // trueparser.parseExpression("1 gt -1").getValue(Boolean.class); // trueparser.parseExpression("true or true").getValue(Boolean.class); // trueparser.parseExpression("true || true").getValue(Boolean.class); // trueparser.parseExpression("2 ^ 3").getValue(Integer.class); // 8parser.parseExpression("true ? true : false").getValue(Boolean.class); // trueparser.parseExpression("#name ?: 'default'").getValue(context, String.class); // defaultparser.parseExpression("1 instanceof T(Integer)").getValue(Boolean.class); // trueparser.parseExpression("'5.00' matches '^-?\d+(\.\d{2})?$'").getValue(Boolean.class); // trueparser.parseExpression("#person.name").getValue(context, String.class); // Tom , 原来的值parser.parseExpression("#person.name = 'Jim'").getValue(context, String.class); // Jim , 赋值之后parser.parseExpression("#person.name").getValue(context, String.class); // Jim, 赋值起了作用
6、避免空指针
null, 就会出现空指针异常. 安全导航会判断对象是否为null, 如果是的话, 就返回null而不是抛出空指针异常. 使用方式就是在对象后面加个?. 如下:// 使用这种表达式可以避免抛出空指针异常parser.parseExpression("#name?.toUpperCase()").getValue(context, String.class); // null
7、#this变量
#this来表示当前的对象. 常用于集合的过滤// this 使用示例parser.parseExpression("{1, 3, 5, 7}.?[#this > 3]").getValue(); // [5, 7]
8、集合选择
•?[expression]: 选择符合条件的元素•^[expression]: 选择符合条件的第一个元素•$[expression]: 选择符合条件的最后一个元素•![expression]: 可对集合中的元素挨个进行处理
#this变量进行过滤, 对于map, 可分别对keySet及valueSet分别使用key和value关键字;// 集合parser.parseExpression("{1, 3, 5, 7}.?[#this > 3]").getValue(); // [5, 7] , 选择元素parser.parseExpression("{1, 3, 5, 7}.^[#this > 3]").getValue(); // 5 , 第一个parser.parseExpression("{1, 3, 5, 7}.$[#this > 3]").getValue(); // 7 , 最后一个parser.parseExpression("{1, 3, 5, 7}.![#this + 1]").getValue(); // [2, 4, 6, 8] ,每个元素都加1// mapMap<Integer, String> map = Maps.newHashMap();map.put(1, "A");map.put(2, "B");map.put(3, "C");map.put(4, "D");EvaluationContext context = new StandardEvaluationContext();context.setVariable("map", map);parser.parseExpression("#map.?[key > 3]").getValue(context); // {4=D}parser.parseExpression("#map.?[value == 'A']").getValue(context); // {1=A}parser.parseExpression("#map.?[key > 2 and key < 4]").getValue(context); // {3=C}
9、模板表达式
#{}作为一个定界符:parser.parseExpression("他的名字为#{#person.name}", new TemplateParserContext()).getValue(context); // 他的名字为Tom10、综合使用
//模板表达式,三元表达式结合使用parser.parseExpression("#{#person.name!=null?'他的名字叫'+#person.name+'先生':'不知道名字'}", new TemplateParserContext()).getValue(context);
欢迎关注我的公众号“须弥零一”,更多技术文章第一时间推送。
评论
