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

本文详细介绍了Java标准库中的javax.elAPI,包括Expression、ExpressionFactory、ValueExpression等关键类,展示了如何使用EL表达式访问对象属性和调用方法。通过实例演示了如何在Java程序中创建和使用EL方法表达式进行计算。
摘要由CSDN通过智能技术生成

上篇[【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 表达式字符串。
  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架中使用EL表达式Expression Language)可以方便地访问和操作Java对象,主要用于在JSP页面或Spring的注解中进行数据绑定和表达式求值。 以下是在Spring中使用EL表达式的几个常见场景和用法: 1. 在JSP页面中使用EL表达式: 在JSP页面中,可以使用EL表达式访问和操作Java对象的属性、方法和集合。例如,`${user.name}`可以获取名为user的Java对象的name属性值。 2. 在Spring MVC的注解中使用EL表达式: 在Spring MVC中,可以使用EL表达式在注解中动态地设置属性值。例如,`@RequestMapping("${url.mapping}")`可以根据EL表达式`${url.mapping}`的值动态地设置请求映射路径。 3. 在Spring的XML配置文件中使用EL表达式: 在Spring的配置文件中,可以使用EL表达式引用其他属性或bean的值。例如,`<property name="timeout" value="${connection.timeout}"/>`可以将`${connection.timeout}`的值设置为bean的timeout属性。 4. 使用Spring表达式语言(SpEL): Spring框架还提供了一种更强大的EL表达式语言,称为SpEL(Spring Expression Language)。SpEL支持更复杂的表达式求值和操作,可以在Spring的注解、XML配置文件以及运行时动态注入等场景中使用。 需要注意的是,在使用EL表达式时,需要确保相关的JAR包已经添加到项目的依赖中,通常是`javax.el-api`和`jstl`。 希望以上信息对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值