Spring表达式语言(SPEL)(05)
表达式模板
表达式模板允许将文字文本与一个或多个评估块混合。每个评估块都由前缀和后缀字符分隔,默认是#{}。支持实现接口ParserContext自定义前后缀。调用parseExpression()时指定 ParserContext参数如:new TemplateParserContext(),#{}包起来的表达式会被计算
@Test
public void test23 () {//the year is 2014String 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+1ParserContext 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() {// 是否启用模板@Overridepublic boolean isTemplate() {return true;}// 前缀@Overridepublic String getExpressionPrefix() {return "%{";}// 后缀@Overridepublic 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() {@Overridepublic boolean isTemplate() {return true;}@Overridepublic String getExpressionPrefix() {return "#{";}@Overridepublic 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;}
}