如何在Struts2的这种情况下避免“链”?
问题描述:
我有一个动作,名为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来恢复数据(但我仍然不知道如何恢复用户已经引入的以前的数据输入)。但是这是我试图避免的解决方案,因为我读到使用链不是一个好主意。
那么,如何在这种情况下添加一些验证而不会丢失任何数据并且不使用链?
答
如果您的问题只是检索 DB数据在第一个操作中您有几个选项。
- 使用
Preparable
并使两个操作都使用相应的服务检索数据。 - 相同,但同时具有两个操作继承超类的
prepare
方法。 - 保持数据会话,直到不需要(可以手动完成,使用拦截器等)
如果您关注的是以前形式数据(在这个问题没有表示),那么你也有类似的选项:
- 隐藏字段(如塔潘的答案),但你仍然需要验证它,如果它不已经在DB。 (如果数据库位于数据库中,您可以检索它,如果不存在,并且您需要将隐藏数据的验证错误重定向回先前的表单)。
- 将该数据保留在会话中,避免重新验证。删除成功提交的数据。 (也可以通过现有的或新的拦截器或手动完成。)
这两种情况都可能有其他选项。
最终,如果您只使用链接进行数据检索,那么这是一个糟糕的主意 - 这恰好是Preparable
适用的场景,并且消除了操作之间的耦合。
答
您的一个选择是针对您从以前的操作中恢复的每个数据声明隐藏变量,并使用相同的名称。 第二个选项,如果你想使用链,那么你可以使用重定向的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>
希望这将有助于。
如果我这样做,我失去了验证,不是吗? – Pigueiras
是的,你将失去对第一个动作的验证,但仍然可以对第二个动作进行验证,但我认为这很好,我认为如果你使用隐藏变量,它的值已经被验证,现在你只需要验证另一个值我认为可以轻松完成的页面.... –