日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OGNL是Object-Graph Navigation Language

發(fā)布時間:2024/4/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OGNL是Object-Graph Navigation Language 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://baike.baidu.com/view/1347280.htm

OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱為EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調(diào)用對象的方法,遍歷整個對象的結(jié)構(gòu)圖,實現(xiàn)字段類型轉(zhuǎn)化等功能。它使用相同的表達式去存取對象的屬性。

?

OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱為EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調(diào)用對象的方法,遍歷整個對象的結(jié)構(gòu)圖,實現(xiàn)字段類型轉(zhuǎn)化等功能。它使用相同的表達式去存取對象的屬性。 OGNL可以讓我們用非常簡單的表達式訪問對象層,例如,當前環(huán)境的根對象為user1,則表達式person.address[0].province可以訪問到user1的person屬性的第一個address的province屬性。 這種功能是模板語言的一個重要補充,象jsp2.0,velocity,jelly等等,都有類似的功能,但是ognl比它們完善得多,而且以一個獨立的lib出現(xiàn),方便我們構(gòu)建自己的框架。

??

webwork2和現(xiàn)在的Struts2.x中使用OGNL取代原來的EL來做界面數(shù)據(jù)綁定,所謂界面數(shù)據(jù)綁定,也就是把界面元素(例如一個textfield,hidden)和對象層某個類的某個屬性綁定在一起,修改和顯示自動同步。 和struts1.x的formbean相比,這樣做的好處非常明顯:在webwork中不需要為每個頁面專門寫formbean,可以直接利用對象層的對象。例如在對象設計中,我們的User和Person是分開的,而一個注冊用戶界面需要填寫兩者的內(nèi)容,在webwork中,就可以保持后臺的對象結(jié)構(gòu),把屬于用戶屬性的界面元素用user.person.xxx綁定,把屬于賬號屬性的界面元素用user.xxx綁定。 Struts 2 OGNL(Object-Graph Navigation Language),可以方便地操作對象屬性的開源表達式語言,使頁面更簡潔; 支持運算符(如+-*/),比普通的標志具有更高的自由度和更強的功能; Struts 2默認的表達式語言是OGNL,原因是它相對其它表達式語言具有下面幾大優(yōu)勢: 支持對象方法調(diào)用,如xxx.doSomeSpecial(); 支持類靜態(tài)的方法調(diào)用和值訪問,表達式的格式為@[類全名(包括包路徑)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME; 支持賦值操作和表達式串聯(lián),如price=100, discount=0.8, calculatePrice(price*discount),這個表達式會返回80; 訪問OGNL上下文(OGNL context)和ActionContext; 操作集合對象。 可以直接new一個對象

用法

OGNL是通常要結(jié)合Struts 2的標志一起使用。主要是#、%和$這三個符號的使用。使用方法如下: 新建名為Struts2_OGNL的Web工程 #”主要有三種用途: 訪問OGNL上下文和Action上下文,#相當于ActionContext.getContext();下表有幾個ActionContext中有用的屬性: 名稱 作用 例子 parameters 包含當前HTTP請求參數(shù)的Map #parametersid[0]作用相當于request.getParameter("id") 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)內(nèi)讀取userName屬性,直到找到為止 用于過濾和投影(projecting)集合,如books.{?#this.price<100}; 構(gòu)造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。 下面讓我們它們的具體寫法,首先是Action類代碼: package tutorial.action; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.SessionAware; import org.apache.struts2.util.ServletContextAware; import tutorial.model.Book; import com.opensymphony.xwork2.ActionSupport; public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware { private static final long serialVersionUID = 1L; private HttpServletRequest request; private Map session; private ServletContext application; private List books; public void setServletRequest(HttpServletRequest request) { this.request = request; } @SuppressWarnings("unchecked") public void setSession(Map session) { this.session = session; } public void setServletContext(ServletContext application) { this.application = application; } public List getBooks() { return books; } @Override public String execute() { request.setAttribute("userName", "Max From request"); session.put("userName", "Max From session"); application.setAttribute("userName", "Max From application"); books = new LinkedList(); books.add(new Book("978 0735619678", "Code Complete, Second Edition", 32.99)); books.add(new Book("978 0596007867", "The Art of Project Management", 35.96)); books.add(new Book("978 0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19)); books.add(new Book("978 0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19)); books.add(new Book("978 0735605350", "Software Estimation: Demystifying the Black Art", 25.19)); return SUCCESS; } } 以上代碼分別在request、session和application的范圍內(nèi)添加“userName”屬性,然后再在JSP頁面使用OGNL將其取回。 下面是Ognl.jsp的代碼,內(nèi)容如下: 訪問OGNL上下文和Action上下文 parameters.userName: request.userName: session.userName: application.userName: attr.userName: 用于過濾和投影(projecting)集合 Books more than $35 <s:iterator value="books.{?#this.price > 35}"> <s:property value="title" /> - $<s:property value="price" /><br> </s:iterator> The price of "Code Complete, Second Edition" is: 構(gòu)造Map The value of key "foo1" is 清單3 WebContent/Ognl.jsp 以上代碼值得注意的是“”,因為“books.{?#this.title=='Code Complete, Second Edition'}.{price}”返回的值是集合類型,所以要用“[索引]”來訪問其值。 最后是Struts 2的配置文件struts.xml,內(nèi)容如下: /Ognl.jsp “%”符號的用途是在標志的屬性為字符串類型時,計算OGNL表達式的值。 “$”有兩個主要的用途,用于在國際化資源文件中,引用OGNL表達式。在Struts 2和i18n中配置文件

由來

OGNL stands for Object-Graph Navigation Language; it is an expression language for getting and setting properties of Java objects. You use the same expression for both getting and setting the value of a property. The ognl.Ognl class contains convenience methods for evaluating OGNL expressions. You can do this in two stages, parsing an expression into an internal form and then using that internal form to either set or get the value of a property; or you can do it in a single stage, and get or set a property using the String form of the expression directly. OGNL started out as a way to set up associations between UI components and controllers using property names. As the desire for more complicated associations grew, Drew Davidson created what he called KVCL, for Key-Value Coding Language, egged on by Luke Blanshard. Luke then reimplemented the language using ANTLR, came up with the new name, and, egged on by Drew, filled it out to its current state. Later on Luke again reimplemented the language using JavaCC. Further maintenance on all the code is done by Drew (with spiritual guidance from Luke).

發(fā)音

We pronounce OGNL as a word, like the last syllables of a drunken pronunciation of "orthogonal."

表達式

OGNL支持各種紛繁復雜的表達式。但是最最基本的表達式的原型,是將對象的引用值用點串聯(lián)起來,從左到右,每一次表達式計算返回的結(jié)果成為當前對象,后面部分接著在當前對象上進行計算,一直到全部表達式計算完成,返回最后得到的對象。OGNL則針對這條基本原則進行不斷的擴充,從而使之支持對象樹、數(shù)組、容器的訪問,甚至是類似SQL中的投影選擇等操作。 1. 基本對象樹的訪問 對象樹的訪問就是通過使用點號將對象的引用串聯(lián)起來進行。 例如:xxxx,xxxx.xxxx,xxxx. xxxx. xxxx. xxxx. xxxx 2. 對容器變量的訪問 對容器變量的訪問,通過#符號加上表達式進行。 例如:#xxxx,#xxxx. xxxx,#xxxx.xxxxx. xxxx. xxxx. xxxx 3. 使用操作符號 OGNL表達式中能使用的操作符基本跟Java里的操作符一樣,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,還能使用 mod, in, not in等。 4. 容器、數(shù)組、對象 OGNL支持對數(shù)組和ArrayList等容器的順序訪問:例如:group.users[0] 同時,OGNL支持對Map的按鍵值查找: 例如:#session['mySessionPropKey'] 不僅如此,OGNL還支持容器的構(gòu)造的表達式: 例如:{"green", "red", "blue"}構(gòu)造一個List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}構(gòu)造一個Map 你也可以通過任意類對象的構(gòu)造函數(shù)進行對象新建: 例如:new Java.net.URL("xxxxxx/") 5. 對靜態(tài)方法或變量的訪問 要引用類的靜態(tài)方法和字段,他們的表達方式是一樣的@class@member或者@class@method(args): 例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources 6. 方法調(diào)用 直接通過類似Java的方法調(diào)用方式進行,你甚至可以傳遞參數(shù): 例如:user.getName(),group.users.size(),group.containsUser(#requestUser) 7. 投影和選擇 OGNL支持類似數(shù)據(jù)庫中的投影(projection) 和選擇(selection)。 投影就是選出集合中每個元素的相同屬性組成新的集合,類似于關系數(shù)據(jù)庫的字段操作。投影操作語法為 collection.{XXX},其中XXX 是這個集合中每個元素的公共屬性。 例如:group.userList.{username}將獲得某個group中的所有user的name的列表。 選擇就是過濾滿足selection 條件的集合元素,類似于關系數(shù)據(jù)庫的紀錄操作。選擇操作的語法為:collection.{X YYY},其中X 是一個選擇操作符,后面則是選擇用的邏輯表達式。而選擇操作符有三種: ? 選擇滿足條件的所有元素 ^ 選擇滿足條件的第一個元素 $ 選擇滿足條件的最后一個元素 例如:group.userList.{? #txxx.xxx != null}將獲得某個group中user的name不為空的user的列表。 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的OGNL是Object-Graph Navigation Language的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国av在线| 黄色a区| 少妇久久久久久被弄到高潮 | 国产日韩综合 | 欧美日韩精品亚洲精品 | 黄色图片小说 | 亚洲 欧美 日韩 国产综合 在线 | 可以免费在线观看的av | 日少妇b| 麻豆av在线 | 久久久久久伊人 | 午夜神器在线观看 | 狠狠躁日日躁夜夜躁av | 日本一区二区三区在线免费观看 | 中文字幕35页 | 欧美体内谢she精2性欧美 | 浪漫樱花动漫在线观看免费 | 国产欧美一区二区三区免费看 | 国产美女永久无遮挡 | 夜夜躁很很躁日日躁麻豆 | 亚洲AV成人午夜无码精品久久 | 国产精品亚洲一区二区三区在线观看 | 欧洲精品码一区二区三区免费看 | 巨乳xxx | 无码人妻av一区二区三区波多野 | 国内精品在线播放 | 综合精品久久久 | 国产精品视频无码 | 大地资源二中文在线影视免费观看 | 天天撸在线视频 | 香蕉久久网站 | 午夜亚洲精品 | 午夜黄色av | 国产欧美一区二 | 亚洲女人天堂成人av在线 | 在线观看免费黄色小视频 | 日韩视频免费观看高清 | 四虎久久 | 欧美三级韩国三级日本三斤 | 国产黄色免费网站 | 一级大片免费观看 | 国产毛片一区二区三区va在线 | 美女又黄又免费 | 亚洲天堂手机在线 | 精品深夜av无码一区二区老年 | 中文字幕av在线播放 | 黄色成人在线 | 西西久久 | 精品国产无码在线观看 | 免费看欧美一级片 | 欧美综合一区 | 欧美精品乱码99久久蜜桃 | 18久久久 | 在线91视频 | 黑白配在线观看免费观看 | 国产毛片精品国产一区二区三区 | 久久综合99 | 69pao| 欧美日韩久久久 | 日韩美女免费线视频 | 免费无码国产v片在线观看 三级全黄做爰在线观看 | 久热网 | 亚洲国产97在线精品一区 | 广州毛片 | 亚洲国产精品麻豆 | 黄色福利在线观看 | eeuss国产一区二区三区 | 久久成人精品 | 熟女一区二区三区四区 | jizz在线免费观看 | 久久久看片 | 一区二区三区日韩精品 | 狠狠操很很干 | 亚洲天堂视频网 | 中文在线观看视频 | 黄色精品一区 | 中国老太婆性做爰 | 国产经典一区二区 | 久久久久久久久久久网站 | 国产成人 综合 亚洲 | 麻豆免费视频 | 欧美日韩中文字幕一区 | 色视频在线观看 | 日本一级淫片免费放 | 国产亚洲欧美精品久久久www | 韩国特级毛片 | 午夜日韩欧美 | 亚洲精品欧美 | 有码中文字幕 | 99精品福利视频 | 在线看一级片 | 久久久久久久久久久久久久av | 中文字幕观看在线 | 韩国视频一区二区三区 | 男人添女人下部高潮视频 | 久久伊人中文字幕 | 青草91 | 久久精品人妻一区二区三区 | 开心激情av |