Terry Zou
BlogJava
首页
新随笔
联系
聚合
管理
posts - 93, comments - 2, trackbacks - 0
OGNL表达式struts2标签“%,#,$”
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 2012-03-20 17:07
Terry Zou
阅读(146)
评论(0)
编辑
收藏
所属分类:
struts2.1.6
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
struts自定义标签
设置文件默认的打开方式
OGNL表达式struts2标签“%,#,$”
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
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
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
Android(49)
Androidpn(2)
hibernate(1)
Https(1)
JavaCard(3)
jQuery(6)
netty
NFC(1)
react框架(1)
spring(2)
SpringBoot(1)
Tomcat+Eclipse(18)
WebService(2)
一些心得(1)
随笔档案
2020年4月 (4)
2015年7月 (5)
2015年6月 (6)
2015年5月 (4)
2015年4月 (3)
2015年3月 (1)
2015年2月 (1)
2015年1月 (4)
2014年12月 (1)
2014年11月 (2)
2014年10月 (2)
2014年9月 (2)
2014年5月 (5)
2014年3月 (3)
2014年2月 (2)
2014年1月 (8)
2013年12月 (2)
2013年7月 (2)
2013年6月 (4)
2013年5月 (16)
2012年7月 (1)
2012年3月 (2)
2011年7月 (6)
文章分类
struts2.1.6(3)
文章档案
2020年4月 (1)
2012年3月 (3)
相册
my angel
收藏夹
Java
Java
搜索
最新随笔
1. 搭建React环境,运行React项目
2. Spring @PostConstruct 、@Autowired和Construct 顺序
3. Spring中的ApplicationListener的使用详解案例(观察者模式)
4. @SpringBootApplication的使用
5. 服务器连接
6. ffg
7. abe
8. abd
9. abc
10. Android之Activity的四种启动模式
最新评论
1. re: Android JSON的简单例子
评论内容较长,点击标题查看
--JSON.COM
2. re: androidpn(本文服务器为tomcat)
评论内容较长,点击标题查看
--Deepak Singh
阅读排行榜
1. androidpn(本文服务器为tomcat)(5200)
2. Web项目Spring+hibernate+Spring mvc简单的添删改查(4143)
3. 如何使用log4j打印日志并保存日志(3426)
4. HttpClient连接服务器(方法有很多,我只写HttpPost,接收数据,传输数据都为json形式)(3374)
5. 配置数据源(mysql)(3049)
评论排行榜
1. Android JSON的简单例子(1)
2. androidpn(本文服务器为tomcat)(1)
3. Runtime.getRuntime().addShutdownHook((0)
4. setDaemon(0)
5. PendingIntent(0)