Java 当页面加载而不是提交时发生struts验证
请原谅我;我对struts有点陌生。我遇到了一个问题,我的验证发生在页面加载时,而不是我实际提交表单时。我一整天都在论坛上搜索和搜索,没有任何运气。我显然做了一些不正确的事情,这应该很容易确定,但我还没有发现我的问题是什么 下面是我的struts.xml的一个片段:Java 当页面加载而不是提交时发生struts验证,java,struts2,Java,Struts2,请原谅我;我对struts有点陌生。我遇到了一个问题,我的验证发生在页面加载时,而不是我实际提交表单时。我一整天都在论坛上搜索和搜索,没有任何运气。我显然做了一些不正确的事情,这应该很容易确定,但我还没有发现我的问题是什么 下面是我的struts.xml的一个片段: <action name="*Test" method="{1}" class="testClass"> <interceptor-ref name="defaultStack"/>
<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,它似乎实际执行了上面提到的相同操作。这就是我一直在引用我的工作的项目中所采用的方式。