Struts
2 OGNL基礎上的增強
1、值棧(ValueStack)
Struts2 OGNL上下文設定為Struts2中的ActionContext(內部使用的仍然是OgnlContext),並將值棧設為Struts2 OGNL的根對象。
我們知道,Struts2
OGNL上下文中的根對象可以直接存取,不需要使用任何特殊的“標記”,而引用上下文中的其他對象則需要使用“#”來標記。由於值棧是上下文中的根對象,
因此可以直接存取。那麼對於值棧中的對象該如何訪問呢?Struts2提供了一個特殊的OGNLPropertyAccessor,它可以自動尋找棧內的
所有對象(從棧頂到棧底),直接找到一個具有你所尋找的屬性的對象。也就是說,對於值棧中的任何對象都可以直接存取,而不需要使用“#”。
假設值棧中有兩個對象:student和employee,兩個對象都有name屬性,student有學號屬性number,而employee
有薪水屬性salary。employee先入棧,student後入棧,位於棧頂,那麼對於運算式name,訪問的就是student的name屬性,
因為student對象位於棧頂;運算式salary,訪問的就是employee的salary屬性。正如你所見,訪問值棧中的對象屬性或方法,無須指
明對象,也不用“#”,就好像值棧中的對象都是OGNL上下文中的根對象一樣。這就是Struts2在OGNL基礎上做出的改進。
2、[N]文法
如上所述,如果想要訪問employee的name屬性,應該如何寫運算式呢?我們可以使用[N].xxx(N是從0開始的整數)這樣的文法來指定從哪一個位置開始向下尋找對象的屬性,運算式[1].name訪問的就是employee對象的name屬性。
在使用[N].xxx文法時,要注意位置序號的含義,它並不是表示“擷取棧中索引為N的對象”,而是截取從位置N開始的部分棧。
3、top關鍵字
top用於擷取棧頂的對象,結合[N].xxx文法,我們就可以擷取棧中任意位置的對象。
如:[0].top,[1].top等
4、訪問靜態成員
除了使用標準的OGNL運算式訪問靜態欄位和靜態方法外,Struts2還允許你不指定完整的類名,而是通過“vs”首碼來調用儲存在棧中的靜態欄位和靜態方法。
FOO_PROPERTYsomeMethod()someMethod() |
vs表示ValueStack,如果只有vs,那麼將使用棧頂對象的類;如果在vs後面跟上一個數字,那麼將使用棧中指定位置處的對象類。
標準方法:@類全限定名@靜態屬性或方法名
< ?xml:namespace prefix = s />< s:property value="@action.SystemInfo@WEB_CONTEXT">< /s:property> |
5、值棧中的Action執行個體
Struts2架構總是把Action執行個體放在棧頂。因為Action在值棧中,而值棧又是OGNL中的根,所以引用Action的屬性可以省略“#”標記,這也是為什麼我們在結果頁面中可以直接存取Action的屬性的原因。
6、Struts2中的命名物件
Struts2還提供了一些命名物件,這些對象沒有儲存在值棧中,而是儲存在ActionContext中,因此訪問這些對象需要使用“#”標記。這些命名物件都是Map類型。
parameters
用於訪問請求參數。如:#parameters['id']或#parameters.id,相當於調用了HttpServletRequest對象的getParameter()方法。
注意,parameters本質上是一個使用HttpServletRequest對象中的請求參數構造的Map對象,一量對象被建立(在調用Action執行個體之前就已經建立好了),它和HttpServletRequest對象就沒有了任何關係。
request
用於訪問請求屬性。如:#request['user']或#request.user,相當於調用了HttpServletRequest對象的getAttribute()方法。
session
用於訪問session屬性。如:#session['user']或#session.user,相當於調用了HttpSession對象的getAttribute()方法。
application
用於訪問application屬性。如:#application['user']或#application.user,相當於調用了ServletContext的getAttribute()方法。
attr
如果PageContext可用,則訪問PageContext,否則依次搜尋request、session和application對象。
以上就是對Struts2 OGNL的分析與簡介
原文地址:http://www.fengfly.com/plus/view-62875-1.html