咱們都知道,struts 能夠在action中綁定數據,進而在頁面中經過s 標籤,ognl表達式輸出。session
關於 value stack以及 action contextapp
用 <s:debug/> 能夠查看 value stack 以及 action context, 很是清楚。value stack 的棧頂就是 所訪問的action。spa
對於s標籤裏面的內容,例如<s:property value="username"/>,struts 在解析這個標籤的時候,會首先在action中查找有沒有這個屬性,找不到纔去 action context中找。而若是這樣寫,<s:property value="#username"/>,struts會直接去 action context 中找。經過 ServletActionContext.getContext() 可獲取到 action context, 是一個map。.net
而 action 自己也在 action context 中,action context存儲了大部分經常使用的對象,例如 request,response,session,application 等等,具體能夠在 s:debug 中看到。debug
對於ognl表達式,用#就代表從 action context中查找,不用#就是直接去value stack棧頂,即action中查找。對象
由於session就在action context中,所以 訪問session就須要加 #, <s:property value="#session.username"/> .blog
疑問:可是對於 <s:property value="#request.username"/> 若是request中沒有username屬性,則依次去 action,action context,session中去找。 這多是由於 action, action context, session 都在request中有引用的緣故吧。get
關於更詳細的原理,參閱:io
Struts2數據傳輸的背後機制:ValueStack(值棧) 原理
在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等