SPEL-Spring表达式

本文介绍了Spring中的SPEL表达式的多种用途,包括使用字面值常量、进行算术运算、访问变量属性和方法、调用类的静态方法及变量等。特别强调了SPEL在操纵集合方面的强大能力。

Java EE有自己的EL表达式,Struts2有OGNL表达式,但两者都主要是面向视图层的(JSP页面),Spring中的SPEL可以用来在applicationContext.xml配置文件中使用字面值常量、进行算术或者关系或者逻辑表达式计算、访问变量属性和方法、调用类的静态属性和方法、操纵集合等等功能。SPEL的格式是#{expression}。

使用字面值常量

给id为zhangsan的Bean的name属性赋值为字符串"zhangsan"。

	<bean id="zhangsan" class="com.daniel.model.bean.Person">
		<property name="name" value="#{'zhangsan'}"></property>
	</bean>

不过在这里面使用字面值常量似乎没什么意思,value=“zhangsan”也是一样的效果。

进行算术或者关系或者逻辑表达式计算

支持常用的算术运算符:+、-、*、/

支持常用的关系运算符:>、>=、<、<=、==

支持常用的逻辑运算符:!、&&、||

支持三目运算符:?:

这点很多表达式都支持,而且也非常容易使用,这里就不做介绍。

访问变量属性和方法

如果想要把一个bean里面的属性赋值给另外一个bean的属性,那么就得去访问变量的属性了,SPEL使用变量名.属性名就可以访问该bean的属性了。把张三的地址值赋值给李四的地址值

	<bean id="zhangsan" class="com.daniel.model.bean.Person">
		<property name="name" value="#{'zhangsan'}"></property>
		<property name="address" value="皇后大道"></property>
	</bean>
	
	<bean id="lisi" class="com.daniel.model.bean.Person">
		<property name="name" value="#{'lisi'}"></property>
		<property name="address" value="#{zhangsan.address}"></property>
	</bean>

如果要访问变量的方法,也是同样使用变量名.方法名,方法调用之后会返回一个值,上面的例子通过getter方法来将张三的地址值获取并赋值给李四
	<bean id="lisi" class="com.daniel.model.bean.Person">
		<property name="name" value="#{'lisi'}"></property>
		<property name="address" value="#{zhangsan.getAddress}"></property>
	</bean>

访问类、类的静态方法和变量

T()运算符是专门用来访问类、类的静态方法和变量的。比如说T(java.util.Random)可以访问到Random这个类,T(java.util.Random.random())可以访问到这个类中的random这个静态方法,T(Action.SUCCESS)可以访问到Action中的公开的静态常量。下面是调用Random.random()来获取一个随机数并赋值给id为test的bean的num属性。

	<bean id="test" class="GenerateNum">
		<property name="num" value="T{java.util.Random.random()}"></property>
	</bean>

操纵集合

SPEL最强大之处还是在与操纵集合。

下面是配合命名空间util来生成一个list类型的bean,要使用这个命名空间,需要引入

<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	<u>xmlns:util="http://www.springframework.org/schema/util"</u>
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
						http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
						<u>http://www.springframework.org/schema/util
						http://www.springframework.org/schema/util/spring-util-3.0.xsd</u>">
在配置文件进行bean声明

	<util:list id="cities">
		<value>北京</value>
		<value>上海</value>
	</util:list>

util命名空间可以帮助我们生成集合list、set、map以及properties。

筛选集合是一项非常强大的功能,使用.?[]可以对集合进行筛选,返回符合条件的子集,此外使用.^[]可以筛选出符合条件的第一个元素,.$[]可以筛选出符合条件的最后一个元素,下面筛选出价格大于50元的图书

	<util:set id="books">
		<bean id="book1" class="com.daniel.model.bean.Book">
			<property name="bookName" value="西游记"></property>
			<property name="bookPrice" value="39.9"></property>
		</bean>
		<bean id="book2" class="com.daniel.model.bean.Book">
			<property name="bookName" value="红楼梦"></property>
			<property name="bookPrice" value="59.9"></property>
		</bean>
		<bean id="book3" class="com.daniel.model.bean.Book">
			<property name="bookName" value="三国演义"></property>
			<property name="bookPrice" value="49.9"></property>
		</bean>
		<bean id="book4" class="com.daniel.model.bean.Book">
			<property name="bookName" value="水浒传"></property>
			<property name="bookPrice" value="69.9"></property>
		</bean>
	</util:set>
	<util:set id="priceGt50">
		<value>#{books.?[price > 50]}</value>
	</util:set>
投影集合
使用.![]可以将集合投影到另外一个集合,下面将书名bookName的值都投射到bookNames这个bean上

	<util:set id="bookNames">
		<value>#{books.![bookName]}</value>
	</util:set>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值