`
234390216
  • 浏览: 10238516 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462880
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775973
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398731
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395157
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680168
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531135
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1184996
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468793
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151486
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68338
社区版块
存档分类
最新评论

Spring(23)——SPEL表达式(三)

阅读更多

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"));
}

0
1
分享到:
评论

相关推荐

    Spring Cloud Gateway Actuator API SpEL表达式注入命令执行 0day 漏洞复现

    漏洞的根源在于Spring Cloud Gateway Actuator API 对用户输入的参数没有进行充分的验证和过滤,这使得攻击者可以通过构造恶意的SpEL表达式来执行任意系统命令。例如,当Actuator的某个端点接受到包含SpEL表达式的...

    Spring Boot配置Thymeleaf(gradle)的简单使用

    三、页面视图的配置 在 HTML 文件中,我们需要引入 Thymeleaf 的标签库。例如: ```html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"&gt; ``` 然后,我们...

    spring3.0_doc_api

    4. **基于表达式的SpEL(Spring Expression Language)**:提供了强大的表达式语言,用于在运行时查询和操作对象图。 5. **RESTful Web服务支持**:Spring MVC模块增加了对RESTful服务的支持,通过`@RequestMapping...

    跟开涛学Spring

    1.15 【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3 . . . . . . . . . . . . . . .177 1.16 【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3 . . . . . . . . . . . . ....

    Spring3.0_MVC_中文教程

    同时,Spring3.0引入了一种新的表达式语言——Spring 表达式语言(SpEL),它允许在XML和注解中定义基于bean的定义。此外,Spring3.0还支持REST Web服务和注解的格式化,例如,可以使用@DateTimeFormat和@...

    spring security 2.0 的简单配置使用(补)——用aop控制method级权限

    `@PreAuthorize`允许使用SpEL(Spring Expression Language)表达式进行更复杂的权限检查。 5. **自定义访问决策策略** 默认的访问决策管理器可能不满足所有需求,我们可以创建自定义的访问决策策略。例如,可以...

    spring学习笔记(四)

    这里的`#{systemProperties['java.version']}`就是一个SpEL表达式,它会获取系统属性`java.version`的值。 除了`@Value`,Spring还提供了其他许多工具和注解,如`@Autowired`用于自动装配Bean,`@Component`、`@...

    最新版spring-framework-4.3.10.RELEASE-dist完整包

    12. **Spring Expression Language (SpEL)**:SpEL是Spring的表达式语言,用于在运行时查询和操作对象图。 13. **事件驱动架构**:Spring支持事件驱动编程模型,允许组件之间通过发布和监听事件进行通信。 14. **...

    spring4.1.5、4.3.15、4.3.24版本使用的jar包

    同时,Spring 4.1还引入了Spring Expression Language (SpEL)的增强,允许更灵活的表达式计算。 2. **Spring 4.3.x系列**:这个版本系列是对4.1的重大升级,4.3.15和4.3.24是其中的稳定版本。Spring 4.3引入了更多...

    spring 1到3大版本号下的最高版本

    2.5.6引入了Spring Expression Language (SpEL),这是一个强大的表达式语言,用于在运行时查询和操作对象图。此外,它还引入了基于注解的配置,使得开发者可以使用注解替代XML配置文件,大大简化了项目设置。这个...

    spring aop依赖jar包

    - `spring-expression.jar`(可能需要):Spring表达式语言(SpEL),用于在运行时查询和操作对象图。 在使用这些jar包时,你需要确保它们都在你的项目类路径(ClassPath)下。如果你使用Maven或Gradle等构建工具,...

    spring-2.5.6.jar

    8. **Spring表达式语言(SpEL)**:Spring Expression Language是Spring框架内的一种强大表达式语言,用于在运行时查询和操纵对象图。它可以用于Bean装配、AOP等方面,提供灵活的数据绑定和表达式计算。 9. **...

    spring-3.1.0中文版api帮助文档.pdf

    Spring 3.1新增了Spring表达式语言(SpEL),这是一种强大的领域特定语言,用于在运行时查询和操纵对象图。SpEL支持丰富的操作符和函数,可以用于属性访问、算术运算、条件判断等多种场景。SpEL不仅可以作为字符串在...

    spring-framework-reference 3.0

    Spring 3.0 中引入了一个新的表达式语言——**Spring Expression Language (SpEL)**。这是一种强大的脚本语言,用于在Spring组件之间描述任务和配置。SpEL可以更好地与XML配置文件交互,并且对于安全性和集成方面...

    跟我学spring

    【第五章】Spring表达式语言(SpEL)是一个强大的表达式语言,支持在运行时查询和操作对象图。5.1节概述SpEL,5.2节和5.3节详细说明SpEL的基础和语法,5.4节则展示了如何在Bean定义中使用SpEL。 【第六章】面向切面...

    spring4.2的lib包

    5. **更强大的SpEL(Spring Expression Language)**:Spring的表达式语言在4.2版本中也有所增强,提供了更多函数和操作符,使得在运行时动态评估表达式更为强大。 综上所述,`spring4.2.jar`是Spring框架4.2版本的...

    spring2.0中文开发参考手册.chm.zip

    7. **Spring表达式语言(SpEL)**:Spring Expression Language是Spring 2.0引入的一种强大表达式语言,用于在运行时查询和操作对象图。SpEL可以用在配置中,用于动态计算属性值。 8. **单元测试与集成测试**:...

    spring框架:spring-framework-4.3.9.RELEASE-dist

    5. **Spring Expression Language (SpEL)**:一种强大的表达式语言,用于在运行时查询和操作对象图。 四、实践应用 在实际项目中,开发者可以利用Spring框架4.3.9.RELEASE来构建模块化的应用,通过DI管理组件之间的...

Global site tag (gtag.js) - Google Analytics