码迷,mamicode.com
首页 > 编程语言 > 详细

Spring实战笔记3---使用表达式

时间:2014-08-25 22:58:05      阅读:414      评论:0      收藏:0      [点我收藏+]

标签:style   blog   java   使用   io   strong   文件   ar   2014   

如果用过jsp表达式的人见到Spring表达是,第一反应一定会是:奥,原来是它呀(应该有不同的版本)。Spring表达式和jsp的表达式是大同小异,只要之前接触过jsp表达式,那么学习Spring的表达式那就是非常容易的事情了。

首先来说一下Spring表达式的一些特性,也可以说成是一些用法:

*使用Bean的id来引用Bean;

*调用方法和访问对象的属性;

*对值进行算数、关系和逻辑运算;

*正则表达式匹配

*集合操作


Spring表达式(SpEL)使用#()来标记的(jsp是使用$()),在一对括号中可以使用SpEL来进行一些处理,多一半的处理是在装配Bean的时候用的,

字面值

字面值就是我们所谓的常量,可以使用SpEL表达式来表示一个常量,比如说这里我表示了一个字面值5,那么使用SpEL表达式就是#(5),可以随便指定字面值的类型,字符串或者浮点数,如果要表示复杂类型的话,就需要下面更复杂的一些用法了

引用Bean、Properties和方法

我们所写的SpEL基本上多事写在xml配置文件当中的,也就是装配Bean的配置文件当中,所以本篇记录的也都是在配置文件当中的用法,那么如何引用一个Bean呢,看如下代码

	<bean id="saxophone" class="com.springframework.springidol.Saxophone"/>
	
	<bean id="instrumentlist" class="com.springframework.springidol.InstrumentList">
		<property name="instrument" value="#(saxophone)"></property>
		<!-- <property name="instrument" ref="saxophone"></property> -->
	</bean>
在instrumentlist中配置instrument属性的时候使用了SpEL表达式,我们可以使用SpEL引用一个已经在上下文文件中已经声明好的Bean的id,同样我们可以在SpEL表达式中像操作java对象一样来操作Bean引用,可以调用期中的属性以及方法,但是如果是方法的话该方法应该有返回值,而且返回值的类型最好和要装配它的属性的类型是一样的。看如下代码

<property name="instrumentName" value="#(saxophone.name)"></property>
<!-- <property name="instrumentName" value="#(saxophone.getName())"></property> -->
以上两条语句的效果是一样的这里使用了#(saxophone.name)和#(saxophone.getName())两种方式或的saxophone的name属性,一个是直接引用,一个是调用对象中的方法获得。如果我们增加一个需求,就是通过调用方法来返回的name属性返回值必须是大写,实现方法如下代码

<property name="instrumentName" value="#(saxophone.getName().toUpperCase())"></property>
这样在取到name属性的时候再调用一个toUpperCase()方法把所有字幕都转换成大写,在把值赋给instrument属性,这里会引发一个小问题,如果通过getName方法返回回来的值是null的话,那么就会有一个空指针异常抛出,如何在表达式中避免抛出空指针异常呢,方法是用null-safe存取器;

<property name="instrumentName" value="#(saxophone.getName()?.toUpperCase())"></property>

使用(?.)来代替(.)来访问toUpperCase()方法,在访问getName方法的时候SpEL会判断返回回来的值是否是null,如果是null,那么就不再调用toUpperCase()方法了


操作类

在spEL表达式中使用T() 运算符调用类作用域的方法和常量看如下代码

T(java.lang.Math)
下面的一个例子是需要把PI设置到Bean的一个属性中去和把一个随机数设置到Bean的属性中去

<property name="pi" value="#{T(java.lang.Math).PI}">
<property name="randomNumber" value="#{T(java.lang.Math).random()}">

spEL表达式的几种运算

以下表格是spEL表达式所支持的运算符


spEL表达式支持的运算符
运算符类型 运算符
关系运算 <,>,==,<=>=,lt,gt,eq,le,ge
逻辑运算 and,or,not,!
条件运算 ?:(ternary),?:(Elvis)
算数运算 +,-,*,/,%,^
正则表达式 matches



spEL的比关系运算符
运算符 符号 文本类型
等于 == eq
小于 < lt
小于等于 <= le
大于 > gt
大于等于 >= ge


条件表达式


在spEL中条件表达式分为两种,一种是,普通的三元运算,一种是省略了判断null的条件判断,看如下代码示例

<property name="instrument" value="#{songSelector.selectSong()=='Jingle Bells' ? piano : saxophone}" />

在这个示例中,如果选择的歌曲名为“Jingle Bells” 一个piano的引用将配置到该属性当中,否则一个id为saxophoone的Bean将装配到该属性当中。

这是一个普通的三元运算,和java当中的用法一样,下面这个例子,是为了简化判断一个属性是否为null而设计的,请看如下代码

<property name="song" value="#{kenny.song!=null?kenny.song:'Greensleeves'}"/>

<property name="song" value="#{kenny.song?:'Greensleeves'}"/>

以上这两种方式是等价的,运算符?:可以自动判断kenny.song 这个属性是否为null,如果等于null ,那么就该属性的值就是后边定义的字符串,如果不等于null那么该属性的值就等于kenny.song



一般我们在使用Spring的时候,很少在配置文件中使用SpEL,不到万不得已的时候不会选择表达式,因为这会让配置文件中加入有关逻辑代码,对于开发来说不利。


spEL表达式中还包含结合筛选的操作,比较复杂,等到用到的时候再开个blog介绍一下。

Spring实战笔记3---使用表达式

标签:style   blog   java   使用   io   strong   文件   ar   2014   

原文地址:http://blog.csdn.net/u011374590/article/details/36376369

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!