Struts 2验证器

时间:2014-07-04 14:37:18

标签: java struts2 validation

我的struts2验证器有问题(我在struts2中是新的)。

我的页面上有2个按钮,每个按钮验证2个公共规则,第二个按钮添加另一个特定规则。

这是我的配置:

我的行动是VPJ001Action.java

struts.xml 配置文件如下所示:

 <action name="VPJ001" class="VPJ001Action">
     <result>/jsp/test.jsp</result>
 </action>
 <action name="VPJ001ValidationAction" method="validation" class="VPJ001Action">
     <result name="PAGE_VPJ002" type="chain">VPJ002!execute</result>
     <result>/jsp/test1.jsp</result>
 </action>
 <action name="VPJ001DiffusionMailAction" method="diffusionMail" class="VPJ001Action">
     <result>/jsp/test.jsp</result>
 </action>

我的第一个按钮调用VPJ001ValidationAction,第二个按钮调用VPJ001DiffusionMailAction

我的验证器配置:

VPJ001Action-validation.xml 包含2个公共规则:

<validators>
    <field name="bassin">
       <field-validator type="required">
         <message key="validation.bassin.requis"/>
       </field-validator>
    </field>
    <field name="moisAValider">
        <field-validator type="required">
           <message key="validation.mois.requis"/>
        </field-validator>
    </field>
</validators>

VPJ001Action-VPJ001DiffusionMailAction-validation.xml 包含特定规则:

<validators>
<field name="moisAValider">
    <field-validator type="regex" short-circuit="true">
          <param name="expression">.*[\*]$</param>
          <message key="validation.mois.valide"/>
     </field-validator>
</field>
</validators>

结果如下:

当我点击2个按钮时,我有一个带有2个公共规则的弹出窗口,因为我没有在页面上选择任何内容,它的工作正常。

当我选择一个bassin和一个moisAValider,如果我点击验证按钮,一切正常,我重定向好页面

当我选择一个bassin和一个moisAValider时,如果我点击diffusionMailbutton,页面会刷新并弹出一个弹出窗口,其中包含我的特定规则(正则表达式未被尊重)但该页面已被重新加载!

我希望有这种情况:

如果我点击验证按钮而没有选择任何内容,我想要一个不受尊重的2个公共规则的弹出窗口

如果我点击diffusionMailButton而没有选择任何东西,我想要一个不受尊重的2个公共规则和特定规则的弹出窗口,

有可能吗?

我希望特定规则的验证将在客户端而不是在服务器端完成,因为如果在服务器端完成,则重新加载页面并且我的所有列表都是空的...我需要重新加载所有如果所有验证器都可以在客户端完成,则列表并不是必需的......

谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

在我看来,您希望客户端验证为什么不使用javascript或jquery,您的问题将得到解决。 我可以评论但是我不能。以下是供您参考的链接。

javascript form validation

jquery example

struts2中有一种方法可以使用javascript ajax

在struts.xml中

,您可以将方法结果定义为: -

<result type="stream">
  <param name="contentType">text/html</param>
  <param name="inputName">inputStream</param>
 </result>

然后在你的行动方法中,你可以检查你想要检查的任何内容,然后如果验证是正确的,那么设置如下: -

this.setInputStream(new ByteArrayInputStream(SUCCESS.getBytes()));

如果验证失败则

this.setInputStream(new ByteArrayInputStream(ERROR.getBytes()));

这一切都来自struts方面。 在你的表单提交在java脚本中,你可以做这样的

$.ajax({
                        traditional: true,
                        type: "POST", 
                        url : ctxPath + "/yourActionName",
                        data : "yourField="+value,
                        dataType: "text",
                        success : function(data, success) {
                            if(data.indexOf("success")==-1){
                               alert("Action returned Error");
                                 return false;
                            }else{
                                alert("Action returned Success");

                            }
                        },
                    });

答案 1 :(得分:0)

我找到了解决方案。

因为验证器没有做我想要的,我只为2个按钮添加了2个验证器(那些验证器是客户端验证),并且我使用<field-validator type="expression">添加了一个验证器来调用java方法。此方法检查请求的操作,并在需要时返回true或false。

最后一点是当这个方法返回false时,我被重定向到jsp并且我的所有selectbox都被刷新并且为空,这是因为当我提交我的表单时,所有列表都没有传递给服务器。我需要使用列表向表单添加隐藏的输入。因为我使用List我已经完成了一个转换器,它将结果序列化为只有一个隐藏的输入,如下所示:

<input type="hidden" name="listeBassinSurveillance" id="formulaireVPJ_listeBassinSurveillance" value="H4sIAAAAAAAAAJ2WS4/bVBTHbzJ5dR5tmCmdMtMBS0gVCCWTGdJ.....">

当我提交表单时,该值被反序列化并且所有值都放在操作的列表中,所以当我刷新jsp时,我的所有列表都不是空的!

这似乎很复杂,但很容易实现和清楚。

感谢所有人!