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
网友评论