OGNL基础

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能

struts2标签中使用OGNL语言,这是一种类似于EL表达式、但是比EL表达式功能强大的多的语言。但是相对于其它的表达式语言如EL等,OGNL有自己的优点

1、能够访问对象的方法,例如list.size();

2、能够访问静态属性与静态方法,方法是在类名前和方法前加上@。如@java.lang.Math@PI,@java.lang.String@format(‘foo%s’,’bar’);

3、支持赋值操作和表达式串联,如赋值#value=5

4、访问OGNL上下文(OGNL context)和ActionContext(所有的servlet资源);

5、操作集合类对象。

在深入学习OGNL之前,先了解一些重要的OGNL的基本知识:

1、OGNL表达式的计算是围绕OGNL上下文进行的。OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀#key”。

2、Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>

3、Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

4、值栈(ValueStack) :可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。(有关值栈的详细内容见文章结尾)

5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL语法类似于EL,主要使用“ . ”作为操作符。例如要访问person.getCountry().getName()可以这样写:person.country.name。在访问POJO属性上,OGNL与EL表达式是完全一样的。OGNL主要有3个符号:#、 %、$,下面依次给出这3种符号的具体用法:

一、“#”声明OGNL表达式

“#”是struts2标签中最常用的符号。主要有三种用途:

1、访问非根对象(即OGNL上下为与ActionContext资源,OGNL的根对象是值栈)属性,例如#session.msg表达式,由于Struts2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext.getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(“msg”) 。

常用的“#”属性见下表:

这里写图片描述

2、用于过滤或筛选集合,例如:books.{?#this.price<20},表示所有的price<20的书。

3、构造Map,如#{'foo1':'bar1','foo2':'bar2'}

二、“%”显式声明OGNL表达式

“%”类似于javascript中的eval,用途:在标识属性为字符串类型的同时计算OGNL表达式的值。某些标签中既能接受字符串,又能接受OGNL表达式,这时候,标有“%”的被当作OGNL表达式并被执行,没有标”%“的被当作普通字符串。例如:

<!-- 参数为普通字符串-->
<struts:label label="#request.account"></struts:label>

<!-- 用%表示参数为OGNL表达式-->
<struts:label label="%{#request.account}"></struts:label>

第一行代码会输出字符串#request.account,而第二行会输出request的account属性。

三、“$”在资源文件中引用OGNL表达式

$主要用于在资源国际化文件中或者在struts.xml中引用OGNL表达式。

Resources.properties

validation.require=${getText(fieldName)} is required

struts.xml

<action name="AddPhoto" class="addPhoto">  <!-- 配置action -->
            <result type="redirect">ListPhotos.action?albumId=${albumId}</result> <!-- 重定向结果 -->
</action>

附注:

值栈

ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。

在Action中获得ValueStack对象:

ActionContext.getContext().getValueStack()

1、Top语法

使用Top获取值栈中的第二个对象:

<s:property value="[1].top.对象"/>

2、 N语法

使用N获取值栈中的第二个对象:

<s:property value="[1].对象"/>

3、@语法

调用action中的静态方法:<s:property value="@vs1@静态方法"/> (vs1:值栈 1,表示第一个)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值