struts2的OGNL表达式理解(一)
生活随笔
收集整理的這篇文章主要介紹了
struts2的OGNL表达式理解(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一,什么是OGNL表達式
? ? OGNL是Object-Graph Navigation Language(對象圖導航語言)的縮寫,它是一種功能強大的表達式語言(Expression Language,簡稱為EL),通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。
二,OGNL上下文 ? ? ?OGNL表達式的計算都是圍繞OGNL上下文來進行的,OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類(實現了java.util.Map接口)來表示。
? ? ?Struts2 把OGNL Context設置為ActionContext,即在Struts2中OGNL上下文(Context)的實現為ActionContext。
? ? ?Struts2 把ValueStack作為OGNL的根對象。
三,什么是值棧 在struts2中將OGNL上下文設置為struts2中的ActionContext,并將值棧作為OGNL的根對象。值棧類似于正常的棧,符合后進先出的棧的特點,你可以在值棧中放入、刪除和查詢對象,值棧是Struts2的核心。
? ? ? OGNL設定的根對象(root對象),在Struts2中就是ValueStack(值棧) 。如果要訪問根對象(即ValueStack)中對象的屬性,則可以省略#命名空間,直接訪問該對象的屬性即可。 每個Action類的對象實例都會擁有一個ValueStack對象,當Struts2接收到一個*.action請求后,并不是直接調用Action方法,而是先將Action類的相應屬性放到ValueStack對象的頂層節點
服務器跳轉時共用值棧:
? ? ?假設從一個Action1通過服務器跳轉到Action2的話,就意味著這兩個Action是共享一個值棧的,因為一次請求只使用一個值棧,這時內存中情況是這樣的:首先接收到Action1請求后,會產生一個值棧,在棧頂存放Action1對象以及它所有的屬性
然后經過服務器跳轉到Action2,這時就會把Action2對象壓入值棧的棧頂位置,此時Action1對象以及它的所有屬性就位于棧底
客戶端跳轉時使用各自的值棧:
? ? ? 假如中間某一個步驟中出現了客戶端跳轉的話,那么兩個Action所使用的就是兩個不同的值棧了。所以在Action2中就不能再使用Action1中的屬性了,在最后跳轉到的JSP頁面中也就無法獲取Action1的屬性了
也即從Action2跳轉到JSP頁面時使用的是redirect的話,那么最后值棧中是沒有任何的Action對象的。這個時候我們可以通過鏈接傳參, 比如<result type="redirect">test.jsp?netname=${username}</result>
意思就是取出Action2中的username屬性作為參數,通過瀏覽器地址欄傳遞到JSP頁面中。然后使用OGNL中的#號獲取Paraments對象的屬性,即<s:property value="#parameters.netname"/>就可以取到值了
四,OGNL的訪問
? ? ??由于ValueStack(值棧)是Struts 2中OGNL的根對象,如果用戶需要訪問值棧中的對象,在JSP頁面可以不使用#號直接訪問ValueStack(值棧)中對象的屬性。
如果訪問其他Context中的對象,由于他們不是根對象,所以在訪問時,需要添加#前綴。
1,application對象:用于訪問ServletContext,例如#application.userName或者#application['userName'],相當于調用ServletContext的getAttribute("username")。
2,session對象:用來訪問HttpSession,例如#session.userName或者#session['userName'],相當于調用session.getAttribute("userName")。
3,request對象:用來訪問HttpServletRequest屬性(attribute)的Map,例如#request.userName或者#request['userName'],相當于調用request.getAttribute("userName")。
4,parameters對象:用于訪問HTTP的請求參數,例如#parameters.userName或者#parameters['userName'],相當于調用request.getParameter("username")。
5,attr對象:按page->request->session->application順序訪問其屬性。
總結
以上是生活随笔為你收集整理的struts2的OGNL表达式理解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: strust2控制标签(二) merge
- 下一篇: struts2的OGNL表达式(二)