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

jac*_*sta 2 java struts2

请原谅我; 我对struts有点新意.我遇到的问题是,当页面加载时我的验证发生,而不是我实际提交表单时.我一直在Google上搜索和搜索论坛,并且没有运气.我显然做了一些不正确的事情应该很容易确定,但我还没有找到我的问题.

这是我的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>
Run Code Online (Sandbox Code Playgroud)

如您所见,如果验证成功,我有一个我想提交给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>   
Run Code Online (Sandbox Code Playgroud)

您将提供的任何帮助将不胜感激!

谢谢!


@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>
Run Code Online (Sandbox Code Playgroud)

我想弄清楚哪个选项对我来说更好.

感谢您的输入.

Dus*_*lmi 5

正如nmc所说,验证会触发操作,这就是导致验证发生的原因.但是,您仍然可以在不将其分为两个不同的操作的情况下执行此操作.

首先,您可以通过删除init方法并仅使用输入来解决此问题 - 因此您的初始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>
Run Code Online (Sandbox Code Playgroud)

使用这个xml只是告诉验证拦截器不要为init或输入方法触发.

只是几个不同的解决方案,让您只使用一个动作类.