<rdf:RDF
    xmlns:s='http://snipsnap.org/rdf/snip-schema#'
    xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
    xml:base='http://wiki.marandcustomsolutions.com/rdf'>
    <s:Snip rdf:about='http://wiki.marandcustomsolutions.com/rdf#Development/Java+%26+J2EE/Spring/Validation'
         s:cUser='mpecher'
         s:oUser=''
         s:mUser='mpecher'>
        <s:name>Development/Java &amp; J2EE/Spring/Validation</s:name>
        <s:content>1 Spring Validation&#xD;&#xA;Spring allows Valdiation to be defined to setter properties of a domain object:\\&#xD;&#xA;eg,&#xD;&#xA;{code}&#xD;&#xA;    /**&#xD;&#xA;     * @spring.validator type=&quot;required&quot;&#xD;&#xA;     * @spring.validator type=&quot;email&quot;&#xD;&#xA;     */&#xD;&#xA;    public void setEmail(String email) {&#xD;&#xA;        this.email = email;&#xD;&#xA;    }&#xD;&#xA;{code}&#xD;&#xA;As can be seen this are annotations that are picked up by XDoclet. See {link: XDoclet Tags for Spring| http://xdoclet.sourceforge.net/xdoclet/tags/spring-tags.html}.&#xD;&#xA;&#xD;&#xA;Spring validation uses the Jakarta Commons Validation. Above email is defined to do some basic processing. This is generally setup in a validator.xml. Example for email is:&#xD;&#xA;{code:xml}&#xD;&#xA;      &lt;validator name=&quot;email&quot;&#xD;&#xA;            classname=&quot;org.springmodules.commons.validator.FieldChecks&quot;&#xD;&#xA;               method=&quot;validateEmail&quot;&#xD;&#xA;         methodParams=&quot;java.lang.Object,&#xD;&#xA;                       org.apache.commons.validator.ValidatorAction,&#xD;&#xA;                       org.apache.commons.validator.Field,&#xD;&#xA;                       org.springframework.validation.Errors&quot;&#xD;&#xA;                       &#xD;&#xA;              depends=&quot;&quot;&#xD;&#xA;                  msg=&quot;errors.email&quot;&gt;&#xD;&#xA;&#xD;&#xA;         &lt;javascript&gt;&lt;![CDATA[&#xD;&#xA;            function validateEmail(form) {&#xD;&#xA;                var bValid = true;&#xD;&#xA;                var focusField = null;&#xD;&#xA;                var i = 0;&#xD;&#xA;                var fields = new Array();&#xD;&#xA;                oEmail = new email();&#xD;&#xA;                for (x in oEmail) {&#xD;&#xA;                    if ((form[oEmail[x][0]].type == &apos;text&apos; ||&#xD;&#xA;                         form[oEmail[x][0]].type == &apos;textarea&apos;) &amp;&amp;&#xD;&#xA;                        (form[oEmail[x][0]].value.length &gt; 0)) {&#xD;&#xA;                        if (!checkEmail(form[oEmail[x][0]].value)) {&#xD;&#xA;                            if (i == 0) {&#xD;&#xA;                                focusField = form[oEmail[x][0]];&#xD;&#xA;                            }&#xD;&#xA;                            fields[i++] = oEmail[x][1];&#xD;&#xA;                            bValid = false;&#xD;&#xA;                        }&#xD;&#xA;                    }&#xD;&#xA;                }&#xD;&#xA;                if (fields.length &gt; 0) {&#xD;&#xA;                    focusField.focus();&#xD;&#xA;                    alert(fields.join(&apos;\n&apos;));&#xD;&#xA;                }&#xD;&#xA;                return bValid;&#xD;&#xA;            }&#xD;&#xA;&#xD;&#xA;            /**&#xD;&#xA;             * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),&#xD;&#xA;             * http://javascript.internet.com&#xD;&#xA;             */&#xD;&#xA;            function checkEmail(emailStr) {&#xD;&#xA;               if (emailStr.length == 0) {&#xD;&#xA;                   return true;&#xD;&#xA;               }&#xD;&#xA;               var emailPat=/^(.+)@(.+)$/;&#xD;&#xA;               var specialChars=&quot;\\(\\)&lt;&gt;@,;:\\\\\\\&quot;\\.\\[\\]&quot;;&#xD;&#xA;               var validChars=&quot;\[^\\s&quot; + specialChars + &quot;\]&quot;;&#xD;&#xA;               var quotedUser=&quot;(\&quot;[^\&quot;]*\&quot;)&quot;;&#xD;&#xA;               var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;&#xD;&#xA;               var atom=validChars + &apos;+&apos;;&#xD;&#xA;               var word=&quot;(&quot; + atom + &quot;|&quot; + quotedUser + &quot;)&quot;;&#xD;&#xA;               var userPat=new RegExp(&quot;^&quot; + word + &quot;(\\.&quot; + word + &quot;)*$&quot;);&#xD;&#xA;               var domainPat=new RegExp(&quot;^&quot; + atom + &quot;(\\.&quot; + atom + &quot;)*$&quot;);&#xD;&#xA;               var matchArray=emailStr.match(emailPat);&#xD;&#xA;               if (matchArray == null) {&#xD;&#xA;                   return false;&#xD;&#xA;               }&#xD;&#xA;               var user=matchArray[1];&#xD;&#xA;               var domain=matchArray[2];&#xD;&#xA;               if (user.match(userPat) == null) {&#xD;&#xA;                   return false;&#xD;&#xA;               }&#xD;&#xA;               var IPArray = domain.match(ipDomainPat);&#xD;&#xA;               if (IPArray != null) {&#xD;&#xA;                   for (var i = 1; i &lt;= 4; i++) {&#xD;&#xA;                      if (IPArray[i] &gt; 255) {&#xD;&#xA;                         return false;&#xD;&#xA;                      }&#xD;&#xA;                   }&#xD;&#xA;                   return true;&#xD;&#xA;               }&#xD;&#xA;               var domainArray=domain.match(domainPat);&#xD;&#xA;               if (domainArray == null) {&#xD;&#xA;                   return false;&#xD;&#xA;               }&#xD;&#xA;               var atomPat=new RegExp(atom,&quot;g&quot;);&#xD;&#xA;               var domArr=domain.match(atomPat);&#xD;&#xA;               var len=domArr.length;&#xD;&#xA;               if ((domArr[domArr.length-1].length &lt; 2) ||&#xD;&#xA;                   (domArr[domArr.length-1].length &gt; 3)) {&#xD;&#xA;                   return false;&#xD;&#xA;               }&#xD;&#xA;               if (len &lt; 2) {&#xD;&#xA;                   return false;&#xD;&#xA;               }&#xD;&#xA;               return true;&#xD;&#xA;            }]]&gt;&#xD;&#xA;         &lt;/javascript&gt;&#xD;&#xA;&#xD;&#xA;      &lt;/validator&gt;&#xD;&#xA;{code}&#xD;&#xA;&#xD;&#xA;When a validator is wired up, say for a web form, spring validation allows validating first at the client side using javascript (as seen above), and then again at the server side.&#xD;&#xA;&#xD;&#xA;----&#xD;&#xA;1 Masks&#xD;&#xA;You can also setup masks on fields:&#xD;&#xA;{code:xml}&#xD;&#xA;    /**&#xD;&#xA;     * @spring.validator type=&quot;mask&quot; msgkey=&quot;errors.phone&quot;&#xD;&#xA;     * @spring.validator-var name=&quot;mask&quot; value=&quot;${phone}&quot;&#xD;&#xA;     */&#xD;&#xA;    public void setPhoneNumber(String phoneNumber) {&#xD;&#xA;        this.phoneNumber = phoneNumber;&#xD;&#xA;    }&#xD;&#xA;{code}&#xD;&#xA;&#xD;&#xA;1 Limitations&#xD;&#xA;Spring doesn&apos;t handle masks on non Strings. So either define a property validator as in email, or instroduce another property on the domain object to apply the mask on, then in the setter of this call the proper property.\\&#xD;&#xA;eg.&#xD;&#xA;BigDecimal costPrice \-\-&gt; mask of currency doesn&apos;t work since it is a non String.\\&#xD;&#xA;so use: String cost \-\-&gt; set a mask of currency on this, then in the setter method:\\&#xD;&#xA;costPrice = new BigDecimal(cost);&#xD;&#xA;\\&#xD;&#xA;javascript validation is performed, and also on server, since costPrice = new BigDecimal(cost) will fail if it can&apos;t be converted as well.</s:content>
        <s:mTime>2006-07-22 12:01:35.0</s:mTime>
        <s:cTime>2006-07-22 11:55:03.0</s:cTime>
        <s:comments
             rdf:type='http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag'/>
        <s:snipLinks>
            <rdf:Bag>
                <rdf:li>
                    <s:Snip rdf:about='http://wiki.marandcustomsolutions.com/rdf#Development/Java+%26+J2EE/Spring/Validation'>
                        <s:attachments
                             rdf:type='http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag'/>
                    </s:Snip>
                </rdf:li>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Development/Java &amp; J2EE/Spring'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Development/Java+%26+J2EE/Spring/Validation/'/>
                <rdf:li rdf:resource='#snipsnap-index'/>
                <rdf:li rdf:resource='#snipsnap-search'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Entity Relationship Diagram'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Development/Java &amp; J2EE/Hibernate/Mapping'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Development/Java &amp; J2EE'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Development/Java+%26+J2EE/Spring/Validation Result: ?? ??????? ????? ??? ????????'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Development/Java+&amp;+J2EE/Spring/Validation'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Development/Javascript'/>
                <rdf:li rdf:resource='http://wiki.marandcustomsolutions.com/rdf#Menu Links Examples'/>
            </rdf:Bag>
        </s:snipLinks>
    </s:Snip>
</rdf:RDF>

