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>