OGNL表达式
介绍
OGNL生来就是为了简化Java属性的取值,比如想根据名称name引用当前上下文环境中的对象,则直接键入即可,如果想要引用当前上下文环境中对象text的属性title,则键入text.title即可。如果想引用对象的非值属性,OGNL也是支持的:
属性类型 | 举例 |
属性名称 | 比如上文中的name |
属性方法 | hashcode()返回当前对象的哈希值 |
数组索引 | arrays\[0\]返回返回arrays数组的第一个元素 |
OGNL表达式用于用于访问对象的字段、方法。所以我们在使用OGNL表达式的时候需要一个对象,这在OGNL表达式中被称为root对象,以此来声明由哪个对象来执行这个表达式,返回结果。所有的OGNL表达式都在一个特定的数据环境中运行。OGNL的上下文环境是一个Map结构,称之为OgnlContext。Root对象也会被添加到上下文环境当中。
依赖引入
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.4.1</version>
</dependency>
OGNL三要素
- 表达式(Expression):
表达式是整个 OGNL 的核心内容,所有的 OGNL 操作都是针对表达式解析后进行的。通过表达式来告诉 OGNL 操作到底要干些什么。因此,表达式其实是一个带有语法含义的字符串,整个字符串将规定操作的类型和内容。OGNL 表达式支持大量的表达式,如 “链式访问对象”、表达式计算、甚至还支持 Lambda 表达式。
- Root 对象:
OGNL 的 Root 对象可以理解为 OGNL 的操作对象。当我们指定了一个表达式的时候,我们需要指定这个表达式针对的是哪个具体的对象。而这个具体的对象就是 Root 对象,这就意味着,如果有一个 OGNL 表达式,那么我们需要针对 Root 对象来进行 OGNL 表达式的计算并且返回结果。
- 上下文环境:
有个 Root 对象和表达式,我们就可以使用 OGNL 进行简单的操作了,如对 Root 对象的赋值与取值操作。但是,实际上在 OGNL 的内部,所有的操作都会在一个特定的数据环境中运行。这个数据环境就是上下文环境(Context)。OGNL 的上下文环境是一个 Map 结构,称之为 OgnlContext。Root 对象也会被添加到上下文环境当中去。
说白了上下文就是一个 MAP 结构,它实现了 java.utils.Map 的接口。
使用 Ognl
假设有一个User
类,包含用户的姓名和年龄,以及一个Address
类用于表示用户的地址。通过OGNL表达式,我们可以访问和修改这些属性。
public class User {
private String name;
private int age;
private Address address;
public User(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
}
在这里,我们假设使用OGNL库来解析和执行表达式。可以用Ognl.parseExpression
解析表达式,用Ognl.getValue
获取值或用Ognl.setValue
设置值。
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
public class OgnlExample {
public static void main(String[] args) throws OgnlException {
// 创建用户对象
Address address = new Address("New York", "5th Avenue");
User user = new User("Alice", 25, address);
// 创建OGNL上下文
OgnlContext context = new OgnlContext();
context.put("user", user); // 将对象放入上下文
context.setRoot(user); // 设置根对象
// 获取用户的名称
Object nameExpr = Ognl.parseExpression("name");
String name = (String) Ognl.getValue(nameExpr, context, user);
System.out.println("User's name: " + name); // 输出 "User's name: Alice"
// 获取用户的城市
Object cityExpr = Ognl.parseExpression("address.city");
String city = (String) Ognl.getValue(cityExpr, context, user);
System.out.println("User's city: " + city); // 输出 "User's city: New York"
// 修改用户的年龄
Object ageExpr = Ognl.parseExpression("age");
Ognl.setValue(ageExpr, context, user, 30);
System.out.println("User's new age: " + user.getAge()); // 输出 "User's new age: 30"
// 条件判断
Object isAdultExpr = Ognl.parseExpression("age > 18 ? 'Adult' : 'Minor'");
String isAdult = (String) Ognl.getValue(isAdultExpr, context, user);
System.out.println("User is an: " + isAdult); // 输出 "User is an: Adult"
}
}
原文地址:https://blog.csdn.net/weixin_73530513/article/details/143665317
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!