Terry Zou
BlogJava
首頁
新隨筆
聯(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),大概可以理解為:對象圖形化導(dǎo)航語言。是一種可以方便地操作對象屬性的開源表達(dá)式語言。OGNL有如下特點(diǎn):
1
、支持對象方法調(diào)用,形式如:objName.methodName();
2
、支持類靜態(tài)的方法調(diào)用和值訪問,表達(dá)式的格式為@[類全名(包括包路)]@[方法名
|
值名],例如:
@java
.lang.String
@format
(
'foo
%s'
,
'bar'
)或
@tutorial
.MyConstant
@APP_NAME
;
3
、支持賦值操作和表達(dá)式串聯(lián),例如:
price=
100
,
discount=
0.8
,
calculatePrice(),這個表達(dá)式會返回
80
;
4
、訪問OGNL上下文(OGNL
context)和ActionContext;
5
、操作集合對象。
二、使用OGNL表達(dá)式
OGNL要結(jié)合struts標(biāo)簽來使用。由于比較靈活,也容易把人給弄暈,尤其是“%”、“#”、“$”這三個符號的使用。由于$廣泛應(yīng)用于EL中,這里重點(diǎn)寫%和#符號的用法。
1
、“#”符號有三種用途:
(
1
)、訪問非根對象(struts中值棧為根對象)如OGNL上下文和Action上下文,#相當(dāng)于ActionContext.getContext();下表有幾個ActionContext中有用的屬性:
名稱
作用
例子
parameters
包含當(dāng)前HTTP請求參數(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順序訪問其屬性(attribute),#attr.userName相當(dāng)于按順序在以上三個范圍(scope)內(nèi)讀取userName屬性,直到找到為止。用于過濾和投影(projecting)集合,如books.{?#
this
.price<
100
};構(gòu)造Map,如#{
'foo1'
:
'bar1'
,
'foo2'
:
'bar2'
}。
(
2
)、用于過濾和投影(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)簽賦值上。如果要在頁面中取一個map的值可以這樣寫:
<s:property
value=
"#myMap['foo1']"
/>
<s:property
value=
"#myMap['foo1']"
/>
2
、“%”符號的用途是在標(biāo)簽的屬性值被理解為字符串類型時,告訴執(zhí)行環(huán)境%{}里的是OGNL表達(dá)式。
這是一開始最讓我不能理解的符號,原因是一些相關(guān)資源在表述時不太準(zhǔn)備,經(jīng)過一翻痛苦的探索,終于明白了它的用途。實際上就是讓被理解為字符串的表達(dá)式,被真正當(dāng)成ognl來執(zhí)行。很有點(diǎn)類似javascript里面的eval_r()功能,例如
:
var
oDiv
=
eval_r(
"document.all.div"
+index)
var
oDiv
=
eval_r(
"document.all.div"
+index)
當(dāng)index變量為
1
時,語句就會被當(dāng)作var
oDiv
=
document.all.div1
var
oDiv
=
document.all.div1來執(zhí)行。%{}就是起這個作用。舉例:
<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里不同的標(biāo)簽對ognl的表達(dá)式的理解是不一樣的。如果當(dāng)有的標(biāo)簽“看不懂”類似“#myMap[
'key1'
]”的語句時,就要用%{}來把這括進(jìn)去,“翻譯”一下了。
3
、“$”有兩種用途
(
1
)、在國際化資源文件中,引用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
閱讀(157)
評論(0)
編輯
收藏
所屬分類:
struts2.1.6
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
struts自定義標(biāo)簽
設(shè)置文件默認(rèn)的打開方式
OGNL表達(dá)式struts2標(biāo)簽“%,#,$”
Copyright ©2025 Terry Zou Powered By:
博客園
模板提供:
滬江博客
<
2025年7月
>
日
一
二
三
四
五
六
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
8
9
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(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環(huán)境,運(yùn)行React項目
2.?Spring @PostConstruct 、@Autowired和Construct 順序
3.?Spring中的ApplicationListener的使用詳解案例(觀察者模式)
4.?@SpringBootApplication的使用
5.?服務(wù)器連接
6.?ffg
7.?abe
8.?abd
9.?abc
10.?Android之Activity的四種啟動模式
最新評論
1.?re: Android JSON的簡單例子
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--JSON.COM
2.?re: androidpn(本文服務(wù)器為tomcat)
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--Deepak Singh
閱讀排行榜
1.?androidpn(本文服務(wù)器為tomcat)(5217)
2.?Web項目Spring+hibernate+Spring mvc簡單的添刪改查(4160)
3.?如何使用log4j打印日志并保存日志(3442)
4.?HttpClient連接服務(wù)器(方法有很多,我只寫HttpPost,接收數(shù)據(jù),傳輸數(shù)據(jù)都為json形式)(3380)
5.?配置數(shù)據(jù)源(mysql)(3087)
評論排行榜
1.?Android JSON的簡單例子(1)
2.?androidpn(本文服務(wù)器為tomcat)(1)
3.?Runtime.getRuntime().addShutdownHook((0)
4.?setDaemon(0)
5.?PendingIntent(0)
主站蜘蛛池模板:
亚洲人成人无码网www电影首页
|
亚洲人成网站色在线入口
|
亚洲VA中文字幕不卡无码
|
一级做a爰片久久毛片免费陪
|
热99re久久免费视精品频软件
|
亚洲国产精品yw在线观看
|
亚洲综合丁香婷婷六月香
|
亚洲最大免费视频网
|
国产婷婷高清在线观看免费
|
亚洲精品高清国产一线久久
|
aaa毛片免费观看
|
国产大片91精品免费观看不卡
|
四只虎免费永久观看
|
亚洲一本大道无码av天堂
|
欧洲精品码一区二区三区免费看
|
www亚洲精品少妇裸乳一区二区
|
特级毛片全部免费播放a一级
|
成人伊人亚洲人综合网站222
|
无遮挡免费一区二区三区
|
在线亚洲午夜理论AV大片
|
国产成人AV片无码免费
|
亚洲国产成人精品91久久久
|
一级毛片正片免费视频手机看
|
亚洲色成人WWW永久网站
|
国产一精品一AV一免费
|
亚洲女人影院想要爱
|
性盈盈影院免费视频观看在线一区
|
亚洲精品第一国产综合亚AV
|
av大片在线无码免费
|
精品亚洲成A人无码成A在线观看
|
国产卡二卡三卡四卡免费网址
|
亚洲综合激情九月婷婷
|
全免费a级毛片免费看
|
亚洲精品视频在线观看视频
|
成年女人免费视频播放77777
|
亚洲狠狠婷婷综合久久久久
|
8x8x华人永久免费视频
|
亚洲大尺度无码专区尤物
|
69式互添免费视频
|
粉色视频成年免费人15次
|
亚洲av永久无码精品国产精品
|