Struts 2 – 重用自定义表达式validation器

在struts 2中,我们可以开发@CustomValidator ,它可以在应用程序范围内使用

 @CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo") 

为了validation@ExpressionValidator一个FIELD我们使用@ExpressionValidator

 @ExpressionValidator(expression = "( (!''.equals(account.firstName) && (!''.equals(account.lastName) ) || (presonalAccount == false)", key = "validate.account.name") 

如果表达式太复杂并且需要在MORE THAN ONE FIELD上工作,我们使用OGNL来调用静态方法。 静态方法将执行validation并返回一个boolean

 @ExpressionValidator(expression = "@foo.bar.CalendarUtil@compareDates(fromDate,toDate)", key = "validate.date.before") 

以上是自定义表达式validation器的一些方法! 我们在应用程序范围内使用@foo.bar.CalendarUtil@compareDates来为我们进行此validation。

还有另一种方法可以让我们使用自定义宽validation器吗?! 是否有任何可以添加到struts的自定义表达式validation器,我们可以按照我们使用@CustomValidator的方式调用它

创建自定义validation器(不与字段相关):

 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文件中注册自定义validationvalidators.xml

      

在操作中使用validation器:

 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; } 

如果需要validation多个字段,可以使用非字段自定义validation器。 非字段自定义validation器应扩展ValidatorSupport并实现validate方法。 然后在-validation.xml应用自定义validation器或使用@CustomValidator注释。 在那里,您可以将自定义表达式添加为@ValidationParameter并在进行validation时@ValidationParameter进行解析。 请注意,我在这个答案中首先使用的这种技术:

 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类的validate方法。 通过validation拦截器控制对此方法的调用。 这种validation方法称为programmatic方法,默​​认情况下使用,无论在declarativevalidation期间应用的validation器如何。