首先先簡單描述一下SpEl的概念:
Spring表達式語言: SpEL
Spring表達式語言(簡稱SpEL) : 是一個支持運行時查
詢和操作對象圖的強大的表達式語言。
語法類似於EL : SpEL使用+#(…}作爲定界符,所有在大
框號中的字符都將被認爲是SpEL
● SpEL爲bean的屬性進行動態賦值提供了便利
● 通過SpEL可以實現 :
-通過bean的id對bean進行引用
-調用方法以及引用對象中的屬性
-計算表達式的值
-正則表達式的匹配
1.支持算數運算符
運算符類型 | 運算符 |
---|---|
算術運算 | +、-、*、/、%、^ |
比較運算 | 符號形式:<、>、==、<=、>= 文本形式:lt、gt、eq、le、ge |
邏輯運算 | and、or、not |
條件運算 | ?: (ternary)、?: (Elvis) |
正則表達式 | matches |
1.1 算數運算:( + , - , * , / )
<bean id="spEl" class="cn.itcast.spring.beans.SpEl.doamin.TestSpEl">
<!-- +號運算符 -->
<property name="add_res" value="#{100 + 100}"/>
<!-- -號運算符 -->
<property name="sub_res" value="#{100 - 50}"/>
<!-- *號運算符 -->
<property name="mul_res" value="#{10 * 10}"/>
<!-- /號運算符 -->
<property name="div_res" value="#{100 / 10}"/>
</bean>
輸出結果:
add_res = 200,
sub_res = 50,
mul_res = 100,
div_res = 10.0
1.2 比較運算:( > , < , >= , <= , == )
<!-- > 號運算符 -->
<property name="big_res" value="#{100 > 10}"/>
<!-- < 號運算符 -->
<property name="sml_res" value="#{100 lt 10}"/>
<!-- >= 號運算符 -->
<property name="big_eql_res" value="#{100 >= 100}"/>
<!-- <= 號運算符 -->
<property name="sml_eql_res" value="#{100 le 100}"/>
<!-- = 號運算符 -->
<property name="eql_res" value="#{100 == 100}"/>
注意:XML文件中不允許定義 ’ < 號’ 因爲它是敏感標籤, 所以應該我們可以使用lt 標籤代替 ‘<’ 號,從而達到演示效果
這裏小編補充一些解釋:
eq: EQUAL 等於
ne :NOT EQUAL 不等於
gt :GREATER THAN 大於
lt :LESS THAN 小於
ge:GREATER THAN OR EQUAL 大於等於
le: LESS THAN OR EQUAL 小於等於
輸出結果:
big_res = true,
sml_res = false,
big_eql_res = true,
sml_eql_res = true,
eql_res = true
1.3邏輯運算:(and , or , not )
<!-- and 運算符 -->
<property name="and_res" value="#{(10 == 10) and (100 == 10)}"/>
<!-- or 號運算符 -->
<property name="or_res" value="#{(100 == 100) or (100 = 10)}"/>
<!-- not 號運算符 -->
<property name="not_res" value="#{ not (100 == 10)}"/>
輸出結果:
and_res = false,
or_res = true,
not_res = true
1.4 條件運算:
1.4.1 首先先創建兩個CarBean
<bean id="car" class="cn.itcast.spring.beans.domain.Car">
<property name="brand" value="Audi"/>
<property name="addr" value="BeiJ"/>
<property name="price" value="200000"/>
</bean>
<bean id="car2" class="cn.itcast.spring.beans.domain.Car">
<property name="brand" value="NoJi"/>
<property name="addr" value="ChangS"/>
<property name="price" value="300000"/>
</bean>
1.4.2 條件表達式
//這裏使用#{ user.car.price > 100000 ? car2 : car} 條件表達式
<bean id="user3" class="cn.itcast.spring.beans.domain.User_Caffr" parent="user">
<property name="car" value="#{ user.car.price > 100000 ? car2 : car}"/>
</bean>
1.5 正則表達式:(matches )
<!-- 正則表達式 -->
<property name="mat_res" value="#{10 matches '[0-100]*'}"/>
輸出結果:
mat_res=true
1.6 其他
<!-- 整數 -->
<property name="count" value="#{5}"/>
<!-- -科學計數法: -->
<property name="capacity" value="#{1e4]"/>
<!-- 布爾 -->
<property name="enabled" value="#{false}"/>
2.複雜類型使用:
2.1 引用對象類型屬性
<bean id="user" class="cn.itcast.spring.beans.domain.User_Caffr">
<property name="user_name" value="ZS"/>
</bean>
<bean id="user2" class="cn.itcast.spring.beans.domain.User_Caffr">
<property name="user_name" value="#{user.user_name}"/>
</bean>
2.2 關於集合數組的操作
2.2.1 準備工作:創建User類
private String name;//姓名
private String sex;//性別
private int age;//年齡
2.2.2 創建ArrayAndListBean類
private String[] bags;//包中文具名
private int[] ball;//球的個數數組
private List<String> pome;//詩句集合
private User[] users;//用戶數組
2.2.3 創建userBean
<bean id="user" class="cn.itcast.spring.beans.domain.User">
<constructor-arg value="Rocy"/>
<constructor-arg value="male"/>
<constructor-arg value="23"/>
</bean>
<bean id="user2" class="cn.itcast.spring.beans.domain.User">
<constructor-arg value="Jack"/>
<constructor-arg value="male"/>
<constructor-arg value="24"/>
</bean>
<bean id="user3" class="cn.itcast.spring.beans.domain.User">
<constructor-arg value="Rose"/>
<constructor-arg value="female"/>
<constructor-arg value="24"/>
2.2.4 創建ArrayAndListBean
<bean id="arrayAndListBean" class="cn.itcast.spring.beans.SpEl.doamin.ArrayAndListBean">
<property name="bags">
<array>
<value>文具盒</value>
<value>鉛筆盒</value>
<value>眼鏡盒</value>
<value>橡皮擦</value>
</array>
</property>
<property name="ball">
<array>
<value>1</value>
<value>3</value>
<value>5</value>
<value>7</value>
<value>9</value>
</array>
</property>
<property name="pome">
<list>
<value>牀前明月光</value>
<value>疑是地上霜</value>
<value>舉頭望明月</value>
<value>低頭思故鄉</value>
</list>
</property>
<property name="users">
<array>
<ref bean="user"/>
<ref bean="user2"/>
<ref bean="user3"/>
</array>
</property>
</bean>
輸出結果:
ArrayAndListBean{
bags=[文具盒, 鉛筆盒, 眼鏡盒, 橡皮擦],
ball=[1, 3, 5, 7, 9],
pome=[牀前明月光, 疑是地上霜, 舉頭望明月, 低頭思故鄉],
users=[User{name=‘Jack’, sex=‘male’, age=24},
User{name=‘Rocy’, sex=‘male’, age=23}]}
2.2.5 創建TestArrayAndList測試類
private String bag;//接受文具名稱
private int ball;//接受球的數量
private String pome;//接受詩句
private List<User> get_age_user;//接受返回集合Uer
private User user_fir;//接受第一個匹配項
private User user_last;//接受最後一個匹配項
private List<String> get_all_name;//接受所有的名字
2.2.6 完成如下需求:
1.從bags數組中獲取橡皮擦
<!--
1.從bags數組中獲取橡皮擦 arrayAndListBean 引用上面ArrayAndListBean 獲取其中的bags屬性
-->
<property name="bag" value="#{arrayAndListBean.bags[3]}"/>
輸出結果:bag=‘橡皮擦’
2.獲取ball中的‘5’
<!--
2.獲取ball中的‘5’ 引用上面ArrayAndListBean 獲取其中的ball屬性
-->
<property name="ball" value="#{arrayAndListBean.ball[2]}"/>
輸出結果:ball=5
3.獲取pome中的‘舉頭望明月’
<!--
3.獲取pome中的‘舉頭望明月’ 引用上面ArrayAndListBean 獲取其中的pome屬性
-->
<property name="pome" value="#{arrayAndListBean.pome.get(2)}"/>
輸出結果:pome=‘舉頭望明月’
4 .獲取年齡24的所有User信息
.?[表達式] 運算符:用來對集合進行過濾,得到集合的一個子集
<!--
4.獲取年齡24的所有User信息
-->
<property name="get_age_user" value="#{(arrayAndListBean.users).?[age == 24]}"/>
輸出結果:get_age_user=[User{name=‘Jack’, sex=‘male’, age=24}, User{name=‘Rose’, sex=‘female’, age=24}]
5獲取查詢滿足表達式的第一個匹配項,如:獲取第一個年齡爲24歲的User
.^ [表達式]:查詢滿足表達式的第一個匹配項
<!--
5獲取查詢滿足表達式的第一個匹配項,如:獲取第一個年齡爲24歲的User
-->
<property name="user_fir" value="#{(arrayAndListBean.users).^[age == 24]}"/>
輸出結果: user_fir=User{name=‘Jack’, sex=‘male’, age=24}
6.獲取查詢滿足表達式的最後一個匹配項,如:獲取最後一個年齡爲24歲的User
.$[表達式]:查詢滿足表達式的最後一個匹配項
<!--
6.獲取查詢滿足表達式的最後一個匹配項,如:獲取最後一個年齡爲24歲的User
-->
<property name="user_last" value="#{(arrayAndListBean.users).$[age == 24]}"/>
輸出結果:user_last=User{name=‘Rose’, sex=‘female’, age=24}
7.查詢所有User的名字
.![屬性名]:從集合的每個成員中選擇特定的屬性放到另外一個集合中
<!--
7.查詢所有User的名字
-->
<property name="get_all_name" value="#{(arrayAndListBean.users).![name]}"/>
輸出結果:get_all_name=[Jack, Rocy, Rose]
2.3 使用T()調用一個類的靜態方法
<property name="c" value="#{T(java.lang.Math).PI * 2 }"/>
好了 , 以上就是小編總結的SpEl表達式的用法總結了,如果有什麼說錯的地方歡迎大家指正,共同學習!