2012-07-04 156 views
1

我有一個動作,名爲ShowData,它從數據庫中恢復數據並將其放入jsp中。如何在Struts2的這種情況下避免「鏈」?

struts.xml中

... 
<action name="ShowData" class="foo"> 
    <result>foo.jsp</result> 
</action> 
... 

在foo.jsp頁面我有一個表格,並且我已經與ShowData動作獲得的數據。

foo.jsp

... 
<s:form action="DoSomething"> 
    <s:input key="email" /> 
    <s:submit/> 
</s:form> 
<s:iterator value="data_recovered_in_ShowData"> 
    ... 
</s:iterator> 
... 

現在我想一些驗證添加到數據。如果DoSomething的返回類型如下所示:<result name="input">foo.jsp</result>我將丟失我在ShowData操作中恢復的數據,但驗證完美起作用,並且用戶以前的輸入和錯誤將顯示在jsp頁面中。另一方面,我知道我可以使用chain來做類似<result name="input" type="chain">ShowData</result>的事情,然後使用MessageStoreInterceptor來恢復數據(但我仍然不知道如何恢復用戶已經引入的以前的數據輸入)。但是這是我試圖避免的解決方案,因爲我讀到使用鏈不是一個好主意。

那麼,如何在這種情況下添加一些驗證而不會丟失任何數據並且不使用鏈?

回答

1

如果您的問題只是檢索 DB數據在第一個操作中您有幾個選項。

  1. 使用Preparable並使兩個操作都使用相應的服務檢索數據。
  2. 相同,但同時具有兩個操作繼承超類的prepare方法。
  3. 保持數據會話,直到不需要(可以手動完成,使用攔截器等)

如果您關注的是以前形式數據(在這個問題沒有表示),那麼你也有類似的選項:

  1. 隱藏字段(如塔潘的答案),但你仍然需要驗證它,如果它不已經在DB。 (如果數據庫位於數據庫中,您可以檢索它,如果不存在,並且您需要將隱藏數據的驗證錯誤重定向回先前的表單)。
  2. 將該數據保留在會話中,避免重新驗證。刪除成功提交的數據。 (也可以通過現有的或新的攔截器或手動完成。)

這兩種情況都可能有其他選項。

最終,如果您只使用鏈接進行數據檢索,那麼這是一個糟糕的主意 - 這恰好是Preparable適用的場景,並且消除了操作之間的耦合。

2

您的一個選擇是針對您從以前的操作中恢復的每個數據聲明隱藏變量,並使用相同的名稱。 第二個選項,如果你想使用鏈,那麼你可以使用重定向的struts.xml文件,並通過在struts.xml發送您恢復的數據本身,例如是:

<action name="ShowData" class="foo"> 
     <result>foo.jsp</result>    
     <result name="redirect" type="redirect"> 
      <![CDATA[paxAcctCharge.do?value1=${value1}&value2=${value2}]]> 
     </result> 
    </action> 

希望這將有助於。

+0

如果我這樣做,我失去了驗證,不是嗎? – Pigueiras

+0

是的,你將失去對第一個動作的驗證,但仍然可以對第二個動作進行驗證,但我認爲這很好,我認爲如果你使用隱藏變量,它的值已經被驗證,現在你只需要驗證另一個值我認爲可以輕鬆完成的頁面.... –

相關問題