Java 当页面加载而不是提交时发生struts验证

Java 当页面加载而不是提交时发生struts验证,java,struts2,Java,Struts2,请原谅我;我对struts有点陌生。我遇到了一个问题,我的验证发生在页面加载时,而不是我实际提交表单时。我一整天都在论坛上搜索和搜索,没有任何运气。我显然做了一些不正确的事情,这应该很容易确定,但我还没有发现我的问题是什么 下面是我的struts.xml的一个片段: <action name="*Test" method="{1}" class="testClass"> <interceptor-ref name="defaultStack"/>

请原谅我;我对struts有点陌生。我遇到了一个问题,我的验证发生在页面加载时,而不是我实际提交表单时。我一整天都在论坛上搜索和搜索,没有任何运气。我显然做了一些不正确的事情,这应该很容易确定,但我还没有发现我的问题是什么

下面是我的struts.xml的一个片段:

<action name="*Test" method="{1}" class="testClass">
            <interceptor-ref name="defaultStack"/>          
            <result name="init">jsp/index.jsp</result>
            <result name="input">jsp/index.jsp</result>
            <result name="submit">jsp/results.jsp</result>
</action>

jsp/index.jsp
jsp/index.jsp
jsp/results.jsp
如您所见,如果验证成功,我有一个操作要提交到results.jsp。否则,我希望它再次显示我的index.jsp。据我所知,页面导航正确。我可以导航到app/initTest.action并提交我的表单,它会将我带到结果页面并显示我的预期结果。我的问题在于验证

似乎验证正在工作,只是时间不对。我有一个[Action]-validation.xml,它创建在与操作绑定到的类相同的位置,当页面最初加载时,我已经在页面上看到了来自此xml文件的错误消息

下面是我的validation.xml文件中的内容:

<validators>
    <field name="TestBean.idNumber">
        <field-validator type="requiredstring">
            <message>Please select an item.</message>
        </field-validator>
    </field>
</validators>   

请选择一个项目。
如果您能提供任何帮助,我们将不胜感激

谢谢


@nmc, 我试图将使用单独操作的选项形象化。是这样的吗?如果验证失败,它会重定向回原始表单页面吗

<action name="*Test" method="{1}" class="testClass">         
        <result name="init">jsp/index.jsp</result>
        <result name="submit">initTestResults</result>
</action>
<action name="*TestResults" method="{1}" class="testClass2">
        <interceptor-ref name="defaultStack"/>          
        <result name="init">jsp/indexResults.jsp</result>
        <result name="input">jsp/indexResults.jsp</result>
</action>

jsp/index.jsp
initTestResults
jsp/indexResults.jsp
jsp/indexResults.jsp
我正试图找出哪个选项更适合我的目的


感谢您的输入。

验证将在验证文件名中指定的操作之前运行,无论结果如何。因此,如果有一个操作同时显示和处理表单,那么在显示和处理表单之前,验证将在该操作上运行


如果这不是您想要的行为,请将页面的显示/加载移动到另一个操作。

正如nmc所说,为该操作触发验证,这就是导致验证发生的原因。但是,您仍然可以这样做,而无需将其拆分为两个不同的操作

首先,您可以通过去掉init方法来解决这个问题,只需使用input,这样您的初始url将是inputTest而不是initTest。默认情况下,验证拦截器不会对输入方法触发。这就是通常的处理方式,以及我如何安排我的所有行动

如果设置为使用init,则实际上可以向验证侦听器指定要从验证中排除的方法。您可以将xml更改为如下所示:

<action name="*Test" method="{1}" class="testClass">    
        <interceptor-ref name="defaultStack">
            <param name="validation.excludeMethods">init,input</param>
        </interceptor-ref> 
        <result name="init">jsp/index.jsp</result>
        <result name="input">jsp/index.jsp</result>
        <result name="submit">jsp/results.jsp</result>
</action>

初始化,输入
jsp/index.jsp
jsp/index.jsp
jsp/results.jsp
使用此xml只是告诉验证拦截器不要为init或输入方法触发

只有两种不同的解决方案可以让您只使用一个action类。

用注释

@SkipValidation


在方法上,您不需要验证。

您可以尝试用
@SkipValidation
注释显示表单的操作方法。这适用于使用
validate()
方法进行手动验证。我不确定它是否适用于基于XML的验证。啊,这很有道理!谢谢你在这里支持我:)+1的输入法。实际上,我使用了一个自定义的动作映射器,使输入成为默认方法,然后我只使用execute进行表单处理。。。我看到您实际上可以在我的action类的init()方法上方添加@SkipValidation,它似乎实际执行了上面提到的相同操作。这就是我一直在引用我的工作的项目中所采用的方式。