tapestry验证textarea

 tapestry验证textarea

ValidTextArea.java:
java代码: 

package com. tomxp. web. components. valid;

import org. apache. tapestry. ApplicationRuntimeException;
import org. apache. tapestry. IForm;
import org. apache. tapestry. IMarkupWriter;
import org. apache. tapestry. IRequestCycle;
import org. apache. tapestry. Tapestry;
import org. apache. tapestry. form. TextArea;
import org. apache. tapestry. valid. IValidationDelegate;
import org. apache. tapestry. valid. IValidator;
import org. apache. tapestry. valid. ValidatorException;

/**
* @author Peter Butler
*/

public abstract class ValidTextArea extends TextArea {
        WriterErrorDecorator myWriter = new WriterErrorDecorator (this );
       
        public ValidTextArea ( ) {
                super ( );
        }
       
        public abstract IValidator getValidator ( );

        public abstract String getDisplayName ( );
       
        protected void renderComponent (IMarkupWriter writer, IRequestCycle cycle ) {
                IForm form = getForm (cycle );
                IValidationDelegate delegate = form. getDelegate ( );

                if (delegate == null )
                        throw new ApplicationRuntimeException (Tapestry. format ("ValidTextArea. no-delegate", getExtendedId ( ), getForm ( ). getExtendedId ( ) ), this, null, null );

                IValidator validator = getValidator ( );

                if (validator == null )
                        throw Tapestry. createRequiredParameterException (this, "validator" );

                boolean rendering = !cycle. isRewinding ( );
               
                IMarkupWriter superWriter;
                if (rendering ) {
                        delegate. writePrefix (writer, cycle, this, validator );
                        myWriter. init (writer, delegate, validator, cycle );
                        superWriter = myWriter;
                } else {
                        superWriter = writer;
                }
               
                super. renderComponent (superWriter, cycle );

                String name = getName ( );

                if (!rendering && !isDisabled ( ) ) {
                        String value = cycle. getRequestContext ( ). getParameter (name );
                        updateValue (value );
                }

                if (rendering ) {
                        delegate. writeSuffix (writer, cycle, this, validator );
                        myWriter. clear ( );
                }
        }
       
        protected void updateValue ( String value ) {
                Object objectValue = null;
                IValidationDelegate delegate = getForm ( ). getDelegate ( );

                delegate. recordFieldInputValue (value );

                try {
                        objectValue = getValidator ( ). toObject (this, value );
                } catch (ValidatorException ex ) {
                        delegate. record (ex );
                        return;
                }

                setValue ( ( String )objectValue );
        }       
}




ValidTextArea.jwc
java代码: 


<?xml version=" 1. 0" encoding="UTF- 8"?>
<!DOCTYPE component-specification
      PUBLIC "- //Apache Software Foundation//Tapestry Specification 3.0//EN"
      "http: //jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
<!-- generated by Spindle, http: //spindle.sourceforge.net -->

<component-specification class="com. tomxp. web. components. valid. ValidTextArea" allow-body="no">
  <description>
  A multi-line valid text area.
  </description>
 
  <parameter name="value" type="java. lang. String" required="yes" direction="form"/>
 
  <parameter name="disabled" type=" boolean" direction="in"/>

  <parameter name="validator" type="org. apache. tapestry. valid. IValidator" required="yes" direction="in">
    <description>
    Converts value to a string and parses strings back into object values.
    </description>
  </parameter>
   
  <parameter name="displayName" type="java. lang. String" required="yes" direction="auto">
    <description>
    Name used by FieldLabel and when generating validation error messages.
    </description>
  </parameter>
   
  <reserved-parameter name="name"/>
 
  <property-specification name="name" type="java. lang. String"/>
  <property-specification name="form" type="org. apache. tapestry. IForm"/>
</component-specification>




java代码: 

package com. tomxp. web. components. valid;

import org. apache. tapestry. IMarkupWriter;
import org. apache. tapestry. IRequestCycle;
import org. apache. tapestry. form. IFormComponent;
import org. apache. tapestry. valid. IValidationDelegate;
import org. apache. tapestry. valid. IValidator;

/**
* @author Peter Butler
*/

public class WriterErrorDecorator implements IMarkupWriter {
        private IMarkupWriter actual;
        private IValidationDelegate delegate;
        private IValidator validator;
        private IRequestCycle cycle;
        private IFormComponent field;

        public WriterErrorDecorator (IFormComponent field ) {
                this. field = field;
        }
       
        public void init (IMarkupWriter actual, IValidationDelegate delegate, IValidator validator, IRequestCycle cycle ) {
                this. actual = actual;
                this. delegate = delegate;
                this. validator = validator;
                this. cycle = cycle;
        }
       
        public void clear ( ) {
                this. actual = null;
                this. delegate = null;
                this. validator = null;
                this. cycle = null;
        }

        public void attribute ( String name, int value ) {
                actual. attribute (name, value );
        }

        public void attribute ( String name, boolean value ) {
                actual. attribute (name, value );
        }

        public void attribute ( String name, String value ) {
                actual. attribute (name, value );
        }

