上篇[【Java】原生 EL 表达式对象属性访问]([Java]原生 EL 表达式对象属性访问-CSDN博客) 简单介绍了 EL 表达式,演示了 EL 表达式访问对象属性。本文将介绍 java.el
包下 API 及 使用 EL 表达式访问对象方法的示例。
java.el
APIjavax.el
API(Expression Language API)是 Java 标准库中的一组类和接口,用于支持表达式语言(Expression Language,EL)的功能。EL 允许在 Java 应用程序中评估和处理表达式,通常用于访问和操作数据。以下是一些 javax.el
API 中常用的类和接口:
javax.el.Expression
: 这个接口代表一个 EL 表达式,可以通过它来评估表达式的值。
javax.el.ExpressionFactory
: 这个类是用于创建 EL 表达式对象的工厂类。通过 ExpressionFactory
,可以编译和评估 EL 表达式。
javax.el.ValueExpression
: 这个接口代表一个 EL 值表达式,用于获取或设置表达式的值。
javax.el.MethodExpression
: 这个接口代表一个 EL 方法表达式,用于调用方法。
javax.el.ELContext
: EL 上下文接口,提供了与 EL 表达式的交互所需的上下文信息。
javax.el.ELResolver
: EL 解析器接口,用于解析 EL 表达式中的变量和属性,以确定它们的值。
javax.el.CompositeELResolver
: 这个类用于将多个 EL 解析器组合在一起,以实现更复杂的解析逻辑。
javax.el.BeanELResolver
: 用于处理 JavaBean 属性的 EL 解析器。
javax.el.ArrayELResolver
: 用于处理数组元素的 EL 解析器。
javax.el.ListELResolver
和 javax.el.MapELResolver
: 用于处理列表和映射(Map)元素的 EL 解析器。
javax.el.FunctionMapper
: 用于管理 EL 函数的接口。
javax.el.VariableMapper
: 用于管理 EL 变量的接口。
这些类和接口组成了 javax.el
API,使开发人员能够在 Java 应用程序中轻松地使用表达式语言来处理数据和业务逻辑。这对于构建动态的 Web 应用程序和处理用户界面中的数据非常有用。
以下演示了使用EL表示是访问对象方法的一个示例
EL 表达式通常用 ${}
包围,例如 ${user.name}
可以获取用户的名称
${user}
表示引用名为 user
的JavaBean对象。${user.name}
表示访问 user
对象的 name
属性。${user.calculateAge()}
表示调用 user
对象的 calculateAge
方法。在一些 EL 表达式框架中,还常常包含一些内置的属性,如 Tomcat 实现的 EL 表达式框架中就内置了 ${pageContext.request}
, 这个值通常是为 JSP 使用的。
创建 User
对象
package com.xzbd.elDemo;
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
使用示例
package com.xzbd.elDemo;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.el.StandardELContext;
public class ElMethod {
public static void main(String[] args) {
// 创建 ExpressionFactory
ExpressionFactory factory = javax.el.ExpressionFactory.newInstance();
// 创建 ELContext
ELContext elContext = new StandardELContext(factory);
// 创建 Calculator 对象
Calculator calculator = new Calculator();
// 在 EL 表达式中使用 Calculator 对象
elContext.getVariableMapper().setVariable("calculator",
factory.createValueExpression(calculator, Calculator.class));
// 创建 EL 方法表达式
String expression = "${calculator.add(8, 3)}";
MethodExpression methodExpression = factory.createMethodExpression(elContext, expression, int.class,
new Class[] { int.class, int.class });
// 调用 EL 方法表达式并获取结果
Object result = methodExpression.invoke(elContext, null);
// 处理结果
if (result != null) {
System.out.println("Result: " + result);
} else {
System.out.println("Expression did not evaluate to a value.");
}
}
}
代码中的注释解释了EL表达式创建及使用的一般流程。
PS D:\z_workspace\elDemo> d:; cd 'd:\z_workspace\elDemo'; & 'D:\apps\Java\jdk-17.0.7\bin\java.exe' '@D:\Users\74511\AppData\Local\Temp\cp_5lkolde1lzvh645orewxyvvup.argfile' 'com.xzbd.elDemo.ElMethod'
Result: 11
两个 createValueExpression
的差异
factory.createValueExpression(Object base, Class<?> expectedType)
:
Object base
是要评估 EL 表达式的基本对象(通常是一个 JavaBean 对象),而 Class<?> expectedType
是表达式的预期返回类型。factory.createValueExpression(ELContext context, String expression, Class<?> expectedType)
:
ELContext context
是 EL 上下文,String expression
是要评估的 EL 表达式字符串,Class<?> expectedType
是表达式的预期返回类型。