2012-07-02 25 views
1

我想了解Struts 2的值棧和請求範圍。 我希望struts2值堆棧與請求範圍相同。Struts2 Value Stack

例如, 我已經在struts 2中調用了action1,這個動作執行一些數據庫任務並返回。它對稱爲個案的對象執行一些操作(類型Cases,其中Case是具有getters和setter的bean類)。 case對象在類級別聲明。

action1引發了一個視圖來呈現說jsp1。

jsp1再次有一些action稱爲action2。 action2導致與action1相同的java文件,但具有不同的方法。

現在,我想訪問在action1中使用的對象。在action1中,案例被推送到Value Stack並在jsp1上訪問。

我只是嘗試訪問它的getter方法,但它返回一個空值....!

任何解決方案如何做?或者有可能?我知道它是否可能那麼vs和請求範圍有什麼區別...

+3

值棧在*請求範圍內。你的問題很混亂。 –

+1

你可以發佈你的代碼嗎? –

+1

價值堆棧,如請求範圍,不記得從一個請求到另一個請求的任何內容。 –

回答

0

您在第一個請求中創建的對象無法在第二個請求中引用,因爲HTTP protocol is stateless

所有的網絡編程(PHP,servlet jsp,asp等)都是一樣的,因爲網絡使用HTTP協議進行通信。

爲您的可行的解決方案的問題:

包含該對象ID,1個.Create隱藏的輸入標記,以便當請求所述第二時間,支柱2的方法可以得到的ID(作爲參數),並做了「行動執行某些任務分貝」再重新創建相同的對象(它是昂貴的再創造,但它取決於你的需要)

2。之前您呈現的JSP中的第一個請求,你可以把對象放在會話範圍內(最好是在操作中執行此步驟,而不是在jsp腳本中)。

Map session = ActionContext.getContext().getSession(); 
session.put("myCases","cases); 

在第二個請求,你可以訪問對象

Map session = ActionContext.getContext().getSession(); 
Cases cases=(Cases)session.get("myCases"); 

會話可以在任何動作/ JSP進行訪問,直到它刪除。

Map session = ActionContext.getContext().getSession(); 
session.remove("myCases"); 

如果您嘗試訪問「根本沒有可能」後,它會清除你會得到空。

1

Dave說的ValueStack在請求範圍內是正確的。

但要實現你儘可能獲取從數據庫中的一些數據一次,然後用這個數據在多個動作/請求的願望,可以用一些可能的方法:

1)讓你的行動落實接口,並編寫一些代碼來「手動」獲取並將數據從/插入到會話圖中。這種方法需要零附加配置,並且非常直接和「無魔力」。另一方面,它將鍋爐代碼添加到您的操作類中,並且需要您在完成操作時「手動」刪除會話中的數據(或者,如果保存內存不重要,則可以將其留在那裏) 。

2)讓您的操作實施ModelDriven界面並配置ScopedModelDrivenInterceptor以管理「案例」模型的會話範圍。這比SessionAware方法簡單,因爲它需要引用文檔來爲struts.xml添加一些非常具體的配置細節。它仍然需要添加樣板代碼,並且它不提供從會話中刪除數據的簡單方法。

3)使用Struts2 Conversation Plugin,並將@ConversationField註釋放在您的cases對象上,並將@ConversationAction註釋放在action1和action2方法上。然後在你的struts.xml中,你的包擴展了「struts2-conversation-default」包,並在攔截器堆棧中包含了「對話」interceptor-ref。然後在你的jsp中,使用conversation tags。這種方法幾乎不需要鍋爐板和配置,但它確實通過註釋爲你的行爲添加了元數據(有些人會對此皺眉),而且它需要多學習一點。該插件具有額外的功能,例如允許同一對話的多個併發實例,自動刪除數據以節省內存等,但根據您的需要,這可能會過度。

您的應用程序的最佳方法將取決於您的要求和偏好。在動作類中應避免使用ActionContext.getContext().getSession();來訪問會話對象,以支持SessionAware接口。