Juel基本使用

Juel是Java Unified Expression Language的简称,即Java统一表达语言,在JSP2.1标准(JSR-245)中定义的一部分。尽管EL表达式是伴随着JSP而生,但现在已经可以在非JSP应用中使用,相关的API放在javax.el包里面。

Juel是统一表达语言轻量而高效级的实现,具有高性能,插件式缓存,小体积,支持方法调用和多参数调用,可插拔多种特性。具体可以去Juel官方网站进行详细阅读,本文基于官方文档写一下简单的使用说明。

1. 引入依赖

使用Juel首先需要引入以下的三个依赖,版本可以自己选择

<dependency>
    <groupId>de.odysseus.juel</groupId>
    <artifactId>juel-api</artifactId>
    <version>2.2.7</version>
</dependency>
<dependency>
    <groupId>de.odysseus.juel</groupId>
    <artifactId>juel-impl</artifactId>
    <version>2.2.7</version>
</dependency>
<dependency>
    <groupId>de.odysseus.juel</groupId>
    <artifactId>juel-spi</artifactId>
    <version>2.2.7</version>
</dependency>

2. 最简单的例子

在看官方给出的quick start中的例子之前,先看看一个更简单的,实际上在项目中大多也是这种模式的应用。如下代码所示,需要做的事情很简单,即将字符串{"argIn1":"{var2}"}解析为{"argIn1":"Hello","argIn2":"World"}, 要实现该目的基本上分为三步走

  • step1. 创建基本的工厂类和上下方以供下面使用
  • step2. 设置变量值
  • step3. 解析字符串
//step1
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();

//step2
context.setVariable("var1", factory.createValueExpression("Hello", String.class));
context.setVariable("var2", factory.createValueExpression("World", String.class));

//step3
String s = "{\"argIn1\":\"${var1}\",\"argIn2\":\"${var2}\"}";
ValueExpression e = factory.createValueExpression(context, s, String.class);
System.out.println(e.getValue(context));// --> {"argIn1":"Hello","argIn2":"World"}

3.官方示例

看懂上面简单的示例后再来看官方quick start就更轻松一点。这里面内容更丰富一点,包括对方法的解析,分另用context和factory两种方式来给变量赋值,最后将${math:max(foo,bar)}成功解析为取foo和bar更大的一个。

// the ExpressionFactory implementation is de.odysseus.el.ExpressionFactoryImpl
ExpressionFactory factory = new ExpressionFactoryImpl();

// package de.odysseus.el.util provides a ready-to-use subclass of ELContext
SimpleContext context = new SimpleContext();

// map function math:max(int, int) to java.lang.Math.max(int, int)
context.setFunction("math", "max", Math.class.getMethod("max", int.class, int.class));

// map variable foo to 0
context.setVariable("foo", factory.createValueExpression(0, int.class));

// parse our expression
ValueExpression e = factory.createValueExpression(context, "${math:max(foo,bar)}", int.class);

// set value for top-level property "bar" to 1
factory.createValueExpression(context, "${bar}", int.class).setValue(context, 1);

// get value for our expression
System.out.println(e.getValue(context)); // --> 1

4. 简单解析器

Juel提供SimpleResolver类作为基本的解析器来解析表达式中的属性,如下所示,既可以解析top-level属性,也可以解析bean。

ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext(new SimpleResolver());
// resolve top-level property
factory.createValueExpression(context, "#{pi}", double.class).setValue(context, Math.PI);
ValueExpression expr1 = factory.createValueExpression(context, "${pi/2}", double.class);
System.out.println("pi/2 = " + expr1.getValue(context));  // pi/2 = 1.5707963267948966

// resolve bean property
factory.createValueExpression(context, "#{current}", Date.class).setValue(context, new Date());
ValueExpression expr2 = factory.createValueExpression(context, "${current.time}", long.class);
System.out.println("current.time = " + expr2.getValue(context));// --> current.time = 1538048848843
发布了476 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_37769323/article/details/104809261