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)
主站蜘蛛池模板:
影音先锋在线免费观看
|
亚洲免费二区三区
|
亚洲午夜爱爱香蕉片
|
国产成人亚洲综合无
|
亚洲免费一区二区
|
亚欧乱色国产精品免费视频
|
国产精品亚洲mnbav网站
|
99re6在线视频精品免费
|
亚洲不卡av不卡一区二区
|
最近中文字幕大全中文字幕免费
|
亚洲香蕉免费有线视频
|
麻豆视频免费播放
|
亚洲av无码专区在线观看下载
|
无码区日韩特区永久免费系列
|
国产黄在线播放免费观看
|
亚洲桃色AV无码
|
3344免费播放观看视频
|
亚洲人成色777777老人头
|
国产美女无遮挡免费视频
|
a级毛片免费观看在线
|
亚洲国产国产综合一区首页
|
日韩精品无码区免费专区
|
免费看一级高潮毛片
|
亚洲AV永久无码精品成人
|
日韩免费a级毛片无码a∨
|
色爽黄1000部免费软件下载
|
亚洲伊人tv综合网色
|
日韩电影免费在线观看视频
|
久久久WWW免费人成精品
|
亚洲欧洲校园自拍都市
|
啊灬啊灬别停啊灬用力啊免费看
|
你懂的网址免费国产
|
亚洲男人天堂2022
|
国外亚洲成AV人片在线观看
|
www.免费在线观看
|
猫咪免费人成在线网站
|
亚洲理论精品午夜电影
|
亚洲人成网站18禁止一区
|
黄色网址免费大全
|
91福利免费网站在线观看
|
亚洲av无码国产综合专区
|