        public void attributeRaw ( String name, String value ) {
                actual. attributeRaw (name, value );
        }

        public void begin ( String name ) {
                actual. begin (name );
                validator. renderValidatorContribution (field, this, cycle );
                delegate. writeAttributes (this, cycle, field, validator );
        }

        public void beginEmpty ( String name ) {
                actual. beginEmpty (name );
                validator. renderValidatorContribution (field, this, cycle );
                delegate. writeAttributes (this, cycle, field, validator );
        }

        public boolean checkError ( ) {
                return actual. checkError ( );
        }

        public void close ( ) {
                actual. close ( );
        }

        public void closeTag ( ) {
                actual. closeTag ( );
        }

        public void comment ( String value ) {
                actual. comment (value );
        }

        public void end ( ) {
                actual. end ( );
        }

        public void end ( String name ) {
                actual. end (name );
        }

        public void flush ( ) {
                actual. flush ( );
        }

        public IMarkupWriter getNestedWriter ( ) {
                return actual. getNestedWriter ( );
        }

        public void print (char [ ] data, int offset, int length ) {
                actual. print (data, offset, length );
        }

        public void print (char value ) {
                actual. print (value );
        }

        public void print ( int value ) {
                actual. print (value );
        }

        public void print ( String value ) {
                actual. print (value );
        }

        public void println ( ) {
                actual. println ( );
        }

        public void printRaw (char [ ] buffer, int offset, int length ) {
                actual. printRaw (buffer, offset, length );
        }

        public void printRaw ( String value ) {
                actual. printRaw (value );
        }

        public String getContentType ( ) {
                return actual. getContentType ( );
        }
}

对于TextArea的长度验证,的确只有自己写组件。特别是当页面中已经使用Tapestry的FieldLabel+Validator效验的时候,如果仅仅是简单的将JS写在HTML里面,就会出现无法于Tapestry动态生成的JavaScript整合的问题。。。

我看了一下Ewaves贴的代码,似乎没有贴出.script文件。我自己写的组件虽然和上面的代码完全不一样,但是.script文件却是可以通用的,它能够自动生成动态的javascript。

java代码: 

<?xml version=" 1. 0" encoding="GBK"?>
<!-- $Id: DatePicker. script,v 1. 5 2004/ 03/ 09 18: 23: 50 hlship Exp $ -->
<!DOCTYPE script PUBLIC
        "- //Apache Software Foundation//Tapestry Script Specification 3.0//EN"
        "http: //jakarta.apache.org/tapestry/dtd/Script_3_0.dtd">
 
<script>
<!--

input symbols:

  textAreaScript: The TextAreaScript component.
 
output symbols:

  formValidateFunction The name of a form validator function that validates the fields.

-->
<include-script resource-path="/org/apache/tapestry/valid/Validator. js"/>

<input-symbol key="textAreaScript" class="com. cdmcs. tapestry. jwc. TextAreaScript"/>

<set key="name" expression="textAreaScript. name"/>

<set key="required" expression="textAreaScript. required"/>
<set key="minimumLength" expression="textAreaScript. minimumLength"/>
<set key="maximumLength" expression="textAreaScript. maximumLength"/>

<set key="requiredMessage" expression="textAreaScript. requiredMessage"/>
<set key="minimumLengthMessage" expression="textAreaScript. minimumLengthMessage"/>
<set key="maximumLengthMessage" expression="textAreaScript. maximumLengthMessage"/>

<set key="numberFormatEnable" expression="textAreaScript. numberFormatEnable"/>
<set key="numberLengthMessage" expression="textAreaScript. numberLengthMessage"/>
<set key="numberLength" expression="textAreaScript. numberLength"/>

<let key="baseName">
  document.$ {textAreaScript. form. name }.$ {name }       
</let>

<let key="formValidateFunction" unique="yes">
  validate_$ {name }       
</let>



<body>



<! [CDATA [
function $ {formValidateFunction } ( )
{
  var field = $ {baseName };
  var keycode = window. event. keyCode;
 
  if ( $ {numberFormatEnable } && !field. value. match (/^/d { 11 }$/ ) )
  {
          if ( field. value. length == 0 )
                  return true;
        return validator_invalid_field (field, "$ {numberLengthMessage }" );
  }
                 
  if ( $ {required } && field. value. length== 0 )
  {
          return validator_invalid_field (field, "$ {requiredMessage }" );
  }
                 
  if ( $ {required } && field. value. length<$ {minimumLength } )
  {
      return validator_invalid_field (field, "$ {minimumLengthMessage }" );
  }
                 
  if ( $ {required } && field. value. length>$ {maximumLength } )
  {
      return validator_invalid_field (field, "$ {maximumLengthMessage }" );
  }

  return true;
}

] ]>

</body>
</script>




我这段代码另外还有个功能,是效验11位手机号码,因为11的长度远大于Tapestry提动的NumberValidator范围,没办法,只好自己写了,想偷懒都不行。
 

你可能感兴趣的:(apache,String,null,tapestry,import,Components)