【struts2】值棧(後篇)

  在值棧(前篇)咱們學習了值棧的基本知識,接下來,來看看在程序中具體如何使用值棧。html

  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

  • get(String key):根據key從ActionContext當前的存儲空間裏面獲取相應的值
  • put(String key, Object value):把值存儲在ActionContext的存儲空間裏面
  • Map<String,Object> getApplication():返回ServletContext中存儲的值
  • Map<String,Object> getSession():返回HttpSession中存儲的值
  • Map<String,Object> getContextMap():返回當前context存儲的值
  • Map<String,Object> getParameters():返回HttpServletRequest對象裏面存儲的,客戶端提交的參數
  • ValueStack getValueStack():獲取OGNL的值棧

  對於getXXX的方法,都有對應的setXXX方法,這裏就不去贅述了,具體的請參看Struts2的API文檔。對象

  1.3 應用示例blog

  在《自定義更強大的logger攔截器》《自定義登錄驗證攔截器》中,兩個攔截器都使用了ActionContext對象,詳細請查看這兩篇文章。文檔

  2 ValueStack的基本使用

  在值棧(前篇)中,咱們看到了ValueStack被包含在ActionContext中,ValueStack也是用來存儲對象的,可是它主要是經過OGNL表達式來訪問,也就是說,在Struts2裏面主要是經過標籤來訪問的。ValueStack有一個特色,若是訪問的值棧裏有多個對象,且相同的屬性在多個對象中同時出現,則值棧會按照從棧頂到棧底的順序,尋找第一個匹配的對象。

  2.1 如何獲取?

  直接由ActionContext對象的getValueStack()方法便可獲取

  2.2 如何使用?

  ValueStack主要的功能也是用來存放數據的,典型的方法以下:

  • Object findValue(String expr):根據表達式在value stack中,按照缺省的訪問順序去獲取表達式對應的值
  • void setValue(String expr, Object value):根據表達式,按照缺省的訪問順序,向value stack中設置值
  • Object peek():獲取value stack中的頂層對象,不修改value stack對象
  • Object pop():獲取value stack中的頂層對象,並把這個對象從value stack中移走
  • void push(Object o):把對象加入到value stack對象中,並設置成爲頂層對象

  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的機會並非不少。

  參考資料:http://www.iteye.com/topic/1124526

相關文章
相關標籤/搜索