我心飞翔
慢慢的度过
BlogJava
首页
新随笔
联系
聚合
管理
随笔-200 评论-148 文章-15 trackbacks-0
OGNL表达式struts2标签“%,#,$”
一、什么是OGNL,有什么特点?
OGNL(Object-Graph
Navigation
Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:
1
、支持对象方法调用,形式如:objName.methodName();
2
、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名
|
值名],例如:
@java
.lang.String
@format
(
'foo
%s'
,
'bar'
)或
@tutorial
.MyConstant
@APP_NAME
;
3
、支持赋值操作和表达式串联,例如:
price=
100
,
discount=
0.8
,
calculatePrice(),这个表达式会返回
80
;
4
、访问OGNL上下文(OGNL
context)和ActionContext;
5
、操作集合对象。
二、使用OGNL表达式
OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。
1
、“#”符号有三种用途:
(
1
)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
名称
作用
例子
parameters
包含当前HTTP请求参数的Map
#parameters.id[
0
]作用相当于request.getParameter(
"id"
)
request
包含当前HttpServletRequest的属性(attribute)的Map
#request.userName相当于request.getAttribute(
"userName"
)
session
包含当前HttpSession的属性(attribute)的Map
#session.userName相当于session.getAttribute(
"userName"
)
application
包含当前应用的ServletContext的属性(attribute)的Map
#application.userName相当于application.getAttribute(
"userName"
)
注:attr
用于按request
>
session
>
application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#
this
.price<
100
};构造Map,如#{
'foo1'
:
'bar1'
,
'foo2'
:
'bar2'
}。
(
2
)、用于过滤和投影(projecting)集合,如:
books.{?#
this
.price>
35
}
books.{?#
this
.price>
35
}
(
3
)、构造Map,如:
#{
'foo1'
:
'bar1'
,
'foo2'
:
'bar2'
}
#{
'foo1'
:
'bar1'
,
'foo2'
:
'bar2'
}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:
<s:property
value=
"#myMap['foo1']"
/>
<s:property
value=
"#myMap['foo1']"
/>
2
、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如
:
var
oDiv
=
eval_r(
"document.all.div"
+index)
var
oDiv
=
eval_r(
"document.all.div"
+index)
当index变量为
1
时,语句就会被当作var
oDiv
=
document.all.div1
var
oDiv
=
document.all.div1来执行。%{}就是起这个作用。举例:
<s:set
name=
"myMap"
value=
"#{'key1':'value1','key2':'value2'}"
/>
<s:property
value=
"#myMap['key1']"
/>
<s:url
value=
"#myMap['key1']"
/>
<s:set
name=
"myMap"
value=
"#{'key1':'value1','key2':'value2'}"
/>
<s:property
value=
"#myMap['key1']"
/>
<s:url
value=
"#myMap['key1']"
/>
上面的代码第
2
行会在页面上输出“value1”,而第
3
行则会输出
"#myMap['key1']"
这么一个字符串。
如果将第
3
行改写成这样:
<s:url
value=
"%{#myMap['key1']}"
/>
<s:url
value=
"%{#myMap['key1']}"
/>
则输出为“value1”。
这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap[
'key1'
]”的语句时,就要用%{}来把这括进去,“翻译”一下了。
3
、“$”有两种用途
(
1
)、在国际化资源文件中,引用OGNL表达式。
(
2
)、在Struts
2
配置文件中,引用OGNL表达式:
<action
name=
"saveUser"
class
=
"userAction"
method=
"save"
>
<result
type=
"redirect"
>listUser.action?msg=${msg}</result>
</action>
<action
name=
"saveUser"
class
=
"userAction"
method=
"save"
>
<result
type=
"redirect"
>listUser.action?msg=${msg}</result>
</action>
posted on 2010-10-28 10:25
无声
阅读(78750)
评论(6)
编辑
收藏
所属分类:
职场生活
评论:
#
re: OGNL表达式struts2标签“%,#,$” 2010-12-31 11:25 |
383392964
能否为:<result type="${result}">listUser.action?msg=${msg}</result>
QQ:383392964,qqE-mail我,谢谢啦
回复
更多评论
#
re: OGNL表达式struts2标签“%,#,$” 2013-03-01 16:31 |
9
1234567890
回复
更多评论
#
re: OGNL表达式struts2标签“%,#,$” 2013-06-19 11:27 |
asda
dasds
回复
更多评论
#
re: OGNL表达式struts2标签“%,#,$”[未登录] 2014-04-14 23:29 |
等待
顶顶顶
回复
更多评论
#
re: OGNL表达式struts2标签“%,#,$” 2014-05-29 14:18 |
路飞
不错,讲的很详细!
回复
更多评论
#
是[未登录]
2014-09-04 08:51 |
dd
很好
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
kettle ETL java 调用 kettle job 或 transfer
转win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法
Java 获取当前日期和时间
清除目录下的SVN信息
Linux下使用gzip压缩与解压文件
Linux 下ftp自动登录
struts1.x防止重复提交
C#正则表达式小结
jbpm4 java.lang.LinkageError: loader constraint violation 包冲突
c#web定时任务
道可道非常道,名可名非常名
<
2010年10月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(5)
给我留言
查看公开留言
查看私人留言
我参与的团队
JLive开发团队(0/0)
随笔分类
(174)
回归自然(9)
职场生活(165)
随笔档案
(200)
2014年3月 (2)
2014年1月 (1)
2013年9月 (2)
2013年2月 (1)
2013年1月 (2)
2012年8月 (1)
2012年6月 (1)
2012年1月 (1)
2011年12月 (1)
2010年12月 (3)
2010年11月 (10)
2010年10月 (12)
2010年9月 (3)
2010年8月 (5)
2010年7月 (3)
2010年6月 (3)
2010年5月 (1)
2010年4月 (1)
2010年2月 (2)
2010年1月 (2)
2009年11月 (1)
2009年8月 (1)
2009年3月 (3)
2009年2月 (7)
2008年12月 (1)
2008年11月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (4)
2008年6月 (8)
2008年5月 (4)
2008年4月 (4)
2008年2月 (2)
2008年1月 (9)
2007年12月 (11)
2007年11月 (1)
2007年10月 (6)
2007年9月 (1)
2007年8月 (2)
2007年7月 (1)
2007年6月 (1)
2007年5月 (6)
2007年4月 (6)
2006年12月 (9)
2006年11月 (7)
2006年10月 (9)
2006年9月 (5)
2006年7月 (12)
2006年6月 (14)
文章分类
(20)
AJAX(3)
Ant(1)
Delphi(1)
Eclipse(1)
Hibernate(3)
java共享代码(5)
JBOSS(1)
JSF
linux(4)
Oracle(1)
Spring
sqlserver2000
Struts
Tapestry
webspehre
文章档案
(15)
2007年6月 (2)
2006年11月 (1)
2006年10月 (5)
2006年6月 (7)
收藏夹
共享代码
开源网站
ajax中国
finereport
hibernate
Java开源大全
java技术论坛
java论坛
java论坛
用户名parable
linux伊甸园
luanyong
oracle下载
oracle资源
Struts插件
这个插件功能强大,包括JSF,struts,hibernate等
unix论坛
开源力量社区
源程序网站
资料中心
资源网站
parable
朋友博客
东东男
我的博客
最新随笔
1. kettle ETL java 调用 kettle job 或 transfer
2. etl一个例子
3. 论坛
4. Spring 3.2.4源码编译
5. 转win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法
6. crontab配置详解
7. 将JSON转换成MAP的工具类
8. Java 获取当前日期和时间
9. 清除目录下的SVN信息
10. Symantec 卸载密码方法
搜索
最新评论
1. re: 拦截器底层实现原理
政治
--ttt
2. re: js动态修改表格
454545
--35454
3. re: ajax局部刷新
jkkhhhl
--34
4. re: 将JSON转换成MAP的工具类
v instanceof JSONArray 这段代码有问题
需要对
List<String>做处理
--丹丹
5. re: 将JSON转换成MAP的工具类
评论内容较长,点击标题查看
--丹丹
阅读排行榜
1. OGNL表达式struts2标签“%,#,$”(78750)
2. linux 设置系统语言(44858)
3. Java 获取当前日期和时间(40375)
4. Linux下使用gzip压缩与解压文件(30890)
5. 将JSON转换成MAP的工具类(22031)
评论排行榜
1. RHEL 5 Install Number(16)
2. ajax局部刷新(8)
3. RHEL4-U3-i386-AS下载地址(7)
4. 将JSON转换成MAP的工具类(7)
5. OGNL表达式struts2标签“%,#,$”(6)