23.2.16 new对象
SpEl支持我们直接在表达式中使用Java中new对象的语法来new一个对象,在new对象的时候需要我们指定对应类的包名,java.lang包除外。如下示例中我们就在表达式中new了一个java.util.Date对象,然后调用了其toLocaleString()方法。
@Test
public void test16() {
ExpressionParser parser = new SpelExpressionParser();
String currentTime = (String)parser.parseExpression("new java.util.Date().toLocaleString()").getValue();
System.out.println(currentTime);
}
23.2.17 赋值
SpEl也支持给表达式赋值,其是通过Expression的setValue()方法进行的,在赋值时需要指定rootObject或对应的EvaluationContext。示例如下。
@Test
public void test17_1() {
ExpressionParser parser = new SpelExpressionParser();
Date d = new java.util.Date();
//设日期为1号
parser.parseExpression("date").setValue(d, 1);
int date = (Integer)parser.parseExpression("date").getValue(d);
Assert.assertTrue(date == 1);
}
其也支持List、Map等的赋值。对于List和Array而言,在进行赋值时是通过元素的索引进行的,且对应的索引必须是存在的。如下示例中我们就将list的第一个元素由0设置为了1。
@Test
public void test17_2() {
ExpressionParser parser = new SpelExpressionParser();
List<Integer> list = new ArrayList<Integer>(1);
list.add(0);//添加一个元素0
EvaluationContext context = new StandardEvaluationContext();
//添加变量以方便表达式访问
context.setVariable("list", list);
//设置第一个元素的值为1
parser.parseExpression("#list[0]").setValue(context, 1);
int first = (Integer)parser.parseExpression("#list[0]").getValue(context);
Assert.assertTrue(first == 1);
}
而对于Map的赋值而言是通过key进行的,对应的key在Map中可以先不存在。如下示例就是对Map的赋值。
@Test
public void test17_3() {
ExpressionParser parser = new SpelExpressionParser();
Map<String, Integer> map = new HashMap<String, Integer>();
EvaluationContext context = new StandardEvaluationContext();
//添加变量以方便表达式访问
context.setVariable("map", map);
//设置第一个元素的值为1
parser.parseExpression("#map['key1']").setValue(context, 1);
int first = (Integer)parser.parseExpression("#map['key1']").getValue(context);
Assert.assertTrue(first == 1);
}
23.2.18 访问静态方法或属性
SpEl也支持访问类的静态方法或属性,其在进行访问的时候需要使用“T(type)”的形式来表示对应的静态类,其中type表示对应类的全限定名,即包括对应的包名。如下示例中就在表达式中访问了java.util.Calendar的静态属性DATE。
@Test
public void test18() {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("T(java.util.Calendar).DATE").getValue(int.class) == 5);
}
23.2.19 使用字符代替符号
SpEl也允许我们使用某些字符来代替对应的符号,如ge(>=)、gt(>)、lt(<)、le(<=)、eq(==)、ne(!=)、div(/)、mod(%)、not(!),而且它们都是大小写不敏感的。使用时中间要以空格分开,示例如下。
@Test
public void test19() {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("1 lt 2").getValue(boolean.class));//1<2
Assert.assertTrue(parser.parseExpression("1 le 2").getValue(boolean.class));//1<=2
Assert.assertTrue(parser.parseExpression("2 gt 1").getValue(boolean.class));//2>1
Assert.assertTrue(parser.parseExpression("2 ge 1").getValue(boolean.class));//2>=1
Assert.assertTrue(parser.parseExpression("1 ne 2").getValue(boolean.class));//1!=2
Assert.assertTrue(parser.parseExpression("not false").getValue(boolean.class));//!false
}
23.2.20 使用正则表达式
SpEl也支持使用正则表达式,其中对应的关键字为match。如下示例中即在表达式中使用了正则表达式,表示123是否匹配正则表达式“\d{3}”。
@Test
public void test20 () {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("123 matches '\\d{3}'").getValue(Boolean.class));//正则匹配三位数字
}
23.2.21 使用instanceof
SpEl也支持在表达式中使用instanceof关键字,以检测对象是否是特定类型的示例。
@Test
public void test21 () {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("'123' instanceof T(String)").getValue(Boolean.class));//检测字符串是否是String的实例。
}
23.2.22 三目运算(if..else..)
SpEl也支持在表达式中使用三目运算符,形式为“exp?trueVal:falseVal”,即如果exp的值为true则返回trueVal,否则返回falseVal。
@Test
public void test22 () {
ExpressionParser parser = new SpelExpressionParser();
Assert.assertTrue(parser.parseExpression("1>2 ? 1 : 2").getValue(int.class) == 2);//1跟2之间的较大者为2。
Assert.assertTrue(parser.parseExpression("1<2 ? 2 : 1").getValue(int.class) == 2);//1跟2之间的较大者为2。
}
23.2.23 表达式模板
SpEL还支持在解析表达式时将其当做一个字符串模板进行解析,即可以在表达式中混合普通的文本和特定的表达式块,然后在解析的时候将解析将对其中的表达式块进行计算,以实现模板功能。此功能需要我们在解析表达式时传入一个特定的ParserContext,其可以影响SpEl表达式的解析,对应的模板功能应该传递一个TemplateParserContext。这样Spring在解析对应的SpEl表达式时将会把其当做一个模板,然后对其中“#{exp}”形式的表达式进行计算。如下示例就是表达式模板的一个简单用法,其中使用#{}包起来的表达式会被当做一个普通的SpEl表达式进行计算以得出当前的年份,再进行替换,所以所得结果将是“the year is 2014”。
@Test
public void test23 () {
//the year is 2014
String expressionStr = "the year is #{T(java.util.Calendar).getInstance().get(T(java.util.Calendar).YEAR)}";
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(expressionStr, new TemplateParserContext());
Assert.assertTrue(expression.getValue().equals("the year is 2014"));
}
相关推荐
Spring_SpEl表达式使用用例 只是一个简单的demo,有需要的可以看看
spring spEL 表达式详解 运行环境:eclipse 构建工具:maven 不提供maven构建,maven用来解决jar包的依赖
用于Spring Cloud Function SPEL表达式注入漏洞测试环境搭建,是编译好的服务端程序,命令号java -jar *.jar运行即可,服务端运行在127.0.0.1:8080端口
Spring Cloud Gateway Actuator API SpEL表达式注入命令执行 0day 漏洞复现
主要介绍了Spring spel表达式使用方法示例,通过一些实例向大家展示了spel表达式的用法,需要的朋友可以了解下。
今天小编就为大家分享一篇关于Spring组件开发模式支持SPEL表达式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
SpringBoot 自定义注解,属性支持SPEL表达式。介绍了SPEL表达式的解析
主要介绍了Spring实战之Bean定义中的SpEL表达式语言支持操作,结合实例形式分析了Bean定义中的SpEL表达式语言操作步骤与实现技巧,需要的朋友可以参考下
今天小编就为大家分享一篇关于Spring Boot配置Thymeleaf(gradle)的简单使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
一、创建Spring Boot应用 二、SpEL结合@Value注解读取配置文件属性 三、SpEL结合 @Value注解读取系统环境变量 四、配置文件的占位符
Spring Cloud Function 是基于Spring Boot 的函数计算框架,它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。 批量检测脚本:python Spel_RCE_POC.py url.txt 反弹...
主要介绍了如何使用SpEL表达式实现动态分表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
SpringCloud Function SpEL注入漏洞分析(CVE-2022-22963).doc
Spring Expression Language (SpEL)中文文档。基于Spring4.x。
主要介绍了spring表达式语言SpEL用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
CVE-2022-22947 SpringCloud GateWay SpEL RCE.doc
【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3 【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3 【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3 ...
基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志 ### 简介 * 使用annotation来标注方法,标记操作内容 * 使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息) * ...
主要介绍了Spring实战之SpEl语法,结合实例形式分析了SpEl创建数组、集合及解析变量等相关操作原理与实现技巧,需要的朋友可以参考下
opt-log基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志简介使用annotation来标注方法,标记操作内容使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息)同一个...