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
方法,默认情况下使用,无论在declarative
validation期间应用的validation器如何。