ValueStack基礎:OGNL

ValueStack基礎:OGNL

要了解ValueStack,必須先理解OGNL(Object Graphic Navigatino Language)!

OGNL是Struts2中使用的一種表達式語言,它可以用于JSP的標簽庫中,以便能夠方便的訪問各種對象的屬性;它用于界面將參數傳遞到Action(并進行類型轉換)中;它還可以用于struts2的配置文件中!所以,非常有必要理解OGNL的基本機制。

?

Root對象

OGNL稱為對象圖導航語言。所謂對象圖,即以任意一個對象為根,通過OGNL可以訪問與這個對象關聯的其它對象。如:

package?cn.com.leadfar.struts2.actions;

?

public?class?User {

????private?String?username;

????private?Group?group;

???

????public?String getUsername() {

???????return?username;

????}

????public?void?setUsername(String username) {

???????this.username?= username;

????}

???

????public?Group getGroup() {

???????return?group;

????}

????public?void?setGroup(Group group) {

???????this.group?= group;

????}

}

?

package?cn.com.leadfar.struts2.actions;

?

public?class?Group {

????private?String?name;

????private?Organization?org;

????public?String getName() {

???????return?name;

????}

?

????public?void?setName(String name) {

???????this.name?= name;

????}

?

????public?Organization getOrg() {

???????return?org;

????}

?

????public?void?setOrg(Organization org) {

???????this.org?= org;

????}

}

?

package?cn.com.leadfar.struts2.actions;

?

public?class?Organization {

????private?String?orgId;

?

????public?String getOrgId() {

???????return?orgId;

????}

?

????public?void?setOrgId(String orgId) {

???????this.orgId?= orgId;

????}

}

?

?

上面三個類,描述了通過一個User對象,可以導航到Group對象,進而導航到Organization對象,以User對象為根,一個對象圖如下所示:

?

User(root)

???-- username

???-- group

??????-- name

??????-- org

?????????-- orgId

?

在真實的環境下,這個對象圖可能會極其復雜,但是通過基本的getters方法,都應該能夠訪問到某個對象的其它關聯對象。【對象圖的導航,必須通過getters方法進行導航

?

下述代碼將創建一個User對象,及其相關的一系列對象:

???????User user =?new?User();

???????Group g =?new?Group();

???????Organization o =?new?Organization();

????????o.setOrgId("ORGID");

???????g.setOrg(o);

???????user.setGroup(g);

?

如果通過JAVA代碼來進行導航(依賴于getters方法),導航到Organization的orgId屬性,如下所示:

?

//用JAVA來導航訪問

user.getGroup().getOrg().getOrgId();

?

?

【注意:導航的目的,是為了獲取某個對象的值或設置某個對象的值或調用某個對象的方法!】

【注意:OGNL表達式語言的真正目的,是為了在那些不能寫JAVA代碼的地方執行JAVA代碼,或者是為了更方便地執行JAVA代碼】

?

利用OGNL進行導航的代碼如下:

?

???????//利用OGNL表達式訪問

???????String value = (String)Ognl.getValue("group.org.orgId", user);

?

Ognl.getValue()方法的第一個參數,就是一條OGNL表達式,第二個參數是指定在表達式中需要用到的root對象!

完整代碼如下:

????public?void?testOgnl01()?throws?Exception{

???????User user =?new?User();

???????user.setUsername("張三");

??????

???????//利用OGNL表達式訪問user對象的username屬性

???????String value = (String)Ognl.getValue("username", user);

???????log(value);

????}

???

????public?void?testOgnl02()?throws?Exception{

???????User user =?new?User();

???????Group g =?new?Group();

???????Organization o =?new?Organization();

???????o.setOrgId("ORGID");

???????g.setOrg(o);

???????user.setGroup(g);

??????

???????//用JAVA來導航訪問

???????log(user.getGroup().getOrg().getOrgId());

??????

???????//利用OGNL表達式訪問

???????String value = (String)Ognl.getValue("group.org.orgId", user);

???????log(value);

????}

???

????public?void?testOgnl03()?throws?Exception{

???????User user =?new?User();

???????Group g =?new?Group();

???????Organization o =?new?Organization();

???????o.setOrgId("ORGID");

???????g.setOrg(o);

???????user.setGroup(g);

??????

???????//用JAVA來導航訪問

???????log(user.getGroup().getOrg().getOrgId());

??????

???????//也可以在表達式中使用#root來代表root對象

???????String value = (String)Ognl.getValue("#root.group.org.orgId", user);

???????log(value);

????}

????private?void?log(Object o){

???????System.out.println(o);

????}

?

?

Context對象

