Spring表达式语言(SPEL)(05)

表达式模板

表达式模板允许将文字文本与一个或多个评估块混合。每个评估块都由前缀和后缀字符分隔,默认是#{}。支持实现接口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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值