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

时间:2011-05-18 21:08:48

标签: 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>

如您所见,如果验证成功,我有一个我想提交给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>

我正在试图找出哪个选项更符合我的目的。

感谢您的意见。

3 个答案:

答案 0 :(得分: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>

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

只需几个不同的解决方案即可让您只使用一个操作类。

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

使用

进行批注
  

@SkipValidation

关于您不需要验证的方法。