Terry Zou
BlogJava
首頁(yè)
新隨筆
聯(lián)系
聚合
管理
posts - 93, comments - 2, trackbacks - 0
OGNL表達(dá)式struts2標(biāo)簽“%,#,$”
OGNL表達(dá)式struts2標(biāo)簽“%,#,$”
一、什么是OGNL,有什么特點(diǎn)?
OGNL(Object-Graph
Navigation
Language),大概可以理解為:對(duì)象圖形化導(dǎo)航語(yǔ)言。是一種可以方便地操作對(duì)象屬性的開(kāi)源表達(dá)式語(yǔ)言。OGNL有如下特點(diǎn):
1
、支持對(duì)象方法調(diào)用,形式如:objName.methodName();
2
、支持類(lèi)靜態(tài)的方法調(diào)用和值訪問(wèn),表達(dá)式的格式為@[類(lèi)全名(包括包路)]@[方法名
|
值名],例如:
@java
.lang.String
@format
(
'foo
%s'
,
'bar'
)或
@tutorial
.MyConstant
@APP_NAME
;
3
、支持賦值操作和表達(dá)式串聯(lián),例如:
price=
100
,
discount=
0.8
,
calculatePrice(),這個(gè)表達(dá)式會(huì)返回
80
;
4
、訪問(wèn)OGNL上下文(OGNL
context)和ActionContext;
5
、操作集合對(duì)象。
二、使用OGNL表達(dá)式
OGNL要結(jié)合struts標(biāo)簽來(lái)使用。由于比較靈活,也容易把人給弄暈,尤其是“%”、“#”、“$”這三個(gè)符號(hào)的使用。由于$廣泛應(yīng)用于EL中,這里重點(diǎn)寫(xiě)%和#符號(hào)的用法。
1
、“#”符號(hào)有三種用途:
(
1
)、訪問(wèn)非根對(duì)象(struts中值棧為根對(duì)象)如OGNL上下文和Action上下文,#相當(dāng)于ActionContext.getContext();下表有幾個(gè)ActionContext中有用的屬性:
名稱(chēng)
作用
例子
parameters
包含當(dāng)前HTTP請(qǐng)求參數(shù)的Map
#parameters.id[
0
]作用相當(dāng)于request.getParameter(
"id"
)
request
包含當(dāng)前HttpServletRequest的屬性(attribute)的Map
#request.userName相當(dāng)于request.getAttribute(
"userName"
)
session
包含當(dāng)前HttpSession的屬性(attribute)的Map
#session.userName相當(dāng)于session.getAttribute(
"userName"
)
application
包含當(dāng)前應(yīng)用的ServletContext的屬性(attribute)的Map
#application.userName相當(dāng)于application.getAttribute(
"userName"
)
注:attr
用于按request
>
session
>
application順序訪問(wèn)其屬性(attribute),#attr.userName相當(dāng)于按順序在以上三個(gè)范圍(scope)內(nèi)讀取userName屬性,直到找到為止。用于過(guò)濾和投影(projecting)集合,如books.{?#
this
.price<
100
};構(gòu)造Map,如#{
'foo1'
:
'bar1'
,
'foo2'
:
'bar2'
}。
(
2
)、用于過(guò)濾和投影(projecting)集合,如:
books.{?#
this
.price>
35
}
books.{?#
this
.price>
35
}
(
3
)、構(gòu)造Map,如:
#{
'foo1'
:
'bar1'
,
'foo2'
:
'bar2'
}
#{
'foo1'
:
'bar1'
,
'foo2'
:
'bar2'
}這種方式常用在給radio或select、checkbox等標(biāo)簽賦值上。如果要在頁(yè)面中取一個(gè)map的值可以這樣寫(xiě):
<s:property
value=
"#myMap['foo1']"
/>
<s:property
value=
"#myMap['foo1']"
/>
2
、“%”符號(hào)的用途是在標(biāo)簽的屬性值被理解為字符串類(lèi)型時(shí),告訴執(zhí)行環(huán)境%{}里的是OGNL表達(dá)式。
這是一開(kāi)始最讓我不能理解的符號(hào),原因是一些相關(guān)資源在表述時(shí)不太準(zhǔn)備,經(jīng)過(guò)一翻痛苦的探索,終于明白了它的用途。實(shí)際上就是讓被理解為字符串的表達(dá)式,被真正當(dāng)成ognl來(lái)執(zhí)行。很有點(diǎn)類(lèi)似javascript里面的eval_r()功能,例如
:
var
oDiv
=
eval_r(
"document.all.div"
+index)
var
oDiv
=
eval_r(
"document.all.div"
+index)
當(dāng)index變量為
1
時(shí),語(yǔ)句就會(huì)被當(dāng)作var
oDiv
=
document.all.div1
var
oDiv
=
document.all.div1來(lái)執(zhí)行。%{}就是起這個(gè)作用。舉例:
<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
行會(huì)在頁(yè)面上輸出“value1”,而第
3
行則會(huì)輸出
"#myMap['key1']"
這么一個(gè)字符串。
如果將第
3
行改寫(xiě)成這樣:
<s:url
value=
"%{#myMap['key1']}"
/>
<s:url
value=
"%{#myMap['key1']}"
/>
則輸出為“value1”。
這說(shuō)明struts2里不同的標(biāo)簽對(duì)ognl的表達(dá)式的理解是不一樣的。如果當(dāng)有的標(biāo)簽“看不懂”類(lèi)似“#myMap[
'key1'
]”的語(yǔ)句時(shí),就要用%{}來(lái)把這括進(jìn)去,“翻譯”一下了。
3
、“$”有兩種用途
(
1
)、在國(guó)際化資源文件中,引用OGNL表達(dá)式。
(
2
)、在Struts
2
配置文件中,引用OGNL表達(dá)式:
<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
閱讀(150)
評(píng)論(0)
編輯
收藏
所屬分類(lèi):
struts2.1.6
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
struts自定義標(biāo)簽
設(shè)置文件默認(rèn)的打開(kāi)方式
OGNL表達(dá)式struts2標(biāo)簽“%,#,$”
Copyright ©2025 Terry Zou Powered By:
博客園
模板提供:
滬江博客
<
2025年5月
>
日
一
二
三
四
五
六
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
7
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(2)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類(lèi)
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)
文章分類(lèi)
struts2.1.6(3)
文章檔案
2020年4月 (1)
2012年3月 (3)
相冊(cè)
my angel
收藏夾
Java
Java
搜索
最新隨筆
1.?搭建React環(huán)境,運(yùn)行React項(xiàng)目
2.?Spring @PostConstruct 、@Autowired和Construct 順序
3.?Spring中的ApplicationListener的使用詳解案例(觀察者模式)
4.?@SpringBootApplication的使用
5.?服務(wù)器連接
6.?ffg
7.?abe
8.?abd
9.?abc
10.?Android之Activity的四種啟動(dòng)模式
最新評(píng)論
1.?re: Android JSON的簡(jiǎn)單例子
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--JSON.COM
2.?re: androidpn(本文服務(wù)器為tomcat)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--Deepak Singh
閱讀排行榜
1.?androidpn(本文服務(wù)器為tomcat)(5208)
2.?Web項(xiàng)目Spring+hibernate+Spring mvc簡(jiǎn)單的添刪改查(4149)
3.?如何使用log4j打印日志并保存日志(3432)
4.?HttpClient連接服務(wù)器(方法有很多,我只寫(xiě)HttpPost,接收數(shù)據(jù),傳輸數(shù)據(jù)都為json形式)(3376)
5.?配置數(shù)據(jù)源(mysql)(3069)
評(píng)論排行榜
1.?Android JSON的簡(jiǎn)單例子(1)
2.?androidpn(本文服務(wù)器為tomcat)(1)
3.?Runtime.getRuntime().addShutdownHook((0)
4.?setDaemon(0)
5.?PendingIntent(0)
主站蜘蛛池模板:
亚洲国产精品一区二区第一页
|
永久免费的网站在线观看
|
中文毛片无遮挡高清免费
|
无码的免费不卡毛片视频
|
日本高清不卡中文字幕免费
|
久久亚洲AV成人无码国产电影
|
亚洲一区二区三区国产精华液
|
亚洲欧洲日韩国产一区二区三区
|
性xxxx黑人与亚洲
|
亚洲最大的成人网
|
春暖花开亚洲性无区一区二区
|
国产精品亚洲一区二区无码
|
青青草国产免费久久久91
|
免费电视剧在线观看
|
午夜精品在线免费观看
|
免费国产高清视频
|
亚洲综合另类小说色区色噜噜
|
亚洲人成伊人成综合网久久久
|
亚洲色成人中文字幕网站
|
亚洲国产高清视频
|
亚洲AV无码国产精品色
|
亚洲AV无码专区在线电影成人
|
久久久久久亚洲AV无码专区
|
亚洲麻豆精品果冻传媒
|
久久精品国产亚洲av麻豆蜜芽
|
亚洲丁香婷婷综合久久
|
黄页网站在线免费观看
|
在线观看免费黄网站
|
**一级毛片免费完整视
|
最近最好的中文字幕2019免费
|
国产午夜鲁丝片AV无码免费
|
亚洲日韩国产一区二区三区
|
亚洲国产成人精品无码区在线观看
|
久久成人免费电影
|
久九九精品免费视频
|
国产在线不卡免费播放
|
亚洲愉拍99热成人精品热久久
|
国产一级淫片a免费播放口之
|
日韩免费视频观看
|
亚洲精品无码久久一线
|
亚洲人成网站在线观看播放动漫
|