在OGNL的表達式中,有可能需要訪問到多個毫不相干的對象,這時候,我們需要給OGNL傳遞一個Map類型的對象,把表達式中需要用到的對象放到Map中即可!這個Map對象,稱為context。

?

要在表達式中訪問到context中的對象,需要使用“#對象名稱”的語法規則。

如:

????public?void?testOgnl04()?throws?Exception{

???????User user =?new?User();

???????user.setUsername("張三");

???????Group g =?new?Group();

???????Organization o =?new?Organization();

???????o.setOrgId("ORGID");

???????g.setOrg(o);

???????user.setGroup(g);

??????

???????User user2 =?new?User();

???????user2.setUsername("李四");

??????

???????/**

????????*?所謂context其實就是一個Map類型的對象。主要是因為在OGNL中,不支持多個root對象,那么

????????*?如果需要在表達式中訪問更多毫不相干的對象時,只能通過一個Map來把這些對象統一傳遞給OGNL。

????????*/

???????Map context =?new?HashMap();

???????context.put("u1", user);

???????context.put("u2", user2);

??????

???????//在表達式中需通過“#+對象的名稱”來訪問context中的對象

???????//如果表達式中沒有用到root對象,那么可以用任意一個對象代表root對象!

???????String value = (String)Ognl.getValue("#u1.username + ',' + #u2.username", context,new?Object());

???????log(value);

????}

???

????public?void?testOgnl05()?throws?Exception{

???????User user =?new?User();

???????user.setUsername("張三");

???????Group g =?new?Group();

???????Organization o =?new?Organization();

???????o.setOrgId("ORGID");

???????g.setOrg(o);

???????user.setGroup(g);

??????

???????User user2 =?new?User();

???????user2.setUsername("李四");

??????

???????User user3 =?new?User();

???????user3.setUsername("王五");

??????

???????Map context =?new?HashMap();

???????context.put("u1", user);

???????context.put("u2", user2);

??????

???????//給OGNL傳遞root對象及context對象,以便解釋對應的表達式

???????String value = (String)Ognl.getValue("#u1.username + ',' + #u2.username + ',' + username", context,user3);

???????log(value);

????}

?

利用OGNL表達式進行賦值

?

OGNL表達式也可以用于賦值操作。

????public?void?testOgnl06()?throws?Exception{

???????User user =?new?User();

??????

???????//調用setValue()方法來進行賦值

???????//第一個參數:OGNL表達式

???????//第二個參數:root對象

???????//第三個參數:要賦的值?????

???????Ognl.setValue("username", user,?"張三");

?

???????log(user.getUsername());

????}

???

????public?void?testOgnl07()?throws?Exception{

???????User user =?new?User();

??????

???????Map context =?new?HashMap();

???????context.put("u", user);

??????

???????//調用setValue()方法來進行賦值

???????//第一個參數:OGNL表達式

???????//第二個參數:context對象

????????//第三個參數:root對象

???????//第四個參數:要賦的值

???????Ognl.setValue("#u.username", context,?new?Object(),?"張三");

?

???????log(user.getUsername());

????}

???

????public?void?testOgnl08()?throws?Exception{

???????User user =?new?User();

??????

???????Map context =?new?HashMap();

???????context.put("u", user);

???????

???????//利用賦值符號"="來進行賦值

???????Ognl.getValue("#u.username = '李四'", context,?new?Object());

?

???????log(user.getUsername());

????}

???

????public?void?testOgnl09()?throws?Exception{

???????User user1 =?new?User();

???????User user2 =?new?User();

???????Map context =?new?HashMap();

???????context.put("u1", user1);

???????context.put("u2", user2);

??????

???????//在一個表達式中可以用逗號分隔,同時執行多個表達式

???????Ognl.getValue("#u1.username = '李四',#u2.username='王五'", context,?new?Object());

?

???????log(user1.getUsername());

???????log(user2.getUsername());

????}

?

利用OGNL調用對象的方法

?

????//************************* OGNL調用對象的方法?*****************************//

????public?void?testOgnl10()?throws?Exception{

???????User user =?new?User();

??????

???????//如果是調用root對象的方法,可以直接使用方法的名稱來調用方法

???????Integer value = (Integer)Ognl.getValue("addSomething(1,1)", user);

???????log(value);

????}

???

????public?void?testOgnl11()?throws?Exception{

???????User user =?new?User();

???????user.setUsername("李四");

???????//如果是調用root對象的方法,可以直接使用方法的名稱來調用方法

???????String value = (String)Ognl.getValue("getUsername()", user);

???????log(value);

????}

???

