Tapestry数据校验Validator

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进行相应的修改即可。
 

你可能感兴趣的:(String,object,function,validation,buffer,tapestry)