|
1,BaseValidator的修改非常简单,增加了一个submitName属性及其getter和setter。用于保存校验器适用的提交按钮的ID。
// whether skip this validator
public boolean isSkipValid(IFormComponent field) {
IPage page = field.getPage();
return (page instanceof
XtradeBasePage && this.getSubmitName() != null && !this
.getSubmitName()
.equals(((XtradeBasePage) page).getSubmitName()));
}
// whether form range's validator
public boolean isFormValid() {
return this.getSubmitName() == null;
}
//add validation script
public void addScriptContent(IRequestCycle cycle, IComponent field,
String submitListener) {
TapestryUtils.getPageRenderSupport(cycle, field)
.addInitializationScript(submitListener);
}
2,MinLength的属性修改:
public void setMinLength(String minLength) {
if (minLength.lastIndexOf("_") == -1) {
_minLength = Integer.parseInt(minLength);
} else {
_minLength = Integer.parseInt(minLength.substring(minLength
.lastIndexOf("_") + 1));
this.setSubmitName(minLength.substring(0, minLength
.lastIndexOf("_")));
}
}
public String getMinLength() {
if (this.getSubmitName() == null)
return _minLength + "";
else
return this.getSubmitName() + "_" + _minLength;
}
用于解析提交按钮ID和最小值。格式:SubmitID_MinLength,如:search_5
3,同时,需要修改validate方法,用于服务器端校验:
public void validate(IFormComponent field, ValidationMessages messages,
Object object) throws ValidatorException {
String string = (String) object;
if (!this.isSkipValid(field)) {
if (string == null || string.length() < _minLength)
throw new ValidatorException(buildMessage(messages, field),
ValidationConstraint.MINIMUM_WIDTH);
}
}
其中绿色部分是为了兼容Tapestry缺省的做法:如果不加提交按钮ID前缀,则对所以提交按钮进行校验。
4,当然了,客户端校验的代码也需要修改:
public void renderContribution(IMarkupWriter writer, IRequestCycle cycle,
FormComponentContributorContext context, IFormComponent field) {
context
.includeClasspathScript("/org/apache/tapestry/form/validator/StringValidator.js");
context
.includeClasspathScript("/com/fitechlabs/xtrade/web/tapestry/validator/MinLengthValidator.js");
String message = buildMessage(context, field);
if (this.isFormValid()) {
context.addSubmitHandler(Script.getFormMinLengthScript(field,
_minLength, TapestryUtils.enquote(message)));
} else {
this.addScriptContent(cycle, field, Script
.getSubmitMinLengthScript(this.getSubmitName(), field,
_minLength, TapestryUtils.enquote(message)));
}
}
其中绿色部分是原来的默认操作。
5,MinLengthValidator.js代码比较简单
TapestryEx.minLengthValid=function(event,formId,fieldId,minLength,message){
var field = document.getElementById(formId).elements[fieldId];
if (field.value.length < minLength)
event.invalid_field(field, message)
}
6,Script.java代码
public static String getFormMinLengthScript(IFormComponent field,
int minLength, String message) {
StringBuffer buffer = new StringBuffer();
buffer
.append("function(event) { Tapestry.validate_min_length(event,
'");
buffer.append(field.getClientId());
buffer.append("', ");
buffer.append(minLength);
buffer.append(", ");
buffer.append(message);
buffer.append("); }");
return buffer.toString();
}
public static String getSubmitMinLengthScript(String submitName,
IFormComponent field, int minLength, String message) {
StringBuffer buffer = new StringBuffer();
buffer.append("TapestryEx.onclick(");
buffer.append("'" + submitName + "',");
buffer.append("function(event){TapestryEx.minLengthValid(event,");
buffer.append("'" + field.getForm().getId() + "',");
buffer.append("'" + field.getClientId() + "',");
buffer.append(minLength + ",");
buffer.append(message + ");});");
return buffer.toString();
}
其它的Validator根据MinLength进行相应的修改即可。
|