OGNL表达式概述

本文深入探讨了OGNL(Object Graphic Navigation Language)表达式的基本概念、在Struts2框架中的应用及特殊符号的使用技巧。OGNL是一种强大的表达式语言,用于访问和操作对象属性,特别适用于Java Web开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写

* 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象

* 通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性

 

2. Struts2框架使用OGNL作为默认的表达式语言

* OGNL是一种比EL强大很多倍的语言

* xwork提供 OGNL表达式

* ognl-3.0.5.jar

 

3. OGNL 提供五大类功能

   * 支持对象方法调用

   * 支持类静态的方法调用和值访问

   * 访问OGNL上下文(OGNL context)和ActionContext

   * 支持赋值操作和表达式串联

   * 操作集合对象

 

4. 测试的代码

// 访问对象的方法

@Test

public void run1() throws OgnlException{

OgnlContext context = new OgnlContext();

// 获取对象的方法

Object obj = Ognl.getValue("'helloworld'.length()", context, context.getRoot());

System.out.println(obj);

}

 

// 获取OGNL上下文件的对象

@Test

public void run3() throws OgnlException{

OgnlContext context = new OgnlContext();

context.put("name", "美美");

// 获取对象的方法

Object obj = Ognl.getValue("#name", context, context.getRoot());

System.out.println(obj);

}

 

// 从root栈获取值

@Test

public void demo3() throws OgnlException{

OgnlContext context = new OgnlContext();

Customer c = new Customer();

c.setCust_name("haha");

context.setRoot(c);

String name = (String) Ognl.getValue("cust_name", context, context.getRoot());

System.out.println(name);

}

 

 

**技术分析之在Struts2框架中使用OGNL表达式**

 

1. Struts2引入了OGNL表达式,主要是在JSP页面中获取值栈中的值

2. 具体在Struts2中怎么使用呢?如下步骤

* 需要先引入Struts2的标签库

> <%@ taglib prefix="s" uri="/struts-tags" %>

 

* 使用Struts2提供的标签中的标签

> <s:property value="OGNL表达式"/>

 

3. 在JSP页面使用OGNL表达式

* 访问对象方法

<s:property value="'hello'.length()"/>

 

**总结OGNL表达式的特殊的符号**

 

1. # 符号的用法

* 获得contextMap中的数据

> <s:property value="#request.name"/>

> <s:property value="#session.name"/>

> <s:property value="#application.name"/>

> <s:property value="#attr.name"/>

> <s:property value="#parameters.id"/>

> <s:property value="#parameters.name"/>

 

* 构建一个map集合

* 例如:

* <s:radio name="sex" list="{'男','女'}"></s:radio>

* <s:radio name="sex" list="#{'0':'男','1':'女'}"></s:radio>

 

2. % 符号的用法

* 强制字符串解析成OGNL表达式。

> 例如:在request域中存入值,然后在文本框(<s:textfield>)中取值,现在到value上。

> <s:textfield value="%{#request.msg}"/>

 

* { }中值用''引起来,此时不再是ognl表达式,而是普通的字符串

> 例如:<s:property value="%{'#request.msg'}"/>

 

3. $ 符号的用法

* 在配置文件中可以使用OGNL表达式,例如:文件下载的配置文件。

<action name="download1" class="cn.itcast.demo2.DownloadAction">

<result name="success" type="stream">

<param name="contentType">${contentType}</param>

<param name="contentDisposition">attachment;filename=${downFilename}</param>

</result>

</action>

### OGNL 表达式解析方法与原理 #### 1. OGNL 表达式的定义与作用 OGNL (Object Graphic Navigation Language) 是一种用于访问和操作 Java 对象图的语言。它允许通过简洁的语法来获取对象属性、调用方法以及执行复杂的表达式计算[^3]。 #### 2. 解析流程概述 当接收到一个字符串形式的 OGNL 表达式时,系统会先将其转换成抽象语法树(AST),再基于此结构进行求值处理。具体来说: - **词法分析**:将原始字符序列分解为有意义的标记(token) - **语法分析**:按照预设语法规则构建 AST 节点 - **语义分析**:检查并优化生成的 AST 结构 - **解释执行**:遍历 AST 并依据节点类型实施相应的动作 #### 3. 关键组件介绍 ##### a. `OgnlExpressionParser` 类 为了实现自定义的 OGNL 解析器,可以创建名为 `OgnlExpressionParser` 的类负责整个解析过程中的核心工作[^1]。 ```java public class OgnlExpressionParser { public static Object parse(String expression, Map<String, Object> context){ try{ // 将 String 类型的字符串解析为 OGNL 可识别的形式 ExpressionCompiler compiler = new ExpressionCompiler(expression); Node node = Ognl.parseExpression(expression); return Ognl.getValue(node, context, null); } catch(Exception e){ throw new RuntimeException("Failed to evaluate expression",e); } } } ``` 这段代码展示了如何利用 OGNL 库提供的工具完成从文本到可执行表达式的转变,并最终在一个给定的作用域内评估该表达式的结果。 ##### b. `parseExpression()` 方法的应用 实际应用中,通常会调用 `parseExpression` 方法把传入的字符串参数转化为内部表示形式——即 AST 链表(`ASTChain`)实例,以便后续进一步处理[^2]。 ```java Node exprTree = Ognl.parseExpression("#root.name"); // 此处 "#root" 指向当前上下文中根对象的位置,“name”则是要读取的具体字段名称 ``` 以上例子说明了怎样通过指定路径定位目标数据项,在这里假设存在一个映射关系使得 `"#root"` 映射到了某个特定的对象上。 #### 4. 特殊特性支持 除了基础的功能外,OGNL 还具备一些独特的机制来增强其灵活性和实用性: - **方法调用**: 如前所述,可以直接在表达式里嵌套函数调用,甚至包括静态成员的操作。 - **逻辑运算**: 提供完整的条件判断能力,可用于控制流管理或复杂查询场景下的筛选条件设置。 - **上下文交互**: 访问由框架维护的动作环境(ActionContext),从而获得更广泛的信息源以辅助决策制定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值