SpringEL表达式

表达式语言,这种语言jsp中学到的el,但是在整个spring之中其表达式语言要更加的复杂,而且支持度更加的广泛,最重要的是他可以进行方法的调用,对象的实例化,集合操作等等,但是唯一的难点就是:代码太复杂了,表达式太复杂了.
深刻领会,spring中针对于字符串的改进,程序员使用字符串开发,绝对要比使用那些类简单,所以在spring里面无时无刻提供的就是字符串的加强.




字符串的截取
传统方式

 SpringEL表达式


整个spring表达式操作之中可以将一个完全的字符串变为了一个可以用于程序执行的语句,这系系列的执行语句需要有一系列的支持类完成,但是至少我可以发现字符串的功能又一次被加强了.
Spel方式

 SpringEL表达式



1. 表达式解析器
Org.springframework.expression.expressionparser
主要负责根据给定的表达式字符串内容对解析器进行处理.
2. 解析器处理类
Org.springframework.expression.spel.standard.spelexpressionparsr
Expressionparser本身只是一个操作的标准,但是它对应的处理类必须单独设置,本次使用的是spel的标准处理
3. 表达式
Org.springframework.expression.Expression
将字符串根据指定的解析器进行解析,而后使用这个生成表达式:
4. 设置表达式的一些属性信息:
Org.springframework.expression.evaluationcontext
因为表达式操作之中可能会存在有某些占位符需要进行处理

 SpringEL表达式

字符串的功能继续加强了


表达式的处理原理
除了编写字符串之外还可以编写数字.甚至各种字符串的数据.
一定要首先对其一个判断,判断表达式应该由那些组成,而后要拆分组成的内容,最后要进行字符串的相关数据类型的转换,从而得出最终的计算结果.

 SpringEL表达式

1. 首先明确的给出表达式,例如1+2
2. 随后需要准备出spel的表达式解析器,而进行解析的时候要按照如下的步骤.
a. 使用一个专门的断词器,将给定的表达式字符串拆分为spring可以认可的数据格式.
b. 随后要根据断词器的处理生成抽象语法树
3. 将已经处理后的表达式定义到一个专门的表达式对象之中等待进行最终的结果计算
4. 考虑到表达式里面可能会存在部分的占位变量的内容,所以在进行表达式计算之前,需要设置一个表达式上下文对象进行占位变量内容的处理.
5. 最后设置了变量内容,并且利用表达式对象就可以计算出表达式最终所执行的结果


Spring自动的进行了操作的隐藏,用起来很方便
自定义分隔符
任何的表达式其组成之中一定会包含相应的边界形式,例如:在jsp中的el里面使用${表达式},在spring里面,如果用户有需要也可以定义我们的边界.首先观察解析表达式的操作类:Expressionparser
 就是用户自己设计边界符的,提供有如下方法
 SpringEL表达式是否使用此模版


 SpringEL表达式边界开始符号


 SpringEL表达式边界结束符号
 
使用匿名内部类的方式完成.可以在这步定义表达式的边界.定义的表达式在计算的过程中都会自动的忽略掉.
大部分我们不会用到自定义边界

SpringEL表达式

基本表达式
基本表达式只是提供了一些简单的数学计算,逻辑计算等
字符串不一定使用单引号,也可以使用双引号,但是要加转义字符.
A. 字面表达式
01.数值型
02.布尔型
03.字符串
04.null就是null
B.数学表达式
  01.四则运算
   02.求模
   03.幂运算
   04.除法

 SpringEL表达式

3.关系表达式
大于等于不要加空格

 SpringEL表达式

区间匹配

 SpringEL表达式
逻辑表达式
 SpringEL表达式
Class类型表达式
Spring对class的反射机制也有相应的表达式处理

如果要调用的静态属性,则使用T(类型).属性名称

SpringEL表达式


 
既然静态属性也可以调用了,也可以调用静态方法,例如在integer类里面存在有一个parseint()的static方法。此方法可以接收一个字符串同时返回一个int型的数据。


严格来讲使用最多的情况一定是类产生实例化对象,可以直接使用new()类型的方式来实例化对象。
范例:实例化data类对象(无参)

 SpringEL表达式

但是现在所调用的只是无参构造,如果有需要也可以调用有参构造。

 SpringEL表达式

整个代码里面,帮我们完整的隐藏了反射机制的实现,我们不用再考虑有参构造,无参构造。一个代码通过表达式帮我们自动完成了。


范例:实例化对象类型的判断,判断一个字符串是否是string的实例

 SpringEL表达式

利用字符串完整的实现了反射机制的各种操作,它的操作不可能很智能化,只能够处理很简单的功能。

字符串表达式
在string类中,所有的操作方法都是在开发之中最为常用的
只要string类的方法背熟了,那么这些基本的操作都可以在表达式中使用。


三目运算符
所有操作之中,三目的重要性是不言而喻的。而且可以发现,使用了三目之后可以节约我们不少的代码空间。
01. 基本三目

 SpringEL表达式

02. null处理

A:

SpringEL表达式



 
结果是hello
B: 
结果是word
SpringEL表达式

在代码之中,将null作为了false,既然有能将null做false的操作,一定有能将true作为true的操作。


03. true操作
 
在null和true的处理上,比传统的三目更加灵活。
SpringEL表达式
正则运算
正则运算应该属于string类中的操作,但是由于比较重要将其拿出。重点还是做验证操作。
01.
 SpringEL表达式

括号表达式
利用括号表达式可以实现优先级的变更操作

变量操作
在表达式里面所有的操作都是可以以变量的形式出现的
SpringEL表达式

 

如果想设置变量必须依靠evalutaioncontext类完成,在standevalutioncontext的子类中的构造方法也可以接受一个变量:

SpringEL表达式

 
这个操作方法表示设置根变量的内容,整个的变量体系之中会自动存在有一个#root的根变量。

观察根变量的操作。

SpringEL表达式

结果是root



实际上如果要进一步去研究表达式可以发现,他还可以对于方法进行引用操作。


将Integer.parseInt()方法设置为myInt的()引用。


范例:实现方法引用,最早的,没有任何意义

 SpringEL表达式

使用myint方法在表达式之中就相当于调用integer.parseInt()方法实现了字符串与Int数据的互相转型。


利用表达式调用类的属性。


利用grove安全运算符避免空异常


使用?.属性

 SpringEL表达式

结果为空。如果此时根变量的内容为空,那么返回的值就是空。如果不为空,那么就可以返回具体的操作内容。

SpringEL表达式

以上的操作变量都是在程序之中直接定义的,也可以引用applicationcontext.xml文件里面定义的内容。


范例:观察引用配置中的变量

SpringEL表达式


所有外部配置的对象就可以直接在表达式之中使用了,并且利用表达式的语法调用对象的所提供的方法。@id+bean方法
表达式终究是一个字符串,字符串不能要求他太高,spring使用spel给了string类的加强。

集合表达式
只要是开发框架的操作,永远都不可避免的要去进行集合数据的操作处理。
Spring认为数组与list集合是等价的。所以操作list集合,利用{内容,内容,…}的形式就可以完成了。
如果妳1只是想定义一个空的list集合,那么就不设置内容{}

范例:操作list集合内容。

SpringEL表达式


 

在实际开发中,往往都可以将集合设置为操作的变量进行处理。

SpringEL表达式

 
取出第二个操作元素。
以上的操作设置的是list集合,set集合也可以设置。


范例:修改list集合中的数据

SpringEL表达式

 
修改map集合中的数据
SpringEL表达式

 


实际上spring又考虑到集合数据的批量处理问题,此处也可以针对于集合数据进行处理。


集合表达式
范例:list集合的批量修改

 SpringEL表达式

范例:map集合的批量处理

SpringEL表达式


 
注意,处理后的结果是一个list集合,这个时候在表达式之中将map中的key与value进行混合的处理,所以处理完的就是一个单值的数据,也就形成了一个新的list集合的操作数据。
在整个表达式的集合操作之中,也提供有数据的筛选操作支持。
范例:数据的筛选操作

 SpringEL表达式



整个筛选的过程里面就可以进行好、各种类方法的调用(主要是string类的支持方法)。






实际使用:配置文件
整个spring的核心就是一个配置文件(增加了annotation),所以只有将表达式应用在配置文件上才会有意义.
范例:利用配置文件编写表达式应用

 SpringEL表达式

所有的处理都是围绕字符串进行的,但是后面有表达式的支持
总结
1. spring的字符串的确是最好的,利用表达式可以大量简化代码的编写.
2. Spring的核心理念就是利用字符串来解决一切的程序开发问题.