【Java】EL 表达式API及对象方法访问

发布时间:2024年01月19日

上篇[【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 中常用的类和接口:

  1. javax.el.Expression: 这个接口代表一个 EL 表达式,可以通过它来评估表达式的值。

  2. javax.el.ExpressionFactory: 这个类是用于创建 EL 表达式对象的工厂类。通过 ExpressionFactory,可以编译和评估 EL 表达式。

  3. javax.el.ValueExpression: 这个接口代表一个 EL 值表达式,用于获取或设置表达式的值。

  4. javax.el.MethodExpression: 这个接口代表一个 EL 方法表达式,用于调用方法。

  5. javax.el.ELContext: EL 上下文接口,提供了与 EL 表达式的交互所需的上下文信息。

  6. javax.el.ELResolver: EL 解析器接口,用于解析 EL 表达式中的变量和属性,以确定它们的值。

  7. javax.el.CompositeELResolver: 这个类用于将多个 EL 解析器组合在一起,以实现更复杂的解析逻辑。

  8. javax.el.BeanELResolver: 用于处理 JavaBean 属性的 EL 解析器。

  9. javax.el.ArrayELResolver: 用于处理数组元素的 EL 解析器。

  10. javax.el.ListELResolverjavax.el.MapELResolver: 用于处理列表和映射(Map)元素的 EL 解析器。

  11. javax.el.FunctionMapper: 用于管理 EL 函数的接口。

  12. 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 的差异

  1. factory.createValueExpression(Object base, Class<?> expectedType)
    • 这个重载用于创建一个基于对象的 EL 值表达式,其中 Object base 是要评估 EL 表达式的基本对象(通常是一个 JavaBean 对象),而 Class<?> expectedType 是表达式的预期返回类型。
    • 通常用于将 Java 对象绑定到 EL 表达式中的变量,以便在表达式中使用该对象。
  2. factory.createValueExpression(ELContext context, String expression, Class<?> expectedType)
    • 这个重载用于创建一个基于表达式字符串的 EL 值表达式,其中 ELContext context 是 EL 上下文,String expression 是要评估的 EL 表达式字符串,Class<?> expectedType 是表达式的预期返回类型。
    • 通常用于在给定的 EL 上下文中评估 EL 表达式字符串。
文章来源:https://blog.csdn.net/m0_47406832/article/details/135670028
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。