Tapestry数据校验-修改各Validator
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进行相应的修改即可。
|