OGNL中$、%、#、{}、^、$ 标签的使用简介

jopen 8年前

Struts2ActionContext是来自于Ognl的上下文,是OGNL的一个增强,在Struts2Context的根对象就是Action。因为只有根对象时可以直接访问的,不需要加任何标记,比如request,session,application这些对象在访问时都不需要加#号。OGNL中$、%、#、{}、^、$ 标签的使用简介

OGNL$号的使用
1..在国际化资源文件中,引用OGNL表达式
2..struts.xml文件中,引用OGNL表达式

 

OGNL%号的使用

“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。 

这个类似js中的eval,很暴力。 

1..使用%{}可以取出保存在值堆栈中的Action对象,直接调用它的方法
2..如果Action继承了ActionSupport,那么在页面标签中可以使用%{getText('key')}获取国际化信息

 

OGNL#号的使用
OGNL
中的#号可以取出堆栈上下文中存放的对象

名称

作用

例子

attr

用于按request>>session>>application顺序访问其属性

#attr.userName相当于按顺序从三个范围读取userName属性直到找到为止

request

包含当前HttpServletRequest的属性的Map

#request.userName相当于request.getAttribute("userName")

session

包含当前HttpSession的属性的Map

#session.userName相当于session.getAttribute("userName")

application

包含当前应用的ServletContext的属性的Map

#application.userName相当于application.getAttribute("userName")

parameters

包含当前HTTP请求参数的Map

#parameters.id[0]相当于request.getParameter("id")

 

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

— 、访问非根对象属性,例如#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'}。

 

利用投影获取属性
利用投影获取List中对象的username属性时,其中{}表示的是一个集合
stus.{username}就表示将suts中所有的username属性取出组成一个新的列表

 

利用选择获取属性

OGNL表达式是很灵活的,可以同时使用选择技术投影技术获取属性
使用选择技术时,#this代表当前元素,问号?是把所有满足条件的元素都取出来。
上箭头^是开始的意思,即取符合条件的数据索引中第一条数据,所以stus.{^#this.grade>=60}.{username}输出的是[张三]
注意,此时输出文本中包含中括号,这表示它是一个列表。
stus.{?#this.grade>=60}.{username}[0]输出的是张三,是字符串,二者是不同的。
美元符号$是结束的意思,即取符合条件的数据索引中最后一条数据,所以stus.{$#this.grade>=60}.{username}输出的是[王五]
这三个符号:问号、上箭头、美元符所返回的都是List

 

另符两语法:

使用Top语法获取值栈中的第二个对象的属性:<s:property value="[1].top.username"/>

使用 N 语法获取值栈中的第二个对象的属性:<s:propertyvalue="[1].username"/>