Spring 学习笔记心得(五)SpEl表达式的使用

首先先简单描述一下SpEl的概念:

  1. Spring表达式语言: SpEL

  2. Spring表达式语言(简称SpEL) : 是一个支持运行时查询和操作对象图的强大的表达式语言。

  3. 语法类似于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表达式的用法总结了,如果有什么说错的地方欢迎大家指正,共同学习!

你可能感兴趣的:(spring,spel)