表达式模板
表达式模板允许将文字文本与一个或多个评估块混合。每个评估块都由前缀和后缀字符分隔,默认是#{}。支持实现接口ParserContext自定义前后缀。调用parseExpression()时指定 ParserContext参数如:new TemplateParserContext(),#{}包起来的表达式会被计算
@Test
public void test23 () {
//the year is 2014
String expressionStr = "the year is #{T(java.util.Calendar).getInstance().get(T(java.util.Calendar).YEAR)}";
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(expressionStr, new TemplateParserContext());
System.out.println(expression.getValue());
}
使用场景
当我们不想计算整个表达式的信息,只想要计算某个对应的表达式信息时可以使用表达式模板
@Test
public void test01() {
ExpressionParser parser = new SpelExpressionParser();
System.out.println(parser.parseExpression("'hello is 1+1'").getValue());
// hello is 1+1
ParserContext templateExpression = ParserContext.TEMPLATE_EXPRESSION;
System.out.println(parser.parseExpression("hello is #{1+1}", templateExpression).getValue());
// hello is 2
}
自定义模板
@Test
public void test02() {
ExpressionParser parser = new SpelExpressionParser();
ParserContext templateExpression = new ParserContext() {
// 是否启用模板
@Override
public boolean isTemplate() {
return true;
}
// 前缀
@Override
public String getExpressionPrefix() {
return "%{";
}
// 后缀
@Override
public String getExpressionSuffix() {
return "}";
}
};
System.out.println(parser.parseExpression("hello is #{1+1}", templateExpression).getValue());
System.out.println(parser.parseExpression("hello is %{1+1}", templateExpression).getValue());
}
ParserContext接口(解析上下文)
ParserContext接口代表提供给表达式解析器的输入,可以影响表达式解析和编译
public interface ParserContext {
// 是否启用模板
boolean isTemplate();
// 模板表达式的前缀
String getExpressionPrefix();
// 模板表达式的后缀
String getExpressionSuffix();
// 启用模板表达式解析模式的默认 ParserContext 实现。表达式前缀是“#{”,表达式后缀是“}”。
ParserContext TEMPLATE_EXPRESSION = new ParserContext() {
@Override
public boolean isTemplate() {
return true;
}
@Override
public String getExpressionPrefix() {
return "#{";
}
@Override
public String getExpressionSuffix() {
return "}";
}
};
}
TemplateParserContext
可以自定义模板的信息
public class TemplateParserContext implements ParserContext {
private final String expressionPrefix;
private final String expressionSuffix;
public TemplateParserContext() {
this("#{", "}");
}
public TemplateParserContext(String expressionPrefix, String expressionSuffix) {
this.expressionPrefix = expressionPrefix;
this.expressionSuffix = expressionSuffix;
}
public final boolean isTemplate() {
return true;
}
public final String getExpressionPrefix() {
return this.expressionPrefix;
}
public final String getExpressionSuffix() {
return this.expressionSuffix;
}
}