Spring 學習筆記心得(五)SpEl表達式的使用

首先先簡單描述一下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表達式的用法總結了,如果有什麼說錯的地方歡迎大家指正,共同學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章