Struts OGNL基礎上的增強
1值棧(ValueStack)
Struts OGNL上下文設置為Struts中的ActionContext(內部使用的仍然是OgnlContext)並將值棧設為Struts OGNL的根對象
我們知道Struts OGNL上下文中的根對象可以直接訪問不需要使用任何特殊的標記而引用上下文中的其他對象則需要使用#來標記由於值棧是上下文中的根對象因此可以直接訪問那麼對於值棧中的對象該如何訪問呢?Struts提供了一個特殊的OGNLPropertyAccessor它可以自動查找棧內的所有對象(從棧頂到棧底)直接找到一個具有你所查找的屬性的對象也就是說對於值棧中的任何對象都可以直接訪問而不需要使用#
假設值棧中有兩個對象student和employee兩個對象都有name屬性student有學號屬性number而employee有薪水屬性salaryemployee先入棧student後入棧位於棧頂那麼對於表達式name訪問的就是student的name屬性因為student對象位於棧頂表達式salary訪問的就是employee的salary屬性正如你所見訪問值棧中的對象屬性或方法無須指明對象也不用#就好像值棧中的對象都是OGNL上下文中的根對象一樣這就是Struts在OGNL基礎上做出的改進
[N]語法
如上所述如果想要訪問employee的name屬性應該如何寫表達式呢?我們可以使用[N]xxx(N是從開始的整數)這樣的語法來指定從哪一個位置開始向下查找對象的屬性表達式[]name訪問的就是employee對象的name屬性
在使用[N]xxx語法時要注意位置序號的含義它並不是表示獲取棧中索引為N的對象而是截取從位置N開始的部分棧
top關鍵字
top用於獲取棧頂的對象結合[N]xxx語法我們就可以獲取棧中任意位置的對象
如[]top[]top等
訪問靜態成員
除了使用標准的OGNL表達式訪問靜態字段和靜態方法外Struts還允許你不指定完整的類名而是通過vs前綴來調用保存在棧中的靜態字段和靜態方法
@vs@FOO_PROPERTY@vs@someMethod()@vs@someMethod()
vs表示ValueStack如果只有vs那麼將使用棧頂對象的類如果在vs後面跟上一個數字那麼將使用棧中指定位置處的對象類
標准方法:@類全限定名@靜態屬性或方法名
< ?xml:namespace prefix = s />< s:property value=@actionSystemInfo@WEB_CONTEXT>< /s:property>
值棧中的Action實例
Struts框架總是把Action實例放在棧頂因為Action在值棧中而值棧又是OGNL中的根所以引用Action的屬性可以省略#標記這也是為什麼我們在結果頁面中可以直接訪問Action的屬性的原因
Struts中的命名對象
Struts還提供了一些命名對象這些對象沒有保存在值棧中而是保存在ActionContext中因此訪問這些對象需要使用#標記這些命名對象都是Map類型
parameters
用於訪問請求參數如#parameters[id]或#parametersid相當於調用了HttpServletRequest對象的getParameter()方法
注意parameters本質上是一個使用HttpServletRequest對象中的請求參數構造的Map對象一量對象被創建(在調用Action實例之前就已經創建好了)它和HttpServletRequest對象就沒有了任何關系
request
用於訪問請求屬性如#request[user]或#requestuser相當於調用了HttpServletRequest對象的getAttribute()方法
session
用於訪問session屬性如#session[user]或#sessionuser相當於調用了HttpSession對象的getAttribute()方法
application
用於訪問application屬性如#application[user]或#applicationuser相當於調用了ServletContext的getAttribute()方法
attr
如果PageContext可用則訪問PageContext否則依次搜索requestsession和application對象
以上就是對Struts OGNL的分析與簡介
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28342.html