我的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个公共规则和特定规则的弹出窗口,
有可能吗?
我希望特定规则的验证将在客户端而不是在服务器端完成,因为如果在服务器端完成,则重新加载页面并且我的所有列表都是空的...我需要重新加载所有如果所有验证器都可以在客户端完成,则列表并不是必需的......
谢谢你的帮助!
答案 0 :(得分:0)
在我看来,您希望客户端验证为什么不使用javascript或jquery,您的问题将得到解决。 我可以评论但是我不能。以下是供您参考的链接。
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时,我的所有列表都不是空的!
这似乎很复杂,但很容易实现和清楚。
感谢所有人!