在 Struts 2 中重用自定义表达式验证器
Reusing Custom Expression Validator in Struts 2
在Struts2中我们可以开发@CustomValidator
可以在应用范围内使用
@CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo")
为了验证 ,我们使用 @ExpressionValidator
个字段
@ExpressionValidator(expression =
"( (!''.equals(account.firstName) && (!''.equals(account.lastName) )
|| (presonalAccount == false)",
key = "validate.account.name")
如果表达式太复杂并且需要处理 多 个字段,我们使用 OGNL 调用静态方法。静态方法将进行验证,例如 return a boolean
@ExpressionValidator(expression = "@foo.bar.CalendarUtil@compareDates(fromDate,toDate)", key = "validate.date.before")
以上是 自定义 表达式验证器的一些方式 !
我们在整个应用程序中使用 @foo.bar.CalendarUtil@compareDates
来为我们进行此验证。
是否有另一种方法可以让我们使用自定义宽验证器?!
是否有任何自定义表达式验证器可以添加到 Struts 中,我们可以像使用 @CustomValidator
一样在 Action
中调用它?
创建自定义验证器(与字段无关):
public final class CompareDatesValidator extends ValidatorSupport {
private String fromDate; // getter and setter
private String toDate; // getter and setter
@Override
public void validate(Object o) throws ValidationException {
Date d1 = (Date)parse(fromDate, Date.class);
Date d2 = (Date)parse(toDate, Date.class);
if (d1==null || d2==null || d2.before(d1)){
addActionError(getDefaultMessage());
}
}
}
在 validators.xml
文件中注册自定义验证器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<validator name="compareDatesValidator"
class="org.foo.bar.CompareDatesValidator"/>
</validators>
在操作中使用验证器:
private Date startDate; // getter and setter
private Date endDate; // getter and setter
@Validations(
customValidators={
@CustomValidator(type="compareDatesValidator",
message="Dates provided are not valid."
parameters={
@ValidationParameter(name="fromDate", value="${startDate}"),
@ValidationParameter(name="toDate", value="${endDate}")})})
public String execute(){
return SUCCESS;
}
如果您需要验证多个字段,您可以使用非字段自定义验证器。非字段自定义验证器应该扩展 ValidatorSupport
并实现 validate
方法。然后在 -validation.xml
中应用自定义验证器或使用 @CustomValidator
注释。您可以在那里添加自定义表达式 @ValidationParameter
并在进行验证时解析它们。
注:
这个技巧我首先在this答案中使用:
public class RetypeValidator extends ValidatorSupport {
private String value = null;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
private String retypeValue = null;
public String getRetypeValue() {
return retypeValue;
}
public void setRetypeValue(String value) {
retypeValue = value;
}
@Override
public void validate(Object object) throws ValidationException {
String value = (String) parse(this.value, String.class);
String retypeValue = (String) parse(this.retypeValue, String.class);
if (value != null && retypeValue != null && !value.equals(retypeValue))
addActionError(getDefaultMessage());
}
}
另一种选择是覆盖 ActionSupport
class 的 validate
方法。通过 validation
interceptor 控制对该方法的调用。这种验证方法被称为 programmatic,默认情况下使用,无论在 declarative 验证期间应用的验证器如何。
在Struts2中我们可以开发@CustomValidator
可以在应用范围内使用
@CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo")
为了验证 ,我们使用 @ExpressionValidator
@ExpressionValidator(expression =
"( (!''.equals(account.firstName) && (!''.equals(account.lastName) )
|| (presonalAccount == false)",
key = "validate.account.name")
如果表达式太复杂并且需要处理 多 个字段,我们使用 OGNL 调用静态方法。静态方法将进行验证,例如 return a boolean
@ExpressionValidator(expression = "@foo.bar.CalendarUtil@compareDates(fromDate,toDate)", key = "validate.date.before")
以上是 自定义 表达式验证器的一些方式 !
我们在整个应用程序中使用 @foo.bar.CalendarUtil@compareDates
来为我们进行此验证。
是否有另一种方法可以让我们使用自定义宽验证器?!
是否有任何自定义表达式验证器可以添加到 Struts 中,我们可以像使用 @CustomValidator
一样在 Action
中调用它?
创建自定义验证器(与字段无关):
public final class CompareDatesValidator extends ValidatorSupport {
private String fromDate; // getter and setter
private String toDate; // getter and setter
@Override
public void validate(Object o) throws ValidationException {
Date d1 = (Date)parse(fromDate, Date.class);
Date d2 = (Date)parse(toDate, Date.class);
if (d1==null || d2==null || d2.before(d1)){
addActionError(getDefaultMessage());
}
}
}
在 validators.xml
文件中注册自定义验证器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<validator name="compareDatesValidator"
class="org.foo.bar.CompareDatesValidator"/>
</validators>
在操作中使用验证器:
private Date startDate; // getter and setter
private Date endDate; // getter and setter
@Validations(
customValidators={
@CustomValidator(type="compareDatesValidator",
message="Dates provided are not valid."
parameters={
@ValidationParameter(name="fromDate", value="${startDate}"),
@ValidationParameter(name="toDate", value="${endDate}")})})
public String execute(){
return SUCCESS;
}
如果您需要验证多个字段,您可以使用非字段自定义验证器。非字段自定义验证器应该扩展 ValidatorSupport
并实现 validate
方法。然后在 -validation.xml
中应用自定义验证器或使用 @CustomValidator
注释。您可以在那里添加自定义表达式 @ValidationParameter
并在进行验证时解析它们。
注:
这个技巧我首先在this答案中使用:
public class RetypeValidator extends ValidatorSupport { private String value = null; public String getValue() { return value; } public void setValue(String value) { this.value = value; } private String retypeValue = null; public String getRetypeValue() { return retypeValue; } public void setRetypeValue(String value) { retypeValue = value; } @Override public void validate(Object object) throws ValidationException { String value = (String) parse(this.value, String.class); String retypeValue = (String) parse(this.retypeValue, String.class); if (value != null && retypeValue != null && !value.equals(retypeValue)) addActionError(getDefaultMessage()); } }
另一种选择是覆盖 ActionSupport
class 的 validate
方法。通过 validation
interceptor 控制对该方法的调用。这种验证方法被称为 programmatic,默认情况下使用,无论在 declarative 验证期间应用的验证器如何。