????public?void?testOgnl12()?throws?Exception{

???????User user =?new?User();

???????Ognl.getValue("setUsername('王五')", user);

???????String value = (String)Ognl.getValue("getUsername()", user);

???????log(value);

????}

???

????//************************* OGNL調用靜態方法和變量?*********************//

????public?void?testOgnl13()?throws?Exception{

???????User user =?new?User();

???????user.setUsername("王五");

???????//調用靜態變量

???????//注意:out是System中的靜態變量,out是PrintStream類型的一個對象

???????//而println()則是out這個對象中的實例方法(不是靜態方法)

???????//調用靜態方法,需要在類名和變量名前面加上@來調用,對于實例方法,用"."來調用

???????Ognl.getValue("@System@out.println(username)", user);

????}

???

????public?void?testOgnl14()?throws?Exception{

???????User user =?new?User();

???????user.setUsername("wangwu");

???????//調用靜態方法,注意使用全路徑類名

???????Ognl.getValue("@System@out.println(@cn.com.leadfar.utils.Utils@toUpperCase(username))", user);

????}

?

利用OGNL訪問數組、集合對象

?

????public?void?testOgnl15()?throws?Exception{

??????

???????Object root =?new?Object();

???????Map context =?new?HashMap();

??????

???????//利用OGNL創建java.util.List對象

???????List list = (List)Ognl.getValue("{123,'xxx','kdjfk'}", context, root);

???????context.put("list", list);

??????

???????//利用OGNL創建數組

???????int[] intarray = (int[])Ognl.getValue("new int[]{23,45,67}", context, root);

???????context.put("intarray", intarray);

??????

???????//利用OGNL表達式創建java.util.Map對象

???????Map mapvalue = (Map)Ognl.getValue("#{'listvalue':#list,'intvalue':#intarray}", context, root);

???????context.put("mapvalue", mapvalue);

??????

???????//利用OGNL表達式訪問這些數組和集合對象

???????Ognl.getValue("@System@out.println(#list[1])", context,root);

???????Ognl.getValue("@System@out.println(#intarray[2])", context,root);

???????Ognl.getValue("@System@out.println(#mapvalue.listvalue[0])", context,root);

???????Ognl.getValue("@System@out.println(#mapvalue['intvalue'][0])", context,root);

????}

???

????public?void?testOgnl16()?throws?Exception{

??????

???????List root =?new?ArrayList();

???????User user1 =?new?User();

???????user1.setUsername("張三");

???????User user2 =?new?User();

???????user2.setUsername("李四");

???????root.add(user1);

???????root.add(user2);

??????

???????//如果root對象是List類型

???????log(Ognl.getValue("#root[0].username", root));

???????log(Ognl.getValue("#root[1].username", root));

????}

?


本文轉自農夫山泉別墅博客園博客,原文鏈接:http://www.cnblogs.com/yaowen/p/4826365.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256670.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4.H - 組合

題目連接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/H 題目大意:下面是一個二人小游戲:桌子上有M堆撲克牌;每堆牌的數量分別為Ni(i1…M);兩人輪流進行;每走一步可以任意選擇一堆并取走其中的任…

結構體指針需要申請指針內存,結構體對象不需要申請對象內存

struct frame_info { char* data;//圖像數據 int bufsize;//圖像大小 }; 1、struct frame_info* finfoDT new struct frame_info; finfoDT->data new 1280*720 2、struct frame_info finfoDT new struct frame_info; finfoDT.data new 1280*720

圖論——連通圖

Tyvj 2059 元芳看電影 描述 神探狄仁杰電影版首映這天,狄仁杰、李元芳和狄如燕去看電影。由于人實在是太多了,入場的隊伍變得十分不整齊,一個人的前面可能會出現并排的好多人。“元芳,這隊伍你怎么看?”“大人&#xf…

linux-ftools查看Linux 的cached里面有哪些內容

最近,公司有幾臺java服務器經常出現can not allocate memory 的情況。導致SSH登錄失敗。 因此,有必要做點什么。 我們可以使用linux-ftools查看Linux 的cached里面有哪些內容(工具: https://code.google.com/p/linux-ftools/)&…

matlab常用函數——軟件常用函數

一、軟件操作函數 1)命令窗口函數: clc:清空命令窗口,使用向上箭頭翻看命令。 open:打開文件,文本文件(*.doc),可執行文件(*.exe),圖形文件(*.fig),超文本文件(*.html,*.htm),MATLAB數據庫文件(*.mat),simulink模型文件*.mdl),MATLAB p文件(*.p),…

stanford corenlp的TokensRegex

最近做一些音樂類、讀物類的自然語言理解,就調研使用了下Stanford corenlp,記錄下來。 功能 Stanford Corenlp是一套自然語言分析工具集包括: POS(part of speech tagger)-標注詞性NER(named entity recognizer)-實體名識別Parser樹-分析句子…

