Webwork【02】前端OGNL試練

1.OGNL 出現的意義

? ?在mvc中,數據是在各個層次之間進行流轉是一個不爭的事實。而這種流轉,也就會面臨一些困境,這些困境,是由于數據在不同世界中的表現形式不同而造成的:

a. 數據在頁面上是一個扁平的,不帶數據類型的字符串,無論你的數據結構有多復雜,數據類型有多豐富,到了展示的時候,全都一視同仁的成為字符串在頁面上展現出來。

b. 數據在Java世界中可以表現為豐富的數據結構和數據類型,你可以自行定義你喜歡的類,在類與類之間進行繼承、嵌套。我們通常會把這種模型稱之為復雜的對象樹。此時,如果數據在頁面和Java世界中互相流轉傳遞,就會顯得不匹配。所以也就引出了幾個需要解決的問題;

c. 當數據從View層傳遞到Controller層時,我們應該保證一個扁平而分散在各處的數據集合能以一定的規則設置到Java世界中的對象樹中去。同時,能夠聰明的進行由字符串類型到Java中各個類型的轉化;

d. 當數據從Controller層傳遞到View層時,我們應該保證在View層能夠以某些簡易的規則對對象樹進行訪問。同時,在一定程度上控制對象樹中的數據的顯示格式。

? ? ?如果我們稍微深入一些來思考這個問題,我們就會發現,解決數據由于表現形式的不同而發生流轉不匹配的問題對我們來說其實并不陌生。同樣的問題會發生在Java世界與數據庫世界中,面對這種對象與關系模型的不匹配,我們采用的 解決方法是使用ORM框架,例如Hibernate,iBatis等等。那么現在,在Web層同樣也發生了不匹配,所以我們也需要使用一些工具來幫助我們解決問題。為了解決數據從View層傳遞到Controller層時的不匹配性,Struts2采納XWork ? ? 的一套完美方案。并且在此的基礎上,構建了一個完美的機制,從而比較完美的解決了數據流轉中的不匹配性。OGNL方案就應運而生

2.OGNL項目實戰

? ?OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,
遍歷整個對象的結構圖,實現字段類型轉化等功能。

a. OGNL可以讓我們用非常簡單的表達式訪問對象層【OGNL支持對Map的按鍵值查找】

<ww:property value='user.name' /> 可以直接點對象的屬性,如user 屬性是list,<ww:property value='user[0].name' /> 可以獲取第一個user對象的 name如user 屬性是一個 map <ww:property value='user[name]' /> 獲取user "name" key 對應的 value

b. 支持運算符(如+-*/),比普通的標志具有更高的自由度和更強的功能

<ww:property value="100 - wcjd"/>

c. 支持對象方法調用,如xxx.doSomeSpecial()

