在值棧(前篇)咱們學習了值棧的基本知識,接下來,來看看在程序中具體如何使用值棧。html
1 ActionContext的基本使用學習
1.1 如何獲取?this
要獲取ActionContext有兩個基本的方法,若是在不能獲取到ActionInvocation的地方,能夠直接使用ActionContext一個靜態的getContext方法,就能夠訪問到當前的ActionContext了,示例以下:spa
ActionContext ctx = ActionContext.getContext();
若是在能獲取到ActionInvocation的地方,好比在攔截器裏面、自定義的Result裏面等,能夠經過ActionInvocation來獲取到ActionContext,示例以下:code
ActionContext ctx = actionInvocation.getInvocationContext();
1.2 獲取事後,如何使用?xml
ActionContext主要的功能是用來存放數據的,典型的方法以下:htm
對於getXXX的方法,都有對應的setXXX方法,這裏就不去贅述了,具體的請參看Struts2的API文檔。對象
1.3 應用示例blog
在《自定義更強大的logger攔截器》和《自定義登錄驗證攔截器》中,兩個攔截器都使用了ActionContext對象,詳細請查看這兩篇文章。文檔
2 ValueStack的基本使用
在值棧(前篇)中,咱們看到了ValueStack被包含在ActionContext中,ValueStack也是用來存儲對象的,可是它主要是經過OGNL表達式來訪問,也就是說,在Struts2裏面主要是經過標籤來訪問的。ValueStack有一個特色,若是訪問的值棧裏有多個對象,且相同的屬性在多個對象中同時出現,則值棧會按照從棧頂到棧底的順序,尋找第一個匹配的對象。
2.1 如何獲取?
直接由ActionContext對象的getValueStack()方法便可獲取
2.2 如何使用?
ValueStack主要的功能也是用來存放數據的,典型的方法以下:
2.3 應用示例
前面的示例中,歡迎頁面顯示的賬號,是從登陸頁面填寫並傳遞到後臺的數據,假如如今想要修改在歡迎頁面顯示的賬號數據,可是前面從登陸頁面填寫並傳遞到後臺的數據不須要變化,那麼該怎麼實現呢?先來分析一下,要想修改result頁面顯示的值,確定須要在Result處理以前修改這個值,不然等Result處理完成事後再改就沒有意義了。所以,能夠選用PreResultListener的技術,在裏面把值修改好,而後再進行Result處理。另一點,在歡迎頁面是經過標籤來獲取賬號的數據並展現的,也就是說值的來源是value stack,所以,在PreResultListener裏面要修改的就是value stack裏面的值。好了,清楚該幹什麼事後,來具體看看示例。
1)先來實現PreResultListener,在裏面修改value stack裏面的值,示例以下:
public class MyPreResult implements PreResultListener{ public void beforeResult(ActionInvocation actionInvocation, String result) { System.out.println("如今處理Result執行前的功能,result="+result); actionInvocation.getInvocationContext().getValueStack().setValue("account", "被修改了"); } }
2)實現了PreResultListener,還須要在運行以前註冊,這裏選擇在Action裏面來註冊這個監聽器,示例以下:
public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; public String execute() throws Exception { this.businessExecute(); ActionContext c = ActionContext.getContext(); MyPreResult pr = new MyPreResult(); c.getActionInvocation().addPreResultListener(pr); return "toWelcome"; } /** * 示例方法,表示能夠執行業務邏輯處理的方法, */ public void businessExecute(){ System.out.println("用戶輸入的參數爲==="+"account="+account+",password="+password+",submitFlag="+submitFlag); } //屬性對應的getter/setter方法,省略了 }
3)struts.xml、登錄界面和歡迎界面都不變。歡迎界面中的<s:property value="account"/>就能夠得到MyPreResult類中修改的account值了。
因爲一般狀況下,向value stack裏面壓入值都是由Struts2去完成,而訪問value stack可能是經過標籤中的OGNL表達式,於是直接使用ValueStack的機會並非不少。