2011-05-18 59 views
2

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

这里是我的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> 

我想弄清楚哪个选项更适合我的目的。

感谢您的输入。

+2

您可以尝试使用'@ SkipValidation'注释显示表单的操作方法。这适用于使用'validate()'方法进行手动验证。我不确定它是否适用于基于XML的验证。 – 2011-05-19 02:09:25

回答

4

验证在验证文件名中指定的操作之前运行,不管的结果。所以如果你有一个动作来显示和处理表单,那么验证将在显示之前和处理表单之前在该动作上运行。

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

+0

啊,这很有道理!感谢您与我在这里:) – jacosta 2011-05-19 02:09:26

5

正如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> 

使用此XML只是告诉验证拦截器不火的init或输入法。

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

+0

+1为输入法。我实际上使用了一个自定义动作映射器,它使输入成为默认方法,然后我只使用execute来进行表单处理。 – 2011-05-19 16:13:20

+0

这里有一个有趣的消息,类似于这个......我看到你实际上可以在我的动作类的init()方法之上添加@SkipValidation,它似乎实际上做了上面提到的同样的事情。这是我在一直引用我的工作的项目中完成的方式。 – jacosta 2011-05-19 21:09:04

0

的方法与

@SkipValidation

注释你不需要验证。

相关问题