是否可以进行此条件表达式验证?:
(invitation.id==null and (newText==null or newText.isEmpty()))
我已经尝试了好几种方法,但是没有实现它。 这个版本正在运行,但在服务器端,如果invitation.id为null或空,则忽略...任何想法???:
<field name="newText">
<field-validator type="fieldexpression">
<param name="expression">!(invitation.id eq null and (newText eq null or newText.empty))</param>
<message>${getText("validation.required")}</message>
</field-validator>
</field>
http://struts.apache.org/release/2.2.x/docs/fieldexpression-validator.html
表达式有什么问题?谢谢!
答案 0 :(得分:2)
您的问题是您正在尝试将另一个字段(invitation.id
)验证到newText
字段验证程序中(我认为不可能,但我不确定)。
但是,您可以将其拆分为两个验证器,将错误信息提交给失败案例,这是更正确的imho;
<field name="invitation.id">
<field-validator type="required">
<message>${getText("validation.invitation.id.required")}</message>
</field-validator>
</field>
<field name="newText">
<field-validator type="fieldexpression">
<param name="expression">
<![CDATA[
newText != null && !newText.trim().empty())
]]>
</param>
<message>${getText("validation.newText.required")}</message>
</field-validator>
</field>
,如果你需要修剪它,否则它可能变得简单
<field name="invitation.id">
<field-validator type="required">
<message>${getText("validation.invitation.id.required")}</message>
</field-validator>
</field>
<field name="newText">
<field-validator type="requiredString">
<message>${getText("validation.newText.required")}</message>
</field-validator>
</field>
请注意,required
适用于所有非文字字段,而requiredString
仅适用于文字字段。
Expression Validator非常强大,但它应该用于更复杂的目的:
例如,如果要从另一个动态读取日期(通过Getter)验证日期,请执行操作;假设您之前选择了一个用户,并且您需要根据用户的开始和结束有效期间隔从页面验证日期;但是如果没有插入日期,你也希望通过验证,因为它已经由必需的验证器处理(因此你不会引发两条消息):
<field name="inputDate">
<field-validator type="required">
<message><![CDATA[ Input Date is mandatory ]]></message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression">
<![CDATA[
inputDate==null ||
(inputDate >= chosenUser.startValidity
&&
inputDate <= chosenUser.EndValidity
)
]]>
</param>
<message>
<![CDATA[Input Date must be included in the User Validity interval
(from ${chosenUser.startValidity} to ${chosenUser.endValidity} )
]]>
</message>
</field-validator>
</field>
其中chosenUser
是您的操作中的用户对象(public User getChosenUser()
)
和startValidity和endValidity是User对象的属性(public Date getEndValidity()
)。
正如您所看到的,动态读取也可以在消息中执行...这就是表达式验证器的强大功能;)
答案 1 :(得分:1)
首先,表达式不是有效参数。如果您确实想在客户端进行验证,请尝试使用java-script或jquery进行验证。但是你必须在服务器端验证输入,因为有时用户可能会禁用 javascript 。那么在这种情况下你可以使用struts2 - 验证。
有关详细说明,请参阅http://viralpatel.net/blogs/struts2-validation-framework-tutorial-example/
答案 2 :(得分:1)
好的,最后我使用了客户端验证宽度jquery模拟struts2。
出于兼容性原因,我不喜欢这个,如果有办法以标准方式进行,我会提供任何帮助。
删除struts验证:
<!--<field name="newText">
<field-validator type="fieldexpression">
<param name="expression">!((invitation.id==null or invitation.id.empty) and (newText==null or newText.empty))</param>
<message>${getText("validation.required")}</message>
</field-validator>
</field>-->
添加js / jquery代码:
function mySubmit() {
if ((invitationId==null || invitationId<0) && $("#text").val().trim()=='') {
var trStrutsFieldError='<tr errorfor="text">'+
'<td colspan="2" align="center" valign="top"><span class="errorMessage">'+strValidationRequired+'</span></td>'+
'</tr>';
$(trStrutsFieldError).insertBefore($("#text").parent().parent());
return false;
}
return true;
}
$(document).ready(function(){
$("form").submit(function(event) {
$.each($("form").find("span.errorMessage"), function() { /* <tr errorfor="title"><td colspan="2" align="center"><span classname="errorMessage" class="errorMessage">Campo requerido */
return false;
});
if ($(mySubmit).exists()) {
if (!mySubmit())
return false;
}
return true;
});
});