簡體   English   中英

在Struts2中如何避免這種情況下的“鏈”?

[英]How do I avoid “chain” in this situation in Struts2?

我有一個名為ShowData的Action,可以從數據庫中恢復數據並將其放入jsp中。

在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來恢復數據(但我仍然沒有知道如何恢復用戶在輸入中引入的先前數據。 但這是我試圖避免的解決方案,因為我讀到使用鏈不是一個好主意。

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

您可以選擇針對您從之前的具有相同名稱的操作中恢復的每個數據聲明隱藏變量。 第二個選項如果你想使用Chain,那么你可以在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>

希望這會有所幫助。

如果您只關心在第一個操作中檢索數據庫數據,那么您有幾個選擇。

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

如果您關心的是以前的表格數據(問題中沒有說明),那么您有類似的選擇:

  1. 隱藏字段(如Tapan的答案),但如果它不在數據庫中,您仍需要驗證它。 (如果它在DB中,您可以檢索它。如果不是,並且您對隱藏數據有驗證錯誤,則需要重定向回到上一個表單。)
  2. 將數據保留在會話中,避免重新驗證。 刪除成功提交的數據。 (再次通過現有或新的攔截器或手動執行。)

對於這兩種情況,可能還有其他一些選擇。

最終,如果您僅使用鏈進行數據檢索,那么這是一個壞主意 - 這正是Preparable的用途,並消除了操作之間的耦合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM