Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何避免;连锁店;在Struts2的这种情况下?_Java_Struts2 - Fatal编程技术网

Java 我如何避免;连锁店;在Struts2的这种情况下?

Java 我如何避免;连锁店;在Struts2的这种情况下?,java,struts2,Java,Struts2,我有一个名为ShowData的操作,它从数据库中恢复数据并将其放入jsp struts.xml ... <action name="ShowData" class="foo"> <result>foo.jsp</result> </action> ... 现在我想给数据添加一些验证。如果DoSomething的返回类型如下:foo.jsp我将丢失在ShowData操作中恢复的数据,但是验证工作正常,用户先前的输入和错误将显示在jsp页面中

我有一个名为
ShowData
的操作,它从数据库中恢复数据并将其放入jsp

struts.xml

...
<action name="ShowData" class="foo">
   <result>foo.jsp</result>
</action>
...
现在我想给数据添加一些验证。如果
DoSomething
的返回类型如下:
foo.jsp
我将丢失在
ShowData
操作中恢复的数据,但是验证工作正常,用户先前的输入和错误将显示在jsp页面中

另一方面,我知道我可以使用
chain
,执行类似
ShowData
的操作,然后使用MessageStoreInterceptor恢复数据(但我仍然不知道如何恢复用户在输入中引入的以前的数据)。但这是一个解决方案,我试图避免,因为我读到使用链不是一个好主意


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

对于您来说,一个选项是针对您以前使用相同名称的操作恢复的每个数据声明隐藏变量。 第二个选项如果要使用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>

foo.jsp
希望这会有所帮助。

如果您的问题只是在第一个操作中检索数据库数据,那么您有一些选择

  • 使用
    Preparable
    ,让这两个操作使用适当的服务检索数据
  • 相同,但这两个操作都从超类继承
    prepare
    方法
  • 将数据保留在会话中,直到不需要为止(可以使用拦截器等手动完成)
  • 如果您关心的是以前的表单数据(问题中未指出),则您有类似的选项:

  • 隐藏字段(作为Tapan的答案),但如果数据库中还没有隐藏字段,则仍然需要对其进行验证。(如果它在数据库中,您可以检索它。如果它不在数据库中,并且您对隐藏数据有验证错误,则需要重定向回上一个表单。)
  • 将数据保存在会话中,避免重新验证。成功提交时删除数据。(同样可以通过现有或新的拦截器,或手动执行。)
  • 对于这两种情况,可能还有其他几种选择


    归根结底,如果您仅将chain用于数据检索,这是一个坏主意--这正是
    Preparable
    所针对的场景,并消除了操作之间的耦合。

    如果我这样做,我将失去验证,不是吗?是的,您将失去第一个操作的验证,但仍然可以对第二个操作进行验证,但我认为这很好,因为如果您使用隐藏变量,其中的值已经过验证,现在您只需要验证另一个页面的值,这很容易完成,我想。。。。
       <action name="ShowData" class="foo">
            <result>foo.jsp</result>            
            <result name="redirect" type="redirect">
                <![CDATA[paxAcctCharge.do?value1=${value1}&value2=${value2}]]>
            </result>
        </action>