將Linux系統下交叉編譯的依賴庫推到ARM平臺下無法建立以來關系解決

問題:平常把opencv庫使用源碼交叉編譯好之后,從windows推到飛機里發現,該庫的依賴關系都沒有了,導致程序運行的時候報該庫大小有問題 解決辦法: 1、將linux下的庫推到ARM平臺中的一個文件夾中,然后將ARM平臺…

Java:switch語句例子

1、輸入一個名次,第1~4名,分別稱為冠軍、亞軍、季軍、殿軍,5名及5名以上,稱為其他名次。 import java.util.Scanner; public class switch1 {public static void main(String[] args){Scanner snew Scanner(System.in)…

SQL計算100以內的質數(可以把100換成任意的整數)

declare i int --定義局部變量ideclare j int --定義局部變量jset i1 --給變量i賦值while i<100 --最外層while循環控制計算20以內的質數&#xff0c;每循環一次提供一個數&#xff0c;判斷它是不是質數begin --最外層while循環開始set j1 --給變量j賦…

matlab常用函數——數據類型函數

三、基本數據類型函數 1)數值函數 double:轉換為雙精度浮點數 single:轉換為單精度浮點數 typecast:在不改變數據大小情況下轉換數據類型 Y=typecast(X,type) type可選范圍:uint8、int8、uint16、int16、uint32、int32、uint64、int64、single、double arrayfun:把函數…

Courses hdu 1083(匹配)

http://acm.hdu.edu.cn/showproblem.php?pid1083 題意&#xff1a;一共有N個學生跟P門課程,一個學生可以任意選一門或多門課,問是否達成: 1.每個學生選的都是不同的課(即不能有兩個學生選同一門課) 2.每門課都有一個代表(即P門課都被成功選過) 今天學姐講匹配時講的題目&#…

進程編譯連接動態庫,需要將動態庫改為lib***.so

1、本身該庫可能編譯成npuDetect.so,但是需要改其名字為libnpuDetect.so,CMakelists才能找到該庫 2、進程中連接動態庫&#xff0c;如果該庫還依賴別的動態庫&#xff0c;則需要繼續把其他的庫也要連接進來

Drbd+Pacemaker實現高可用

What is Pacemaker? Pacemaker是一個集群資源管理器。它利用集群基礎構件&#xff08;OpenAIS 、heartbeat或corosync&#xff09;提供的消息和成員管理能力來探測并從節點或資源級別的故障中恢復&#xff0c;以實現群集服務&#xff08;亦稱資源&#xff09;的最大可用性。 前…

matlab常用函數——矩陣函數

五、數組和矩陣函數 1)數組基本函數 display:顯示字符或者數組 isempty :判斷數組是否為空,空返回1,不空返回0 isequal :判斷數組是否相同 (認為NaN不同) isequalwithequalnans:判斷數組是否相同,把NaN看成相同的數 isfinite :判斷數組元素是否為有限數 isfloat…

記錄下面試中的回答的不好的問題

1 伙伴系統在linux中的作用&#xff0c;具體咋回事 2 tcp擁塞控制 滑動窗口 3 linux sed&#xff0c;awk的具體使用 4 ftp哪幾種模式 5 中斷與輪詢 6 C stl的vector是怎么是實現的 7 I/O多路復用是怎么回事&#xff0c;select(),epoll()具體怎么回事。 一個文件中每行一個單詞&…

Python 字符串操作(string替換、刪除、截取、復制、連接、比較、查找、包含、大小寫轉換、...

去空格及特殊符號 s.strip().lstrip().rstrip(,) 復制字符串 #strcpy(sStr1,sStr2)sStr1 strcpysStr2 sStr1 sStr1 strcpy2print sStr2 連接字符串 #strcat(sStr1,sStr2)sStr1 strcatsStr2 appendsStr1 sStr2print sStr1 查找字符 #strchr(sStr1,sStr2)# < 0 為未找到…

周賽題解

A - An easy problemTime Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2601Description When Teddy was a child , he was always thinking about some simple math problems ,such as “What it’s 1 cup of wa…

matlab常用函數——數學函數

六、基本數學函數 1)基本運算符 +:加法運算符 -:減法運算符 *:矩陣乘法 .*:數組乘法 /:斜杠或者矩陣右除 B/A等于公式B*inv(A) ./:數組右除 A./B等于A(i,j)/B(i,j) \:反斜杠或者矩陣左除 A\B等于inv(A)*B .\:數組左除 A.\B等于B(i,j)/A(i,j) ^…