struts2的OGNL表达式

基本概念:

  OGNL(Object Graph Navigation Language),是一种表达式语言。使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性、调用Java对象树的方法、同时能够自动实现必要的类型转化。如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。

OGNL的API看起来就是两个简单的静态方法:

public static Object getValue( Object tree, Map context, Object root ) throws OgnlException;

public static void setValue( Object tree, Map context, Object root, Object value ) throws OgnlException;

OGNL表达式的计算是围绕OGNL上下文进行的。

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。

上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。

在struts2中OGNL必须配合struts标签使用而EL表达式可以直接使用,能够使用EL的一定可以使用OGNL,能使用OGNL的不一定能够使用EL

OGNL中重要的3个符号:#、%、$:

1.#符号

#符号的用途一般有三种。

—    访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

—    用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==‘pla1‘}.{age}[0]。

—    用来构造Map,例如示例中的#{‘foo1‘:‘bar1‘, ‘foo2‘:‘bar2‘}。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号

$符号主要有两个方面的用途。

— 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

—  在Struts 2框架的配置文件中引用OGNL表达式,例如

1.<validators>
2.    <field name="intb">
3.            <field-validator type="int">
4.            <param name="min">10</param>
5.            <param name="max">100</param>
6.            <message>BAction-test校验:数字必须为${min}为${max}之间!</message>
7.        </field-validator>
8.    </field>
9.</validators>

OGNL表达式的使用

1.对于值栈中的对象栈使用OGNL表达式:

  读取对象栈中的属性:
      Object.propertyName  一般使用这种
      Object[‘propertyName‘]
      Object["propertyName"]
   ①、ObjectStack 里的对象可以通过一个从零开始的下标来引用.
   ②、ObjectStack 里的栈顶对象可以用 [0] 来引用, 它下面的那个对象可以用 [1] 引用.
   ③、若希望返回栈顶对象的 message 属性值:  [0].message 或 [0][“message”] 或 [0][‘message’]
   ④、若在指定的对象里没有找到指定的属性, 则到指定对象的下一个对象里继续搜索. 即 [n] 的含义是从第 n 个开始搜索, 而不是只搜索第 n 个对象
   ⑤、若从栈顶对象开始搜索, 则可以省略下标部分
   结合s:property标签:<s:property value="message"> 或 <s:property value="[0].message">

2.对于值栈中的Map栈使用OGNL表达式(parameters,request,session,application,attr):

  获取Map栈对应的属性:<s:property value="#XXX.username"/>

3.控制OGNL表达式解析或不解析

  

<!-- 此处的value也会被进行OGNL解析 -->
            <s:set name="TelNum" value="username" scope="request"></s:set><br>

只要把value="username"修改为value="‘username‘"

<!-- 必要的时候要进行OGNL强制解析%{}:进行强制解析-->

<s:a href="login.action?name=%{name}">${name}</s:a>

使用%{}可以对某个字符串进行强制解析

  

时间: 2024-10-03 13:45:38

struts2的OGNL表达式的相关文章

struts2 与 OGNL 表达式,jsp中 利用ognl 在valuestack中取值

在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是CompoundRoot中的一个元素.看下面的代码: public class UserAction { private String username; private Integer age; private boolean valid; //查看用户的详细信息 public String de

Struts2之OGNL表达式

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.Struts2框架使用OGNL作为默认 的表达式语言. 相对于EL表达式,它提供了平时我们需要的一些功能,如: 支持对象方法调用,如xxx.sayHello(); 支持类静态方法调用和常量值访问,表达式的格式为@[类全名(包括包路径)]@[方法名|值名],例如:@[email protected]('foo%s','bar')或@[email protected]_NAME;

Struts2中OGNL表达式的用法

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,能通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能. 一.为什么要使用OGNL 视图层的表达式语言通常是用来简化数据的访问操作,取代Java脚本代码,提供更清晰的视图层实现.比如,要获取user对象的age属性,利用OGNL表达式可以写成: <s:property value="user.age&

Struts2:OGNL表达式详解

OGNL用于操作ValueStack中的数据.它负责两件事.第一是在接收HTTP请求时将请求中的字符串转换成Java中的类型,比如int.String等,并赋值给ValueStack上的JavaBean,第二是在页面渲染的时候,从ValueStack中获取属性,并将Java类型转换成字符串进行输出.整个过程如下图: (侵权可删) 在HTTP的请求参数中,可以包含OGNL表达式(这就是当初Struts2爆重大漏洞的原因了). user.name=xxx表示给user属性中的name属性进行赋值.

深入分析JavaWeb 48 -- Struts2中OGNL表达式与ValueStack

一.OGNL表达式 1.OGNL表达式介绍 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作为默认的表达式语言. OGNL相对其它表达式语言具有下面几大优势: 1.支持对象方法调用,如xxx.doSomeSpecial(): 2.支持类静态的方法调用和值访问,表达式的格式: @[类全名(包括包路径)]@[方法名 | 值名],例如:@[email protected]('foo %s', '

Struts2之 OGNL表达式和值栈

技术分析之OGNL表达式概述(了解)        1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写        * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象        * 通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能.它使用相同的表达式去存取对象的属性        2. Struts2框架使用OGNL作为默认的表达式语言 

Struts2之OGNL表达式语言

1.OGNL是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能.其中OGNL用得最多的地方就是和Struts2的标签绑定,也可以在配置文件中通过${}使用OGNL表达式. 2.OGNL表达式中有几个常用的符号,下面介绍这三种符号的使用: (1).OGNL中$号的使用:第一种,可以在国际化资源文件中引用OGNL表达式.第二种,可以在st

struts2的ognl表达式语言

1,ognl,即是object  graph navigation language 2. 目的是增强数据的访问功能,增加了valuestack 的功能 3.如果需要访问的属性属于根对象,那么可以直接访问这个属性:否则,必须使用一个对象名作为前缀修饰改属性,如:#person.name 4.struts 2 也可以直接访问属性,它提供了一个属性访问器 property accessor,它自动收索stack context上面的属性,直至有属性与它对应为止 如

5.Struts2的OGNL表达式

1.创建javaweb项目Struts2_Part4_OGNL并在WebRoot下的WEB-INF下的lib文件夹下添加如下jar文件 1 commons-fileupload-1.2.1.jar 2 3 commons-io-1.3.2.jar 4 5 freemarker-2.3.15.jar 6 7 mybatis-3.2.2.jar 8 9 ognl-2.7.3.jar 10 11 ojdbc14.jar 12 13 struts2-core-2.1.8.1.jar 14 15 xwor