2012-04-20 75 views
2

我有一個struts2窗體。 在這種形式下,用戶被要求填寫幾個字段。 其中2個字段是通過從另一個操作中選取對象來填充的。Struts 2 subaction

事實上: main form => pickup button =>新行爲用新表格填充=>返回主窗體並填充相應的字段。

我的問題是,用戶完成後子作用,我想回到的主要形式,但沒有失去他之前充滿一切......

我不知道該如何處理這個問題,我應該通過從主窗體到每個字段的子動作?

+0

當你去太陽行動使用準備方法和可準備接口閱讀這個http://struts.apache.org/2.3.1/docs/prepare-interceptor.html – 2012-04-20 09:31:51

回答

1

若干從第一形式返回加載其字段在第二 形式方式想到,取決於因素將決定最適合你的一個。

1)發出你想保留的所有參數。最簡單的方法是使用隱藏字段。模型驅動也可能在這裏有意義或者將多個動作放入一個類中,或者強調這些動作共享一組屬性。

2)將值存儲在像Vasily建議的會話中,但Struts2具有範圍攔截器......如果需要經常執行此操作,則值得查看(請參閱頁面上的最後一個示例):http://struts.apache.org/2.3.1.2/docs/scope-interceptor.html但要做到這一點,有點棘手,因爲如果這是一個辦公應用程序,並且用戶像我一樣,他們就會在任何時候打開十幾個窗口。在這種情況下,您還需要考慮爲每個「流」添加一個令牌(請參閱:struts2 token tag),以防止在執行刷新時從十二個窗口中選擇一個來獲取我期望的最新數據,被一些全球性商店污染,所有行爲都使用。還有其他一些處理流程/對話的方法......例如有人寫了一個插件,我想這將實現剛剛解釋的內容:http://code.google.com/p/struts2-conversation/

總是值得快速瀏覽一下struts2插件,以確保您不會「重新發明輪子,但我必須說我不能擔保該插件。

3)不要讓他們離開頁面。這是非常光滑的...如果你需要選擇額外的參數,當他們點擊「拾取」按鈕時,表單將擴展爲必填字段,那麼當他們點擊本小節中的「更新」時,它將關閉並更新其餘的領域。您將需要客戶端上的JS組合,通常是XML或JSON響應。對於您自己的網頁,JSON是更簡單的方法,可以生成JSON響應,請參閱struts2-json-plugin

在大多數情況下,我會選擇#3。可能#1,如果我知道該動作只能從調用動作中使用和/或我想要一個非常安全的書籤形式(如果可能的話使用GET來傳遞所有參數)。 #2在更復雜的情況下需要多個操作進行協作,並且出於某種奇怪的原因我無法使用ajax。注意#3和#2對書籤不太友好,如果不使用客戶端存儲,它們通常不是非常友好的。

0

在會話中存儲您的mainform。

public class Test extends ActionSupport implements Preparable { 

    private MainForm form; 

    public void prepare(){ 
    form =  (MainForm)ServletActionContext.getRequest().getSession().getAttribute("mainForm"); 
    if(form == null) { 
     form = new MainForm(); 
    } 
    } 

    public String execute(){ 
    //Do something useful 
    //Do something useful 
    //Do something useful 
    return SUCCESS; 
    } 

    public MainForm getForm() { 
    return form; 
    } 

    public void setForm(MainForm form) { 
    this.form = form; 
    } 

「準備」方法是Preparable interfeice的一部分。它會在所有參數讀數之前和執行方法之前執行,每次您調用acton時。

0

您需要以下有工作struts2的平臺:

  1. 2支柱形成域的類
  2. 一個Struts Action類
  3. JSP頁面
  4. 一個Struts配置文件

然後通過以下流程:

  • 當第一形式是通過場
  • 加載保存其豆在第二形式 後通過上述場