d. 支持類靜態的方法調用和值訪問,表達式的格式為@[類全名(包括包路徑)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME

<ww:property value="#DateUtil.getNowdate(\"yyyy-MM-dd\")"/>

e. 支持賦值操作和表達式串聯,如price=100, discount=0.8, calculatePrice(price*discount),這個表達式會返回80

f .訪問OGNL上下文(OGNL context)和ActionContext

g.你也可以通過任意類對象的構造函數進行對象新建

/**
new Java.net.URL("xxxxxx/")
**/

h.OGNL支持類似數據庫中的投影(projection) 和選擇(selection)。
投影就是選出集合中每個元素的相同屬性組成新的集合,類似于關系數據庫的字段操作。投影操作語法為 collection.{XXX},其中XXX 是這個集合中每個元素的公共屬性。

/**
group.userList.{username}將獲得某個group中的所有user的name的列表
**/ 

選擇就是過濾滿足selection 條件的集合元素,類似于關系數據庫的紀錄操作。選擇操作的語法為:collection.{X YYY},其中X 是一個選擇操作符,后面則是選擇用的邏輯表達式。而選擇操作符有三種:
? 選擇滿足條件的所有元素
^ 選擇滿足條件的第一個元素
$ 選擇滿足條件的最后一個元素

/**
group.userList.{? #txxx.xxx != null}將獲得某個group中user的name不為空的user的列表
**/

i. OGNL是通常要結合Struts 2的標志一起使用,主要是#、%和$這三個符號的使用。使用方法如下:

/**
訪問OGNL上下文和Action上下文,#相當于ActionContext.getContext();下表有幾個ActionContext中有用的屬性:parameters 包含當前HTTP請求參數的Map #parameters.id[0]作用相當于request.getParameterValues("id").get(0);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'}。%”符號的用途是在標志的屬性為字符串類型時,計算OGNL表達式的值。“$”有兩個主要的用途,用于在國際化資源文件中,引用OGNL表達式。在Struts 2和i18n中配置文件/**

j. OGNL 可以獲取后臺 action get()set() 方法 傳送過來的數據靈活展示到前臺

轉載于:https://www.cnblogs.com/java-class/p/5016578.html

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

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

相關文章

python ATM購物程序

需求&#xff1a; 模擬實現一個ATM 購物商城程序 額度 15000或自定義實現購物商城&#xff0c;買東西加入 購物車&#xff0c;調用信用卡接口結賬可以提現&#xff0c;手續費5%每月22號出賬單&#xff0c;每月10號為還款日&#xff0c;過期未還&#xff0c;按欠款總額 萬分之5…

NYOJ 10 skiing

skiing 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;5描述Michael喜歡滑雪百這并不奇怪&#xff0c; 因為滑雪的確很刺激。可是為了獲得速度&#xff0c;滑的區域必須向下傾斜&#xff0c;而且當你滑到坡底&#xff0c;你不得不再次走上坡或…

Spring的REST服務發現性,第5部分

這是有關使用Spring 3.1和Spring Security 3.1和基于Java的配置來建立安全的RESTful Web Service的系列文章的第五篇。 上一篇文章介紹了RESTful服務HATEOAS的可發現性的概念&#xff0c;然后介紹了一些由測試驅動的實際方案。 本文將重點介紹可發現性的實際實現以及使用Spring…

postman使用_postman如何使用集合斷言?

在postman中&#xff0c;大家都使用過斷言&#xff0c;但是我們使用的斷言都是針對每一個接口或者是每一個用例添加的&#xff0c;那么是否有可以同時對多個用例或接口添加斷言呢 &#xff1f; 答案是肯定有的。那么接下來我就帶領大家認識下Postman中的批量斷言&#xff0c;也…

紀念我的leetcode開門之旅

15.12.3在朋友的建議下開始了leetcode之旅&#xff0c;上面的題目先撿簡單的刷吧。。。轉載于:https://www.cnblogs.com/thewaytomakemiracle/p/5016825.html

NYOJ 16 矩形嵌套

矩形嵌套 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;4描述有n個矩形&#xff0c;每個矩形可以用a,b來描述&#xff0c;表示長和寬。矩形X(a,b)可以嵌套在矩形Y(c,d)中當且僅當a<c,b<d或者b<c,a<d&#xff08;相當于旋轉X90度&…

沉思濫用:“強力使用,破壞濫用”

英國前首相本杰明迪斯雷利&#xff08;Benjamin Disraeli&#xff09;曾有一個古老的說法&#xff0c;說謊言分為三種&#xff1a;“謊言&#xff0c;該死的謊言和統計數據”。 這里的暗示是統計數據很容易彌補它們是不可靠的。 但是&#xff0c;統計學在經驗科學中得到了廣泛的…

centos和ubuntu下使用cron設置定時任務

1.啟動cron工具[ps:使用root權限] centos啟動cron兩種方式 a) /etc/init.d/crond start b) service crond start ubuntu啟動cron兩種方式 a) /etc/init.d/cron start b) service cron start(推薦) 2.添加定時任務[每個整點執行ls命令] centos crontab -e命令打開文件 添加一行:…

算法與數據結構(一)

這里的許多資源&#xff0c;有時間可用多看看&#xff0c;寫一下。 http://download.csdn.net/album/detail/3249/2 這個哥們的博客還不錯&#xff1a;http://u.cxyblog.com/2/articles-3.html轉載于:https://www.cnblogs.com/oxspirt/p/5805409.html

protected訪問權限_權限修飾符 /重寫

一 權限修飾符 private內容不能被繼承類:只有public / default 可以修飾 ,且default 默認出現protected訪問權限1.同包下的類2.不同包的子類,只能通過子父類關系訪問,只有子類中才可以使用.權限修飾符只能修飾成員,成員修飾符(成員變量|成員方法)二 重寫重寫和重載的區別:(都指…

NYOJ 26 孿生素數問題

孿生素數問題 時間限制&#xff1a;3000ms | 內存限制&#xff1a;65535KB難度&#xff1a;3描述寫一個程序&#xff0c;找出給出素數范圍內的所有孿生素數的組數。一般來說&#xff0c;孿生素數就是指兩個素數距離為2&#xff0c;近的不能再近的相鄰素數。有些童鞋一看到題就…

python importlib_importlib --- import 的實現 — Python 3.10.0a2 文檔

3.7 新版功能.這個模塊使得Python的導入系統提供了訪問*包*內的*資源*的功能。如果能夠導入一個包&#xff0c;那么就能夠訪問那個包里面的資源。資源可以以二進制或文本模式方式被打開或讀取。資源非常類似于目錄內部的文件&#xff0c;要牢記的是這僅僅是一個比喻。資源和包不…

原生js使用forEach()與jquery使用each遍歷數組,return false 的區別

原生js使用forEach()與jquery使用each()遍歷數組&#xff0c;return false 的區別&#xff1a; 1、使用each()遍歷數組a,如下&#xff1a; var a[20,21,22,23,24];$.each(a, function(index,val) {console.log(indexindex);if(index2){return false;}console.log(valval);}); …

配置Java EE應用程序或“將Bien付諸實踐”

過去&#xff0c;有關應用程序配置的討論很多。 我不知道誰拉開了辯論的序幕&#xff0c;但是最基礎的閱讀&#xff08;著眼于未來的Java EE 7及更高版本&#xff09;是Antonio Goncalves的帖子[辯論] – Java EE 7中的配置如何 &#xff1f; 事實是&#xff0c;使用香草Java E…

HTML5 Canvas入門

HTML5的canvas&#xff08;畫布&#xff09;元素使用JavaScript在網頁上繪制圖像。下面以一個簡單例子及其效果圖&#xff08;圖1&#xff09;開始&#xff1a; <!DOCTYPE HTML> <html><head><style type"text/css"> canvas{border:dashed 2…

NYOJ 27 大數階乘

大數階乘 時間限制&#xff1a;3000ms | 內存限制&#xff1a;65535KB難度&#xff1a;3描述我們都知道如何計算一個數的階乘&#xff0c;可是&#xff0c;如果這個數很大呢&#xff0c;我們該如何去計算它并輸出它&#xff1f; 輸入輸入一個整數m(0<m<5000)輸出輸出m的…

泄漏:Oracle WebLogic Server 12g

JavaOne已經比我們落后了將近一個星期&#xff0c;我仍在撰寫有關它的詳細博客文章 。 我真的很驚訝的事實是&#xff0c;我沒有看到任何提及我最喜歡的應用程序服務器更新的事實。 是的&#xff0c;我喜歡WebLogic產品。 從一開始。 自從收購BEA以來&#xff0c;甲骨文一直對我…

畫家問題

【題目描述】 有一個正方形的墻&#xff0c;由N*N個正方形的磚組成&#xff0c;其中一些磚是白色的&#xff0c;另外一些磚是黃色的。Bob是個畫家&#xff0c;想把全部的磚都涂成黃色。但他的畫筆不好使。當他用畫筆涂畫第(i,j)個位置的磚時&#xff0c;位置(i-1,j)、(i1,j)、(…

8-IO總結

3、 4、 5、 轉載于:https://www.cnblogs.com/fubaizhaizhuren/p/5026207.html

NYOJ 36 ??最長公共子序列

最長公共子序列 時間限制&#xff1a;3000ms | 內存限制&#xff1a;65535KB難度&#xff1a;3描述咱們就不拐彎抹角了&#xff0c;如題&#xff0c;需要你做的就是寫一個程序&#xff0c;得出最長公共子序列。tip&#xff1a;最長公共子序列也稱作最長公共子串(不要求連續)&…