请原谅我;我对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>
我正在试图找出哪个选项更符合我的目的。
感谢您的意见。
答案 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
关于您不需要验证的方法。