请原谅我; 我对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)
我想弄清楚哪个选项对我来说更好.
感谢您的输入.
正如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或输入方法触发.
只是几个不同的解决方案,让您只使用一个动作类.