在Struts2中如何避免这种情况下的“链”?

时间:2012-07-04 08:33:15

标签: java 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来恢复数据(但我仍然不知道如何恢复以前的数据)用户在输入中引入的数据)。但这是我试图避免的解决方案,因为我读到使用链不是一个好主意。

那么,在这种情况下如何在不丢失任何数据且不使用链的情况下添加一些验证?

2 个答案:

答案 0 :(得分:2)

您可以选择针对您从上一个具有相同名称的操作中恢复的每个数据声明隐藏变量。 第二个选项如果你想使用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 :(得分:1)

如果您的担忧只是在第一个操作中检索数据库数据,那么您有几个选择。

  1. 使用Preparable并让两个操作都使用适当的服务检索数据。
  2. 相同,但两个动作都从超类继承prepare方法。
  3. 将数据保持在会话中直到不需要(可以手动完成,使用拦截器等)
  4. 如果您关心的是以前的表单数据(问题中没有说明),那么您有类似的选择:

    1. 隐藏字段(如Tapan的答案),但如果数据库中已经,您仍需要验证它。 (如果它在数据库中,您可以检索它。如果不是,并且您对隐藏数据有验证错误,则需要将其重定向回上一个表单。)
    2. 将数据保留在会话中,避免重新验证。删除成功提交的数据。 (再次通过现有或新的拦截器或手动执行。)
    3. 这两种情况都可能有其他一些选择。

      最终,如果你只使用链进行数据检索,这是一个坏主意 - 这正是Preparable的用途,并消除了动作之间的耦合。