文章目录
SpEL(Spring Expression Language,Spring的表达式语言),这种语言类似于JSP中学习到的EL,但是在整个的Spring之中其表达式语言要更加的复杂,而且其支持度更加的广泛,,最为重要的是,它还可以进行方法调用、对象实例化、集合操作,但是唯一的难点就是:代码太复杂了,表达式太复杂了。
1 表达式入门
首先来观察一下,什么叫表达式以及表达式到底该怎么使用?
范例:表达式操作
(1)基础参考(如果不使用表达式实现同样的功能):
package org.lks.el.demo;
public class TestELSimple {
public static void main(String[] args) {
String str = ("Hello " + "World").substring(6,11);
System.out.println(str);
}
}
(2)表达式实现:以上的实现方式使用的是硬编码的操作形式完成的,必须有String类对象,而后才可以利用对象.方法()
的形式进行操作的调用;
package org.lks.el.demo;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
public class TestELSimple {
public static void main(String[] args) {
//定义解析器
ExpressionParser ep = new SpelExpressionParser();
//解析给出的字符串表达式
Expression exp = ep.parseExpression("('hhy big ' + 'fool').substring(4,7)");
System.out.println(exp.getValue());
}
}
通过执行可以发现最为神奇的地方在于,整个Spring的表达式操作之中可以将一个完全的字符串变为了一个可以用于程序执行的语句,当然,这一系列的执行语句需要有一系列的支持类完成,但是至少可以发现,字符串的功能有一次被加强了。在本程序之中给出了如下的几个程序类:
1、表达式解析器:org.springframework.expression.ExpressionParser
(1)主要负责根据给定的表达式字符串内容对解析操作进行处理;
2、解析器处理类:org.springframework.expression.spel.standard.SpelExpressionParser
(1)ExpressionParser本身只是一个标准,但是它对应的处理类必须单独设置,本次使用的是Spel标准处理。
3、表达式:org.springframework.expression.Expression
(1)将字符串根据指定的解析器进行解析,而后使用这个生成的表达式。
4、设置表达式的一些属性信息:org.springframework.expression.EvaluationContext
(1)因为表达式的操作之中可能会存在有某些占位符需要进行处理。
范例:定义操作参数
package org.lks.el.demo;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class TestELSimple {
public static void main(String[] args) {
//1、定义要操作的表达式,使用者更多的是关注于此部分,而不关注与具体的解析处理部分
String pstr = "('hhy big ' + 'fool').substring(#start,#end)";
//2、要定义一个表达式解析器,本次使用的是SpEL表达式解析器
ExpressionParser parser = new SpelExpressionParser();
//3、使用特定的解析器来处理指定的字符串操作
Expression exp = parser.parseExpression(pstr);
//4、定义相关的环境属性
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("start", 4);
context.setVariable("end", 7);
System.out.println(exp.getValue(context));
}
}
现在就已经可以正常使用一个表达式了,同时也可以发现,字符串的功能继续加强。
2 表达式的处理原理
需要明确的是,在使用表达式的过程之中,我们除了可以利用字符串数据操作之外,也可以进行数学的操作。
范例:进行数学操作
package org.lks.el.demo;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class TestELSimple {
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("1+2");
EvaluationContext context = new StandardEvaluationContext();
System.out.println(exp.getValue(context));
}
}
可以发现除了编写字符串之外还可以编写数字,甚至各种字符串的数据,那么如果是由我们自己编写这种表达式,那么一定要首先对其进行一个判断,判断表达式应该由哪些组成,而后拆分组成的内容,最后要进行组成的字符串的相关数据类型的转换,从而得出最终的计算结果。
1、首先必须明确的按照指定的结构要求定义出表达式,例如1+2
;
2、随后需要准备出SpEL的表达式解析器,而进行解析的时候要按照如下的步骤进行:
(1)使用一个专门的断词器将给定的表达式字符串拆分为Spring可以认可的数据格式;
(2)随后要根据断词器处理的操作结果生成相应的语法结构;
(3)并且在这一个过程之中就需要进行表达式的对错检查了。
3、将已经处理后的表达式定义到一个专门的表达式对象之中等待进行最终的结果计算。
4、但是考虑到表达式里面可能会存在有部分的占位变量的内容,所以在进行表达式计算之前需要设置一个表达式上下文对象进行占位变量内容的处理;
5、最后设置好了变量内容,并且利用表达式对象就可以计算出表达式最终所执行的结果。
3 自定义分隔符
任何的表达式其组成之中一定会包含有相应的边界形式,例如:在JSP的EL里面使用${表达式}
,其中给定的${
作为边界开始,而}
作为边界结束,而在Spring里面如果用户有需要也可以定义边界。首先来观察解析表达式的操作接口的一个方法:public Expression parseExpression(String expressionString, ParserContext context) throws ParseException
,其中给定的org.springframework.expression.ParserContext
就是由用户自己来设置边界符的。提供有如下方法:
(1)是否使用此模板:public boolean isTemplate()
(2)边界开始符号:public String getExpressionPrefix()
(3)边界结束符号:public String getExpressionSuffix()
范例:定义自定义表达式边界
package org.lks.el.demo;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class TestELSimple {
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("#[1+2]", new ParserContext(){
@Override
public String getExpressionPrefix() {
return "#[";
}
@Override
public String getExpressionSuffix() {
return "]";
}
@Override
public boolean isTemplate() {
return true;
}
});
EvaluationContext context = new StandardEvaluationContext();
System.out.println(exp.getValue(context));
}
}
此时在进行表达式解析的过程之中,所出现的边界都会自动的忽略掉。
4 基本表达式
基本表达式本身非常容易理解,只是提供了一些简单的数学计算、逻辑计算等等应用。
4.1 字面表达式
1、字符串
//样例一:class java.lang.String: hhy big fool!
Expression exp = parser.parseExpression("'hhy big'+' fool! '");
//样例二:class java.lang.String: hhy big fool!,当使用双引号时,需要进行转义
Expression exp = parser.parseExpression("\"hhy big\"+\" fool! \"");
2、数值型
//样例一:class java.lang.Integer: 10
Expression exp = parser.parseExpression("10");
//样例二:class java.lang.Double: 10.000001
Expression exp = parser.parseExpression("10.00001");
//样例三:class java.lang.Double: 101000000000
Expression exp = parser.parseExpression("10.1E10");
3、布尔型
//样例一:class java.lang.Boolean: true
Expression exp = parser.parseExpression("true");
4、null类型
//样例一:null: null
Expression exp = parser.parseExpression("null");
4.2 数学表达式
1、四则运算
//样例一:class java.lang.Integer: 4
Expression exp = parser.parseExpression("1 * 4 + 6 / 9");
//样例二:class java.lang.Double: 4.666666666666667
Expression exp = parser.parseExpression("1 * 4 + 6.0 / 9");
2、求模
//样例一:class java.lang.Integer: 1
Expression exp = parser.parseExpression("5 % 2");
//样例二:class java.lang.Integer: 1,使用mod不区分大小写
Expression exp = parser.parseExpression("5 MOD 2");
3、幂运算
//样例一:class java.lang.Integer: 25
Expression exp = parser.parseExpression("5 ^ 2");
4、除法
//样例二:class java.lang.Double: 4.5
Expression exp = parser.parseExpression("9.0 DIV 2");
4.3 关系表达式
1、等于关系
//样例一:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 == 2");
//样例二:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 EQ 2");
2、不等于关系
//样例一:class java.lang.Boolean: true
Expression exp = parser.parseExpression("5 != 2");
//样例二:class java.lang.Boolean: true
Expression exp = parser.parseExpression("5 NE 2");
3、大于关系
//样例一:class java.lang.Boolean: true
Expression exp = parser.parseExpression("5 > 2");
//样例二:class java.lang.Boolean: true
Expression exp = parser.parseExpression("5 GT 2");
4、大于等于关系
//样例一:class java.lang.Boolean: true
Expression exp = parser.parseExpression("5 >= 2");
//样例二:class java.lang.Boolean: true
Expression exp = parser.parseExpression("5 GE 2");
5、小于关系
//样例一:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 < 2");
//样例二:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 LT 2");
6、小于等于关系
//样例一:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 <= 2");
//样例二:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 LE 2");
7、区间匹配
//样例一:class java.lang.Boolean: true
Expression exp = parser.parseExpression("5 BETWEEN {2,10}");
4.4 逻辑表达式
逻辑表达式只有三种关系:与、或、非。
1、与操作
//样例一:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 < 2 && 'a' == 'b'");
//样例二:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 < 2 AND 'a' == 'b'");
2、或操作
//样例一:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 < 2 || 'a' == 'b'");
//样例二:class java.lang.Boolean: false
Expression exp = parser.parseExpression("5 < 2 OR 'a' == 'b'");
3、非操作
//样例一:class java.lang.Boolean: true
Expression exp = parser.parseExpression("!(5 < 2 || 'a' == 'b')");
//样例二:class java.lang.Boolean: true
Expression exp = parser.parseExpression("NOT(5 < 2 OR 'a' == 'b')");
4.5 字符串操作
在String类中所有的操作方法都是在开发之中最为常用的。
1、连接操作
//样例一:class java.lang.String: hhy big fool!!
Expression exp = parser.parseExpression("'hhy'.concat(' big fool!!')");
2、取内容操作
//样例一:class java.lang.String: h
Expression exp = parser.parseExpression("'hhy'.concat(' big fool!!'