我有一个名为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来恢复数据(但我仍然不知道如何恢复以前的数据)用户在输入中引入的数据)。但这是我试图避免的解决方案,因为我读到使用链不是一个好主意。
那么,在这种情况下如何在不丢失任何数据且不使用链的情况下添加一些验证?
答案 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)
如果您的担忧只是在第一个操作中检索数据库数据,那么您有几个选择。
Preparable
并让两个操作都使用适当的服务检索数据。prepare
方法。如果您关心的是以前的表单数据(问题中没有说明),那么您有类似的选择:
这两种情况都可能有其他一些选择。
最终,如果你只使用链进行数据检索,这是一个坏主意 - 这正是Preparable
的用途,并消除了动作之间的耦合。