1

我有一个动作,称为ShowData从数据库中恢复数据并将其放入 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 来恢复数据(但我仍然不知道如何恢复用户在输入中引入的先前数据)。但这是我试图避免的解决方案,因为我读到使用链不是一个好主意。

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

4

2 回答 2

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>

希望这会有所帮助。

于 2012-07-05T00:11:12.253 回答
1

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

  1. 使用Preparable并让这两个操作使用适当的服务检索数据。
  2. 相同,但两个动作都prepare从超类继承方法。
  3. 将数据保留在会话中,直到不需要(可以手动完成,使用拦截器等)

如果您关心的是以前的表单数据(问题中未指明),那么您有类似的选择:

  1. 隐藏字段(作为 Tapan 的回答),但如果它还没有在数据库中,你仍然需要验证它。(如果它在数据库中,您可以检索它。如果不是,并且您对隐藏数据有验证错误,则需要重定向回以前的表单。)
  2. 将这些数据保留在会话中,避免重新验证。删除成功提交的数据。(同样可以通过现有的或新的拦截器,或手动实现。)

对于这两种情况,可能还有其他一些选择。

归根结底,如果您仅将链用于数据检索,那是个坏主意——这正是Preparable适用的场景,并消除了动作之间的耦合。

于 2012-07-11T12:48:30.400 回答