上篇[【Java】原生 EL 表达式对象属性访问]([Java]原生 EL 表达式对象属性访问-CSDN博客) 简单介绍了 EL 表达式,演示了 EL 表达式访问对象属性。本文将介绍 java.el
包下 API 及 使用 EL 表达式访问对象方法的示例。
java.el
API
javax.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 表达式语法
EL 表达式通常用 ${}
包围,例如 ${user.name}
可以获取用户的名称
- 对象引用:
${user}
表示引用名为user
的JavaBean对象。 - 属性访问:
${user.name}
表示访问user
对象的name
属性。 - 方法调用:
${user.calculateAge()}
表示调用user
对象的calculateAge
方法。 - 运算符:EL 表达式支持各种运算符,如加法、减法、逻辑运算等。
在一些 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)
:- 这个重载用于创建一个基于对象的 EL 值表达式,其中
Object base
是要评估 EL 表达式的基本对象(通常是一个 JavaBean 对象),而Class<?> expectedType
是表达式的预期返回类型。 - 通常用于将 Java 对象绑定到 EL 表达式中的变量,以便在表达式中使用该对象。
- 这个重载用于创建一个基于对象的 EL 值表达式,其中
factory.createValueExpression(ELContext context, String expression, Class<?> expectedType)
:- 这个重载用于创建一个基于表达式字符串的 EL 值表达式,其中
ELContext context
是 EL 上下文,String expression
是要评估的 EL 表达式字符串,Class<?> expectedType
是表达式的预期返回类型。 - 通常用于在给定的 EL 上下文中评估 EL 表达式字符串。
- 这个重载用于创建一个基于表达式字符串的 EL 值表达式,其中