<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>纵坐标的幻 - Hifar's Blog - Java 技术</title>
    <link>http://www.hifar.com/blog/</link>
    <description>THINKING, CREATING</description>
    <language>en-us</language>
    <copyright>Hifar</copyright>
    <lastBuildDate>Fri, 18 Feb 2005 07:00:25 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 0.0.0.0</generator>
    <managingEditor>hifar@gynow.com</managingEditor>
    <webMaster>hifar@gynow.com</webMaster>
    <item>
      <trackback:ping>http://www.hifar.com/blog/Trackback.aspx?guid=a629f827-aac4-48a0-a85c-0c5e4f92eea9</trackback:ping>
      <pingback:server>http://www.hifar.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hifar.com/blog/PermaLink,guid,a629f827-aac4-48a0-a85c-0c5e4f92eea9.aspx</pingback:target>
      <dc:creator>Jimmy Gao</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <span id="ArticleContent1_ArticleContent1_lblContent">
          </span>
        </p>
        <div>tomcat5.5.x 配置记录。
</div>
        <div> 
</div>
        <div>1.下载：
</div>
        <div>
          <a href="http://www.eu.apache.org/dist/jakarta/tomcat-5/">
            <font color="#000080">http://www.eu.apache.org/dist/jakarta/tomcat-5/</font>
          </a>
        </div>
        <div>
          <a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip">
            <font color="#000080">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip</font>
          </a>
          <br />
          <a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip">
            <font color="#000080">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip</font>
          </a>
          <br />
          <a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip">
            <font color="#000080">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip</font>
          </a>
        </div>
        <div>
          <a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip">
            <font color="#000080">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip</font>
          </a>
        </div>
        <div>把<u><font color="#0000ff">jakarta-tomcat-5.5.x.zip</font></u></div>
        <div>和<u><font color="#0000ff">jakarta-tomcat-5.5.x-compat.zip</font></u></div>
        <div>和<u><font color="#800080">jakarta-tomcat-5.5.x-admin.zip</font></u><br />
(Tomcat 默认是没有内置admin模块了
</div>
        <div>Tomcat's administration web application is no longer installed by default. Download
and install the "admin" package to use it. )
</div>
        <div>都解压到同一个目录下面。比如：D:\jakarta-tomcat-5.5.x\
</div>
        <div>(如果使用jdk1.4，才需要<u><font color="#0000ff">compat.zip</font></u>用jdk1.5就可以免了这个。) 
</div>
        <div> 
</div>
        <div>2.修改jakarta-tomcat-5.5.x\conf\tomcat-users.xml.<br />
添加管理员账号lizongbo，密码为lizongbopass.<br />
新xml如下：<br />
&lt;?xml version='1.0' encoding='utf-8'?&gt;<br />
&lt;tomcat-users&gt;<br />
  &lt;role rolename="tomcat"/&gt;<br />
  &lt;role rolename="role1"/&gt;<br />
  &lt;role rolename="manager"/&gt;<br />
  &lt;role rolename="admin"/&gt;<br />
  &lt;user username="tomcat" password="tomcat" roles="tomcat"/&gt;<br />
  &lt;user username="role1" password="tomcat" roles="role1"/&gt;<br />
  &lt;user username="both" password="tomcat" roles="tomcat,role1"/&gt;<br />
  &lt;user username="lizongbo" password="lizongbopass" roles="admin,manager"/&gt;<br />
&lt;/tomcat-users&gt;
</div>
        <div> 
</div>
        <div>3.修改jakarta-tomcat-5.5.x\conf\server.xml来解决编码问题。<br />
(给Connector 添加URIEncoding参数，参考<a href="http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx"><font color="#000080">http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx</font></a>)
</div>
        <div>(可以设置成GB18030)<br />
    &lt;Connector port="8080"<br />
              
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
              
enableLookups="false" redirectPort="8443" acceptCount="200"<br />
              
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"<br />
              
compression="on" compressionMinSize="2048" 
<br />
      noCompressionUserAgents="gozilla, traviata" 
<br />
      compressableMimeType="text/html,text/xml"/&gt;
</div>
        <div> 
</div>
        <div>    &lt;Connector port="8009" 
<br />
              
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="GBK"/&gt;
</div>
        <div> 
</div>
        <div>
          <br />
4.启用支持gzip压缩.<br />
(<a href="http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&amp;i=81169"><font color="#000080">http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&amp;i=81169</font></a>)<br />
添加下列属性<br />
 compression="on" 
<br />
      compressionMinSize="2048" 
<br />
      noCompressionUserAgents="gozilla, traviata" 
<br />
      compressableMimeType="text/html,text/xml"
</div>
        <div> 
</div>
        <div>5.设置虚拟主机。
</div>
        <div>在jakarta-tomcat-5.5.x\下建立文件夹vhost\www.mydomain.com。
</div>
        <div>然后修改jakarta-tomcat-5.5.x\conf\server.xml
</div>
        <div> 
</div>
        <div>&lt;Engine defaultHost="localhost" name="Catalina"&gt;<br />
      &lt;Host appBase="vhost/www.mydomain.com" name="<a href="http://www.mydomain.com/"><font color="#000080">www.mydomain.com</font></a>"&gt;<br />
      &lt;/Host&gt;<br />
      &lt;Host appBase="webapps" name="localhost"&gt;<br />
      &lt;/Host&gt;<br />
      &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"/&gt;<br />
    &lt;/Engine&gt;
</div>
        <div> 
</div>
        <div>6.添加数据库驱动,更新mail.jar和actiovation.jar
</div>
        <div>复制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\
</div>
        <div>还有javamail 1.3.2的mail.jar，jaf-1_0_2的 activation.jar
</div>
        <div>msSQl 2000 JDBC sp3，msbase.jar,msutil,jar,mssqlserver.jar
</div>
        <div> 
</div>
        <div> 
</div>
        <div>7.配置SSL
</div>
        <div>参考 <a href="http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html"><font color="#000080">http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html</font></a></div>
        <div>D:\j2sdk1.4.2_06\bin&gt;%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg
RSA<br />
输入keystore密码：  lizongbossl<br />
您的名字与姓氏是什么？<br />
  [tomcat5.5.x]：  tomcat5.5.x<br />
您的组织单位名称是什么？<br />
  [jakarta]：  jakarta<br />
您的组织名称是什么？<br />
  [apache]：  apache<br />
您所在的城市或区域名称是什么？<br />
  [hzcity]：  hzcity<br />
您所在的州或省份名称是什么？<br />
  [gdp]：  gdp<br />
该单位的两字母国家代码是什么<br />
  [CN]：  CN<br />
CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正确吗？<br />
  [否]：  y
</div>
        <div> 
</div>
        <div>输入&lt;tomcat&gt;的主密码<br />
        （如果和 keystore 密码相同，按回车）：<br /></div>
        <div>(必须密码一致，因此直接回车)
</div>
        <div>然后再把userhome(例如：C:\Documents and Settings\lizongbo\)下的.keystore复制到
</div>
        <div>tomcat的conf\目录下。
</div>
        <div> (例如：D:\jakarta-tomcat-5.5.x\conf\.keystore )
</div>
        <div>配置jakarta-tomcat-5.5.x\conf\server.xml
</div>
        <div>加上
</div>
        <div>    &lt;Connector port="8443" 
<br />
              
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
              
enableLookups="false" disableUploadTimeout="true"<br />
              
acceptCount="100" scheme="https" secure="true"<br />
              
clientAuth="false" sslProtocol="TLS" 
<br />
           keystoreFile="conf/.keystore" 
<br />
           keystorePass="lizongbossl"&gt;
&lt;!--与先前设置的密码一致--&gt;<br />
    &lt;/Connector&gt;
</div>
        <div>8.禁止文件目录列表，
</div>
        <div>修改jakarta-tomcat-5.5.x\conf\web.xml，把listing设置为false
</div>
        <div> 
</div>
        <div>    &lt;servlet&gt;<br />
        &lt;servlet-name&gt;default&lt;/servlet-name&gt;<br />
        &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;<br />
        &lt;init-param&gt;<br />
            &lt;param-name&gt;debug&lt;/param-name&gt;<br />
            &lt;param-value&gt;0&lt;/param-value&gt;<br />
        &lt;/init-param&gt;<br />
        &lt;init-param&gt;<br />
            &lt;param-name&gt;listings&lt;/param-name&gt;<br />
            &lt;param-value&gt;true&lt;/param-value&gt;<br />
        &lt;/init-param&gt;<br />
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
    &lt;/servlet&gt;
</div>
        <div> 
</div>
        <div> 9.指定了自己的javaEncoding
</div>
        <div>(参考 <a href="http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html"><font color="#000080">http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html</font></a> )
</div>
        <div>
          <br />
    &lt;servlet&gt;<br />
        &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />
        &lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;<br />
        &lt;init-param&gt;<br />
            &lt;param-name&gt;fork&lt;/param-name&gt;<br />
            &lt;param-value&gt;false&lt;/param-value&gt;<br />
        &lt;/init-param&gt;<br />
               
&lt;init-param&gt;<br />
            &lt;param-name&gt;javaEncoding&lt;/param-name&gt;<br />
            &lt;param-value&gt;GB18030&lt;/param-value&gt;<br />
        &lt;/init-param&gt;<br />
        &lt;init-param&gt;<br />
            &lt;param-name&gt;xpoweredBy&lt;/param-name&gt;<br />
            &lt;param-value&gt;true&lt;/param-value&gt;<br />
        &lt;/init-param&gt;<br />
        &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />
    &lt;/servlet&gt;
</div>
        <div> 10.添加rar,iso等的mime-type映射 
</div>
        <div>避免在浏览器里直接打开。
</div>
        <div>&lt;mime-mapping&gt;<br />
&lt;extension&gt;mht&lt;/extension&gt;<br />
&lt;mime-type&gt;text/x-mht&lt;/mime-type&gt;<br />
&lt;/mime-mapping&gt;
</div>
        <div>&lt;mime-mapping&gt;<br />
        &lt;extension&gt;rar&lt;/extension&gt;<br />
        &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br />
    &lt;/mime-mapping&gt;<br />
    &lt;mime-mapping&gt;<br />
        &lt;extension&gt;iso&lt;/extension&gt;<br />
        &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br />
    &lt;/mime-mapping&gt;<br />
    &lt;mime-mapping&gt;<br />
        &lt;extension&gt;ape&lt;/extension&gt;<br />
        &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br />
    &lt;/mime-mapping&gt;<br />
    &lt;mime-mapping&gt;<br />
        &lt;extension&gt;rmvb&lt;/extension&gt;<br />
        &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br />
    &lt;/mime-mapping&gt;
</div>
        <div>    &lt;mime-mapping&gt;<br />
        &lt;extension&gt;ico&lt;/extension&gt;<br />
        &lt;mime-type&gt;image/x-icon&lt;/mime-type&gt;<br />
    &lt;/mime-mapping&gt;
</div>
        <div>10.1对html静态页面设置编码
</div>
        <div>
          <font color="#0000ff">&lt;!--  修改下面两行以支持静态超文本的自动编码 <br />
  --&gt;</font> <br />
 <font color="#0000ff">&lt;mime-mapping&gt;</font><br />
  <font color="#0000ff">&lt;extension&gt;</font>htm<font color="#0000ff">&lt;/extension&gt;</font> <br />
  <font color="#0000ff">&lt;mime-type&gt;</font>text/html;charset=gb<font color="#ff0000">2312</font><font color="#0000ff">&lt;/mime-type&gt;</font> <br />
  <font color="#0000ff">&lt;/mime-mapping&gt;</font><br />
 <font color="#0000ff">&lt;mime-mapping&gt;</font><br />
  <font color="#0000ff">&lt;extension&gt;</font>html<font color="#0000ff">&lt;/extension&gt;</font> <br />
  <font color="#0000ff">&lt;mime-type&gt;</font>text/html;charset=gb<font color="#ff0000">2312</font><font color="#0000ff">&lt;/mime-type&gt;</font> <br />
  <font color="#0000ff">&lt;/mime-mapping&gt;</font><br />
  <font color="#0000ff">&lt;/web-app&gt;</font></div>
        <div> 
</div>
        <div>11.添加welcome-file-list，并调整顺序。
</div>
        <div> &lt;welcome-file-list&gt;    
<br />
        &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
        &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
        &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
        &lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br />
        &lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br />
        &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />
    &lt;/welcome-file-list&gt;<br /></div>
        <img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=a629f827-aac4-48a0-a85c-0c5e4f92eea9" />
      </body>
      <title>tomcat5.5.x 配置记录</title>
      <guid isPermaLink="false">http://www.hifar.com/blog/PermaLink,guid,a629f827-aac4-48a0-a85c-0c5e4f92eea9.aspx</guid>
      <link>http://www.hifar.com/blog/2005/02/18/tomcat55x%e9%85%8d%e7%bd%ae%e8%ae%b0%e5%bd%95.aspx</link>
      <pubDate>Fri, 18 Feb 2005 07:00:25 GMT</pubDate>
      <description>&lt;p&gt;
&lt;span id=ArticleContent1_ArticleContent1_lblContent&gt; 
&lt;/p&gt;
&lt;div&gt;tomcat5.5.x 配置记录。
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;1.下载：
&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.eu.apache.org/dist/jakarta/tomcat-5/"&gt;&lt;font color=#000080&gt;http://www.eu.apache.org/dist/jakarta/tomcat-5/&lt;/font&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip"&gt;&lt;font color=#000080&gt;http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip&lt;/font&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip"&gt;&lt;font color=#000080&gt;http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip&lt;/font&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip"&gt;&lt;font color=#000080&gt;http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip&lt;/font&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip"&gt;&lt;font color=#000080&gt;http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip&lt;/font&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;把&lt;u&gt;&lt;font color=#0000ff&gt;jakarta-tomcat-5.5.x.zip&lt;/font&gt;&lt;/u&gt;
&lt;/div&gt;
&lt;div&gt;和&lt;u&gt;&lt;font color=#0000ff&gt;jakarta-tomcat-5.5.x-compat.zip&lt;/font&gt;&lt;/u&gt;
&lt;/div&gt;
&lt;div&gt;和&lt;u&gt;&lt;font color=#800080&gt;jakarta-tomcat-5.5.x-admin.zip&lt;/font&gt;&lt;/u&gt;
&lt;br&gt;
(Tomcat 默认是没有内置admin模块了
&lt;/div&gt;
&lt;div&gt;Tomcat's administration web application is no longer installed by default. Download
and install the "admin" package to use it. )
&lt;/div&gt;
&lt;div&gt;都解压到同一个目录下面。比如：D:\jakarta-tomcat-5.5.x\
&lt;/div&gt;
&lt;div&gt;(如果使用jdk1.4，才需要&lt;u&gt;&lt;font color=#0000ff&gt;compat.zip&lt;/font&gt;&lt;/u&gt;用jdk1.5就可以免了这个。) 
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;2.修改jakarta-tomcat-5.5.x\conf\tomcat-users.xml.&lt;br&gt;
添加管理员账号lizongbo，密码为lizongbopass.&lt;br&gt;
新xml如下：&lt;br&gt;
&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;&lt;br&gt;
&amp;lt;tomcat-users&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;role rolename="tomcat"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;role rolename="role1"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;role rolename="manager"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;role rolename="admin"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;user username="tomcat" password="tomcat" roles="tomcat"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;user username="role1" password="tomcat" roles="role1"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;user username="both" password="tomcat" roles="tomcat,role1"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;user username="lizongbo" password="lizongbopass" roles="admin,manager"/&amp;gt;&lt;br&gt;
&amp;lt;/tomcat-users&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;3.修改jakarta-tomcat-5.5.x\conf\server.xml来解决编码问题。&lt;br&gt;
(给Connector&amp;nbsp;添加URIEncoding参数，参考&lt;a href="http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx"&gt;&lt;font color=#000080&gt;http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx&lt;/font&gt;&lt;/a&gt;)
&lt;/div&gt;
&lt;div&gt;(可以设置成GB18030)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Connector port="8080"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
enableLookups="false" redirectPort="8443" acceptCount="200"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
compression="on" compressionMinSize="2048" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; noCompressionUserAgents="gozilla, traviata" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compressableMimeType="text/html,text/xml"/&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Connector port="8009" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="GBK"/&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
4.启用支持gzip压缩.&lt;br&gt;
(&lt;a href="http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&amp;amp;i=81169"&gt;&lt;font color=#000080&gt;http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&amp;amp;i=81169&lt;/font&gt;&lt;/a&gt;)&lt;br&gt;
添加下列属性&lt;br&gt;
&amp;nbsp;compression="on" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compressionMinSize="2048" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; noCompressionUserAgents="gozilla, traviata" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compressableMimeType="text/html,text/xml"
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;5.设置虚拟主机。
&lt;/div&gt;
&lt;div&gt;在jakarta-tomcat-5.5.x\下建立文件夹vhost\www.mydomain.com。
&lt;/div&gt;
&lt;div&gt;然后修改jakarta-tomcat-5.5.x\conf\server.xml
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;&amp;lt;Engine defaultHost="localhost" name="Catalina"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Host appBase="vhost/www.mydomain.com" name="&lt;a href="http://www.mydomain.com/"&gt;&lt;font color=#000080&gt;www.mydomain.com&lt;/font&gt;&lt;/a&gt;"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Host&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Host appBase="webapps" name="localhost"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Host&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Engine&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;6.添加数据库驱动,更新mail.jar和actiovation.jar
&lt;/div&gt;
&lt;div&gt;复制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\
&lt;/div&gt;
&lt;div&gt;还有javamail 1.3.2的mail.jar，jaf-1_0_2的 activation.jar
&lt;/div&gt;
&lt;div&gt;msSQl 2000 JDBC sp3，msbase.jar,msutil,jar,mssqlserver.jar
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;7.配置SSL
&lt;/div&gt;
&lt;div&gt;参考 &lt;a href="http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html"&gt;&lt;font color=#000080&gt;http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html&lt;/font&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;D:\j2sdk1.4.2_06\bin&amp;gt;%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg
RSA&lt;br&gt;
输入keystore密码：&amp;nbsp; lizongbossl&lt;br&gt;
您的名字与姓氏是什么？&lt;br&gt;
&amp;nbsp; [tomcat5.5.x]：&amp;nbsp; tomcat5.5.x&lt;br&gt;
您的组织单位名称是什么？&lt;br&gt;
&amp;nbsp; [jakarta]：&amp;nbsp; jakarta&lt;br&gt;
您的组织名称是什么？&lt;br&gt;
&amp;nbsp; [apache]：&amp;nbsp; apache&lt;br&gt;
您所在的城市或区域名称是什么？&lt;br&gt;
&amp;nbsp; [hzcity]：&amp;nbsp; hzcity&lt;br&gt;
您所在的州或省份名称是什么？&lt;br&gt;
&amp;nbsp; [gdp]：&amp;nbsp; gdp&lt;br&gt;
该单位的两字母国家代码是什么&lt;br&gt;
&amp;nbsp; [CN]：&amp;nbsp; CN&lt;br&gt;
CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正确吗？&lt;br&gt;
&amp;nbsp; [否]：&amp;nbsp; y
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;输入&amp;lt;tomcat&amp;gt;的主密码&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; （如果和 keystore 密码相同，按回车）：&lt;br&gt;
&lt;/div&gt;
&lt;div&gt;(必须密码一致，因此直接回车)
&lt;/div&gt;
&lt;div&gt;然后再把userhome(例如：C:\Documents and Settings\lizongbo\)下的.keystore复制到
&lt;/div&gt;
&lt;div&gt;tomcat的conf\目录下。
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;(例如：D:\jakarta-tomcat-5.5.x\conf\.keystore )
&lt;/div&gt;
&lt;div&gt;配置jakarta-tomcat-5.5.x\conf\server.xml
&lt;/div&gt;
&lt;div&gt;加上
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Connector port="8443" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
enableLookups="false" disableUploadTimeout="true"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
acceptCount="100" scheme="https" secure="true"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
clientAuth="false" sslProtocol="TLS" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keystoreFile="conf/.keystore" 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keystorePass="lizongbossl"&amp;gt;
&amp;lt;!--与先前设置的密码一致--&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Connector&amp;gt;
&lt;/div&gt;
&lt;div&gt;8.禁止文件目录列表，
&lt;/div&gt;
&lt;div&gt;修改jakarta-tomcat-5.5.x\conf\web.xml，把listing设置为false
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-name&amp;gt;default&amp;lt;/servlet-name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-class&amp;gt;org.apache.catalina.servlets.DefaultServlet&amp;lt;/servlet-class&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-name&amp;gt;debug&amp;lt;/param-name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-value&amp;gt;0&amp;lt;/param-value&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-name&amp;gt;listings&amp;lt;/param-name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;9.指定了自己的javaEncoding
&lt;/div&gt;
&lt;div&gt;(参考 &lt;a href="http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html"&gt;&lt;font color=#000080&gt;http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html&lt;/font&gt;&lt;/a&gt;&amp;nbsp;)
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-name&amp;gt;jsp&amp;lt;/servlet-name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;servlet-class&amp;gt;org.apache.jasper.servlet.JspServlet&amp;lt;/servlet-class&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-name&amp;gt;fork&amp;lt;/param-name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-name&amp;gt;javaEncoding&amp;lt;/param-name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-value&amp;gt;GB18030&amp;lt;/param-value&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-name&amp;gt;xpoweredBy&amp;lt;/param-name&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;load-on-startup&amp;gt;3&amp;lt;/load-on-startup&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/servlet&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;10.添加rar,iso等的mime-type映射 
&lt;/div&gt;
&lt;div&gt;避免在浏览器里直接打开。
&lt;/div&gt;
&lt;div&gt;&amp;lt;mime-mapping&amp;gt;&lt;br&gt;
&amp;lt;extension&amp;gt;mht&amp;lt;/extension&amp;gt;&lt;br&gt;
&amp;lt;mime-type&amp;gt;text/x-mht&amp;lt;/mime-type&amp;gt;&lt;br&gt;
&amp;lt;/mime-mapping&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;lt;mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extension&amp;gt;rar&amp;lt;/extension&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-type&amp;gt;application/octet-stream&amp;lt;/mime-type&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extension&amp;gt;iso&amp;lt;/extension&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-type&amp;gt;application/octet-stream&amp;lt;/mime-type&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extension&amp;gt;ape&amp;lt;/extension&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-type&amp;gt;application/octet-stream&amp;lt;/mime-type&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extension&amp;gt;rmvb&amp;lt;/extension&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-type&amp;gt;application/octet-stream&amp;lt;/mime-type&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mime-mapping&amp;gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-mapping&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extension&amp;gt;ico&amp;lt;/extension&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-type&amp;gt;image/x-icon&amp;lt;/mime-type&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mime-mapping&amp;gt;
&lt;/div&gt;
&lt;div&gt;10.1对html静态页面设置编码
&lt;/div&gt;
&lt;div&gt;&lt;font color=#0000ff&gt;&amp;lt;!--&amp;nbsp;&amp;nbsp;修改下面两行以支持静态超文本的自动编码&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;--&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;mime-mapping&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;extension&amp;gt;&lt;/font&gt;htm&lt;font color=#0000ff&gt;&amp;lt;/extension&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;mime-type&amp;gt;&lt;/font&gt;text/html;charset=gb&lt;font color=#ff0000&gt;2312&lt;/font&gt;&lt;font color=#0000ff&gt;&amp;lt;/mime-type&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;/mime-mapping&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;mime-mapping&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;extension&amp;gt;&lt;/font&gt;html&lt;font color=#0000ff&gt;&amp;lt;/extension&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;mime-type&amp;gt;&lt;/font&gt;text/html;charset=gb&lt;font color=#ff0000&gt;2312&lt;/font&gt;&lt;font color=#0000ff&gt;&amp;lt;/mime-type&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;/mime-mapping&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;/web-app&amp;gt;&lt;/font&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div&gt;11.添加welcome-file-list，并调整顺序。
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;lt;welcome-file-list&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;welcome-file&amp;gt;index.htm&amp;lt;/welcome-file&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;welcome-file&amp;gt;default.html&amp;lt;/welcome-file&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;welcome-file&amp;gt;default.htm&amp;lt;/welcome-file&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;welcome-file&amp;gt;default.jsp&amp;lt;/welcome-file&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/welcome-file-list&amp;gt;&lt;br&gt;
&lt;/div&gt;
&gt;&lt;img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=a629f827-aac4-48a0-a85c-0c5e4f92eea9" /&gt;</description>
      <category>Java 技术</category>
      <category>文摘和收藏</category>
    </item>
    <item>
      <trackback:ping>http://www.hifar.com/blog/Trackback.aspx?guid=c7f0b35a-6564-4009-a261-1745e8e802b2</trackback:ping>
      <pingback:server>http://www.hifar.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hifar.com/blog/PermaLink,guid,c7f0b35a-6564-4009-a261-1745e8e802b2.aspx</pingback:target>
      <dc:creator>Jimmy Gao</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <table style="TABLE-LAYOUT: fixed" cellspacing="0" cellpadding="10" width="100%" border="0">
            <tbody>
              <tr>
                <td align="middle">
                  <span class="title">一个log4j的学习笔计</span>
                  <br />
                  <br />
                  <span class="highlight1">转贴：</span>snow   <span class="highlight1">日期：</span>2004-09-01   <span class="highlight1">人气：</span>76</td>
              </tr>
              <tr>
                <td align="middle">
                </td>
              </tr>
              <tr>
                <td class="content" style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word">
Log4j 学习笔记 
<br /><br />
by heavyz 
<br />
2003-04-15 
<br /><br />
转自：http://zooo.51.net/heavyz_cs/notebook/log4j.html 
<br /><br /><br /><br />
-------------------------------------------------------------------------------- 
<br /><br /><br /><br /><br /><br />
Log4j主页：http://jakarta.apache.org/log4j 
<br /><br /><br /><br />
-------------------------------------------------------------------------------- 
<br /><br /><br />
Index 
<br /><br />
Log4j的类图 
<br />
Logger：日志写出器 
<br />
Logger的输出方法 
<br />
Logger的命名规则 
<br />
Log level 
<br />
示例代码 
<br />
关于logger的两点说明 
<br />
Appender：日志目的地 
<br />
ConsoleAppender 
<br />
FileAppender 
<br />
RollingFileAppender 
<br />
Layout：日志格式化器 
<br />
PatternLayout 
<br />
patterns in PatternLayout 
<br />
Configuration：配置 
<br />
默认的log4j初始化过程 
<br />
BasicConfigurator.configure() 
<br />
xml格式的log4j配置文件概述 
<br />
在xml文件中配置appender和layout 
<br />
我自己的一个使用xml文件配置log4j环境的很简单的例子 
<br />
Log4j的编码习惯 
<br />
参考资料 
<br /><br /><br /><br />
Log4j的类图 
<br /><br /><br /><br /><br />
Logger - 日志写出器，供程序员输出日志信息 
<br />
Appender - 日志目的地，把格式化好的日志信息输出到指定的地方去 
<br />
ConsoleAppender - 目的地为控制台的Appender 
<br />
FileAppender - 目的地为文件的Appender 
<br />
RollingFileAppender - 目的地为大小受限的文件的Appender 
<br />
Layout - 日志格式化器，用来把程序员的logging request格式化成字符串 
<br />
PatternLayout - 用指定的pattern格式化logging request的Layout 
<br /><br /><br /><br />
Logger：日志写出器 
<br />
Logger对象是用来取代System.out或者System.err的日志写出器，用来供程序员输出日志信息。 
<br /><br />
Logger的输出方法 
<br />
Logger类对象提供一系列方法供程序员输出日志信息。 
<br /><br /><br /><br /><br />
------ Log4j APIs : class Logger ------ 
<br /><br /><br /><br />
// Printing methods : 
<br /><br />
public void debug(Object msg); 
<br />
public void debug(Object msg, Throwable t); 
<br /><br />
public void info(Object msg); 
<br />
public void info(Object msg, Throwable t); 
<br /><br />
public void warn(Object msg); 
<br />
public void warn(Object msg, Throwable t); 
<br /><br />
public void error(Object msg); 
<br />
public void error(Object msg, Throwable t); 
<br /><br />
public void fatal(Object msg); 
<br />
public void fatal(Object msg, Throwable t); 
<br /><br />
// Generic printing method : 
<br /><br />
public void log(Level l, Object msg); 
<br /><br /><br /><br /><br />
Logger的命名规则 
<br />
Logger由一个String类的名字识别，logger的名字是大小写敏感的，且名字之间具有继承的关系，子名有父名作为前缀，用点号.分隔。如：x.y是x.y.z的父亲。 
<br /><br />
根logger (root logger)是所有logger的祖先，它具有如下属性：1) 它总是存在的；2) 它不可以通过名字获得。 
<br /><br />
通过调用public static Logger Logger.getRootLogger()获得root logger；通过调用public static Logger
Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)获得（或者创建）一个named
logger。后者相当于调用Logger.getLogger(clazz.getName())。 
<br /><br />
在某对象中，用该对象所属的类为参数，调用Logger.getLogger(Class clazz)以获得logger被认为是目前所知的最理智的命名logger的方法。 
<br /><br /><br />
Log level 
<br />
每个logger都被分配了一个日志级别 (log level)，用来控制日志信息的输出。未被分配level的logger将继承它最近的父logger的level。 
<br /><br />
每条输出到logger的日志请求(logging request)也都有一个level，如果该request的level大于等于该logger的level，则该request将被处理（称为enabled）；否则该request将被忽略。故可得知： 
<br /><br />
logger的level越低，表示该logger越详细 
<br />
logging request的level越高，表示该logging request越优先输出 
<br /><br />
Level类中预定义了五个level，它们的大小关系如下： 
<br /><br /><br />
Level.ALL &lt; Level.DEBUG &lt; Level.INFO &lt; Level.WARN &lt; Level.ERROR &lt; Level.FATAL
&lt; Level.OFF 
<br /><br /><br /><br /><br />
示例代码 
<br />
以下代码将用自己所属的类为参数，创建一个logger，启用默认配置，设置其level并向其输出若干logging request。 
<br /><br /><br />
import org.apache.log4j.Logger; 
<br />
import org.apache.log4j.BasicConfigurator; 
<br />
import org.apache.log4j.Level; 
<br /><br />
public class Log4jTest { 
<br />
public static void main(String argv[]) { 
<br /><br /><br />
// Create a logger by the name of class Log4jTest. 
<br /><br />
Logger logger = Logger.getLogger(Log4jTest.class); 
<br /><br />
// Use the default configuration. 
<br /><br />
BasicConfigurator.configure(); 
<br /><br />
// Set the logger level to Level.INFO 
<br /><br />
logger.setLevel(Level.INFO); 
<br /><br />
// This request will be disabled since Level.DEBUG &lt; Level.INFO. 
<br /><br />
logger.debug("This is debug."); 
<br /><br />
// These requests will be enabled. 
<br /><br />
logger.info("This is an info."); 
<br />
logger.warn("This is a warning."); 
<br />
logger.error("This is an error."); 
<br />
logger.fatal("This is a fatal error."); 
<br /><br />
return; 
<br />
} 
<br />
} 
<br /><br /><br /><br /><br />
关于logger的两点说明 
<br /><br />
用同名参数调用Logger.getLogger(String name)将返回同一个logger的引用。故可以在一个地方配置logger，在另外一个地方获得配置好的logger，而无须相互间传递logger的引用。 
<br />
logger的创建可以按照任意的顺序，即，父logger可以后于子logger被创建。log4j将自动维护logger的继承树。 
<br /><br /><br /><br /><br /><br />
Appender：日志目的地 
<br />
每个logger都可以拥有一个或者多个appender，每个appender表示一个日志的输出目的地，比如console或者某个文件。可以使用Logger.addAppender(Appender
app)为logger增加一个appender；可以使用Logger.removeAppender(Appender app)为logger移除一个appender。 
<br /><br />
默认情况下，logger的additive标志被设置为true，表示子logger将继承父logger的所有appenders。该选项可以被重新设置，表示子logger将不再继承父logger的appenders。 
<br /><br />
root logger拥有目标为system.out的consoleAppender，故默认情况下，所有的logger都将继承该appender。 
<br /><br /><br /><br /><br />
------ Log4j APIs : class Logger ------ 
<br /><br /><br /><br />
// 为logger对象增加或者移除一个Appender对象 :. 
<br /><br />
public void appAppender(Appender app); 
<br />
public void removeAppender(Appender app); 
<br /><br />
// 获得和设置additive标志：是否继承父logger的appenders :. 
<br />
// 注意：在设置additive标志为false时，必须保证已经为该logger设置了新的appender， :. 
<br />
// 否则log4j将报错：log4j:WARN No appenders could be found for logger (x.y.z). :. 
<br /><br />
public boolean getAdditivity(); 
<br />
public void setAdditivity(boolean additive); 
<br /><br /><br />
ConsoleAppender 
<br />
可以使用ConsoleAppender对象把日志输出到控制台。每个ConsoleAppender都有一个target，表示它的输出目的地。它可以是System.out，标准输出设备（缓冲显示屏）；或者是System.err，标准错误设备（不缓冲显示屏）。ConsoleAppender的使用方法参考如下API
:. 
<br /><br /><br /><br /><br />
------ Log4j APIs : class ConsoleAppender extends WriterAppender ------ 
<br /><br /><br /><br />
// 构造方法，使用一个Layout对象构造一个ConsoleAppender对象 :. 
<br />
// 默认情况下，ConsoleAppender的target是System.out :. 
<br /><br />
public ConsoleAppender(Layout layout); 
<br /><br />
// 构造方法，使用一个Layout对象和一个target字符串构造ConsoleAppender对象 :. 
<br />
// target的可能取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR :. 
<br /><br />
public ConsoleAppender(Layout layout, String target); 
<br /><br /><br /><br /><br />
FileAppender 
<br />
可以使用FileAppender对象把日志输出到一个指定的日志文件中去。使用方法可以参考如下的API :. 
<br /><br /><br /><br /><br />
------ Log4j APIs : class FileAppender extends WriterAppender ------ 
<br /><br /><br /><br />
// 构造方法，使用一个Layout对象和日志文件名构造一个FileAppender对象 :. 
<br /><br />
public FileAppender(Layout layout, String filename) 
<br />
throws IOException; 
<br />
public FileAppender(Layout layout, String filename, boolean append) 
<br />
throws IOException; 
<br /><br /><br /><br /><br />
RollingFileAppender 
<br />
可以使用FileAppender的子类RollingFileAppender对象，把日志输出到一个指定的日志文件中。不同的是该日志文件的大小受到限制，当日志内容超出最大的尺寸时，该文件将向上滚动（最老的日志被擦除）。还可以在该类对象中指定为日志文件做多少个备份。具体使用方法参考如下API
:. 
<br /><br /><br /><br /><br />
------ Log4j APIs : class RollingFileAppender extends FileAppender ------ 
<br /><br /><br /><br />
// 构造方法，使用一个Layout对象和日志文件名构造一个RollingFileAppender对象 :. 
<br /><br />
public RollingFileAppender(Layout layout, String filename) 
<br />
throws IOException; 
<br />
public RollingFileAppender(Layout layout, String filename, boolean append) 
<br />
throws IOException; 
<br /><br />
// 获得和设置日志备份文件的个数 :. 
<br /><br />
public int getMaxBackupIndex(); 
<br />
public void setMaxBackupIndex(int index); 
<br /><br />
// 获得和设置滚动日志文件的最大尺寸 :. 
<br /><br />
public long getMaximumFileSize(); 
<br />
public void setMaximumFileSize(long size); 
<br /><br /><br /><br /><br /><br /><br />
Layout：日志格式化器 
<br />
每个appender都和一个layout相联系；layout的任务是格式化用户的logging request，appender的任务是把layout格式化好的输出内容送往指定的目的地。 
<br /><br />
PatternLayout 
<br />
PatternLayout是Layout的一个子类，用来使用类似C语言的printf函数中使用的格式控制字符串来控制日志的输出格式。使用方法参考如下API :. 
<br /><br /><br /><br /><br />
------ Log4j APIs : class PatternLayout extends Layout ------ 
<br /><br /><br /><br />
// 无参数构造方法，使用DEFAULT_CONVERSION_PATTERN构造一个PatternLayout :. 
<br />
// 注意：DEFAULT_CONVERSION_PATTERN为"%m%n"，只打印消息信息 :. 
<br /><br />
public PatternLayout(); 
<br /><br />
// 构造方法，使用自定义的pattern构造一个PatternLayout :. 
<br /><br />
public PatternLayout(String pattern); 
<br /><br />
// 获得和设置PatternLayout对象的日志pattern :. 
<br /><br />
public String getConversionPattern(); 
<br />
public void setConversionPattern(String pattern); 
<br /><br /><br /><br /><br />
patterns in PatternLayout 
<br />
未完待续 
<br /><br /><br /><br /><br />
Configuration：配置 
<br />
对log4j环境的配置就是对root logger的配置，包括把root logger设置为哪个级别(level)；为它增加哪些appender，等等。这些可以通过设置系统属性的方法来隐式地完成，也可以在程序里调用XXXConfigurator.configure()方法来显式地完成。 
<br /><br />
默认的log4j初始化过程 
<br />
Logger类的静态初始化块(static initialization block)中对log4j的环境做默认的初始化。注意：如果程序员已经通过设置系统属性的方法来配置了log4j环境，则不需要再显式地调用XXXConfigurator.configure()方法来配置log4j环境了。 
<br /><br />
Logger的静态初始化块在完成初始化过程时将检查一系列log4j定义的系统属性。它所做的事情如下： 
<br /><br />
检查系统属性log4j.defaultInitOverride，如果该属性被设置为false，则执行初始化；否则（只要不是false，无论是什么值，甚至没有值，都是否则），跳过初始化。 
<br />
把系统属性log4j.configuration的值赋给变量resource。如果该系统变量没有被定义，则把resource赋值为"log4j.properties"。注意：在apache的log4j文档中建议使用定义log4j.configuration系统属性的方法来设置默认的初始化文件是一个好方法。 
<br />
试图把resource变量转化成为一个URL对象url。如果一般的转化方法行不通，就调用org.apache.log4j.helpers.Loader.getResource(resource,
Logger.class)方法来完成转化。 
<br />
如果url以".html"结尾，则调用方法DOMConfigurator.configure(url)来完成初始化；否则，则调用方法PropertyConfigurator.configure(url)来完成初始化。如果url指定的资源不能被获得，则跳出初始化过程。 
<br /><br /><br /><br />
BasicConfigurator.configure() 
<br />
BasicConfigurator.configure()方法使用最简的方法配置log4j环境。注：所谓配置log4j环境，就是指配置root logger，因为所有其它的logger都是root
logger的后代，所以它们（默认情况下）都将继承root logger的性质。 
<br /><br />
BasicConfigurator.configure()完成的任务是： 
<br /><br />
用默认pattern创建PatternLayout对象p： 
<br />
PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n"); 
<br />
用p创建ConsoleAppender对象a，目标是system.out，标准输出设备： 
<br />
ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT); 
<br />
为root logger增加一个ConsoleAppender p： 
<br />
rootLogger.addAppender(p); 
<br />
把root logger的log level设置为DEBUG级别： 
<br />
rootLogger.setLevel(Level.DEBUG); 
<br /><br /><br /><br />
xml格式的log4j配置文件概述 
<br />
xml格式的log4j配置文件需要使用org.apache.log4j.html.DOMConfigurator.configure()方法来读入。对xml文件的语法定义可以在log4j的发布包中找到：org/apache/log4j/xml/log4j.dtd。 
<br /><br />
log4j的xml配置文件的树状结构 
<br />
log4j的xml配置文件的树状结构如下所示，注意下图只显示了常用的部分。 :. 
<br /><br /><br />
xml declaration and dtd 
<br />
| 
<br />
log4j:configuration 
<br />
| 
<br />
+-- appender (name, class) 
<br />
| | 
<br />
| +-- param (name, value) 
<br />
| +-- layout (class) 
<br />
| | 
<br />
| +-- param (name, value) 
<br />
+-- logger (name, additivity) 
<br />
| | 
<br />
| +-- level (class, value) 
<br />
| | | 
<br />
| | +-- param (name, value) 
<br />
| +-- appender-ref (ref) 
<br />
+-- root 
<br />
| 
<br />
+-- param (name, class) 
<br />
+-- level 
<br />
| | 
<br />
| +-- param (name, value) 
<br />
+-- appender-ref (ref) 
<br /><br /><br /><br /><br />
xml declaration and dtd 
<br />
xml配置文件的头部包括两个部分：xml声明和dtd声明。头部的格式如下： :. 
<br /><br /><br />
&lt;?xml version="1.0" encoding="UTF-8" ?&gt; 
<br />
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt; 
<br /><br /><br /><br /><br />
log4j:configuration (root element) 
<br /><br />
xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间，取定值"http://jakarta.apache.org/log4j/" 
<br />
appender [* child] : 一个appender子元素定义一个日志输出目的地 
<br />
logger [* child] : 一个logger子元素定义一个日志写出器 
<br />
root [? child] : root子元素定义了root logger 
<br /><br /><br /><br />
appender 
<br />
appender元素定义一个日志输出目的地。 
<br /><br /><br />
name [#REQUIRED attribute] : 定义appender的名字，以便被后文引用 
<br />
class [#REQUIRED attribute] : 定义appender对象所属的类的全名 
<br />
param [* child] : 创建appender对象时传递给类构造方法的参数 
<br />
layout [? child] : 该appender使用的layout对象 
<br /><br /><br /><br />
layout 
<br />
layout元素定义与某一个appender相联系的日志格式化器。 
<br /><br /><br />
class [#REQUIRED attribute] : 定义layout对象所属的类的全名 
<br />
param [* child] : 创建layout对象时传递给类构造方法的参数 
<br /><br /><br /><br />
logger 
<br />
logger元素定义一个日志输出器。 
<br /><br /><br />
name [#REQUIRED attribute] : 定义logger的名字，以便被后文引用 
<br />
additivity [#ENUM attribute] : 取值为"true"（默认）或者"false"，是否继承父logger的属性 
<br />
level [? child] : 定义该logger的日志级别 
<br />
appender-ref [* child] : 定义该logger的输出目的地 
<br /><br /><br /><br />
root 
<br />
root元素定义根日志输出器root logger。 
<br /><br /><br />
param [* child] : 创建root logger对象时传递给类构造方法的参数 
<br />
level [? child] : 定义root logger的日志级别 
<br />
appender-ref [* child] : 定义root logger的输出目的地 
<br /><br /><br /><br />
level 
<br />
level元素定义logger对象的日志级别。 
<br /><br /><br />
class [#IMPLIED attribute] : 定义level对象所属的类，默认情况下是"org.apache.log4j.Level类 
<br />
value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出 
<br />
param [* child] : 创建level对象时传递给类构造方法的参数 
<br /><br /><br /><br />
appender-ref 
<br />
appender-ref元素引用一个appender元素的名字，为logger对象增加一个appender。 
<br /><br /><br />
ref [#REQUIRED attribute] : 一个appender元素的名字的引用 
<br />
appender-ref元素没有子元素 
<br /><br /><br /><br />
param 
<br />
param元素在创建对象时为类的构造方法提供参数。它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。 
<br /><br /><br />
name and value [#REQUIRED attributes] : 提供参数的一组名值对 
<br />
param元素没有子元素 
<br /><br /><br /><br /><br /><br />
在xml文件中配置appender和layout 
<br />
创建不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以使用param子元素来设定不同的参数值。 
<br /><br />
创建ConsoleAppender对象 
<br />
ConsoleAppender的构造方法不接受其它的参数。 :. 
<br /><br /><br />
... ... ... ... 
<br />
&lt;appender name="console.log" class="org.apache.log4j.ConsoleAppender"&gt; 
<br />
&lt;layout ... &gt; 
<br />
... ... 
<br />
&lt;/layout&gt; 
<br />
&lt;/appender&gt; 
<br />
... ... ... ... 
<br /><br /><br /><br /><br />
创建FileAppender对象 
<br />
可以为FileAppender类的构造方法传递两个参数：File表示日志文件名；Append表示如文件已存在，是否把日志追加到文件尾部，可能取值为"true"和"false"（默认）。
:. 
<br /><br /><br />
... ... ... ... 
<br />
&lt;appender name="file.log" class="org.apache.log4j.FileAppender"&gt; 
<br />
&lt;param name="File" value="/tmp/log.txt" /&gt; 
<br />
&lt;param name="Append" value="false" /&gt; 
<br />
&lt;layout ... &gt; 
<br />
... ... 
<br />
&lt;/layout&gt; 
<br />
&lt;/appender&gt; 
<br />
... ... ... ... 
<br /><br /><br /><br /><br />
创建RollingFileAppender对象 
<br />
除了File和Append以外，还可以为RollingFileAppender类的构造方法传递两个参数：MaxBackupIndex备份日志文件的个数（默认是1个）；MaxFileSize表示日志文件允许的最大字节数（默认是10M）。
:. 
<br /><br /><br />
... ... ... ... 
<br />
&lt;appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender"&gt; 
<br />
&lt;param name="File" value="/tmp/rollingLog.txt" /&gt; 
<br />
&lt;param name="Append" value="false" /&gt; 
<br />
&lt;param name="MaxBackupIndex" value="2" /&gt; 
<br />
&lt;param name="MaxFileSize" value="1024" /&gt; 
<br />
&lt;layout ... &gt; 
<br />
... ... 
<br />
&lt;/layout&gt; 
<br />
&lt;/appender&gt; 
<br />
... ... ... ... 
<br /><br /><br /><br /><br />
创建PatternLayout对象 
<br />
可以为PatternLayout类的构造方法传递参数ConversionPattern。 :. 
<br /><br /><br />
... ... ... ... 
<br />
&lt;layout class="org.apache.log4j.PatternLayout&gt; 
<br />
&lt;param name="Conversion" value="%d [%t] %p - %m%n" /&gt; 
<br />
&lt;/layout&gt; 
<br />
... ... ... ... 
<br /><br /><br /><br /><br /><br /><br />
我自己的一个使用xml文件配置log4j环境的很简单的例子 
<br />
为WSOTA项目开发java web start的胖客户端时，使用了如下的xml文件配置log4j环境（文件名为wsota-rc.log4j.html）：:. 
<br /><br /><br />
&lt;?xml version="1.0" encoding="UTF-8" ?&gt; 
<br />
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt; 
<br /><br />
&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt; 
<br /><br />
&lt;!-- ================================================================= --&gt; 
<br />
&lt;!-- a rolling file appender --&gt; 
<br />
&lt;!-- ================================================================= --&gt; 
<br /><br />
&lt;appender name="wsota-rc.file.log" class="org.apache.log4j.RollingFileAppender"&gt; 
<br />
&lt;param name="File" value="/tmp/wsota-rc.log" /&gt; 
<br />
&lt;param name="Append" value="false" /&gt; 
<br />
&lt;layout class="org.apache.log4j.PatternLayout"&gt; 
<br />
&lt;param name="ConversionPattern" value="%d [%t] %p - %m%n" /&gt; 
<br />
&lt;/layout&gt; 
<br />
&lt;/appender&gt; 
<br /><br />
&lt;!-- ================================================================= --&gt; 
<br />
&lt;!-- a console appender --&gt; 
<br />
&lt;!-- debug can be turned off by setting level of root to "off" --&gt; 
<br />
&lt;!-- ================================================================= --&gt; 
<br /><br />
&lt;appender name="wsota-rc.console.log" class="org.apache.log4j.ConsoleAppender"&gt; 
<br />
&lt;layout class="org.apache.log4j.PatternLayout"&gt; 
<br />
&lt;param name="ConversionPattern" value="%d [%t] %p - %m%n" /&gt; 
<br />
&lt;/layout&gt; 
<br />
&lt;/appender&gt; 
<br /><br />
&lt;!-- use this to turn on debug to a rolling file. --&gt; 
<br /><br />
&lt;root&gt; 
<br />
&lt;level value="debug" /&gt; 
<br />
&lt;appender-ref ref="wsota-rc.file.log" /&gt; 
<br />
&lt;/root&gt; 
<br /><br />
&lt;!-- use this to turn on debug to console. --&gt; 
<br />
&lt;!-- 
<br />
&lt;root&gt; 
<br />
&lt;level value="off" /&gt; 
<br />
&lt;appender-ref ref="wsota-rc.console.log" /&gt; 
<br />
&lt;/root&gt; 
<br />
--&gt; 
<br /><br /><br />
&lt;!-- use this to turn off debug. --&gt; 
<br />
&lt;!-- 
<br />
&lt;root&gt; 
<br />
&lt;level value="off" /&gt; 
<br />
&lt;appender-ref ref="wsota-rc.console.log" /&gt; 
<br />
&lt;/root&gt; 
<br />
--&gt; 
<br /><br />
&lt;/log4j:configuration&gt; 
<br /><br /><br />
在胖客户程序中使用了如下代码来使用外部xml文件配置log4j环境，注意该代码段位于程序的main class的静态初始化块中，含有以下代码的类和xml配置文件在同一个目录下：:. 
<br /><br /><br />
import org.apache.log4j.html.DOMConfigurator; 
<br /><br />
public class SapFrame extends JFrame { 
<br />
static { 
<br />
DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.html")); 
<br />
} 
<br />
... ... ... ... 
<br />
} 
<br /><br /><br /><br /><br /><br /><br />
Log4j的编码习惯 
<br /><br />
让每个类都拥有一个private static的Logger对象，用来输出该类中的全部日志信息 
<br />
使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意：在一个项目中，log4j环境只需要被配置一次，而不是在每个使用了logger的类里都需要调用一次 
<br />
用MyClass.class作为参数创建该类的静态Logger对象 
<br />
补充中... 
<br /><br /></td>
              </tr>
            </tbody>
          </table>
        </p>
        <img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=c7f0b35a-6564-4009-a261-1745e8e802b2" />
      </body>
      <title>一个log4j的学习笔计</title>
      <guid isPermaLink="false">http://www.hifar.com/blog/PermaLink,guid,c7f0b35a-6564-4009-a261-1745e8e802b2.aspx</guid>
      <link>http://www.hifar.com/blog/2004/12/20/%e4%b8%80%e4%b8%aalog4j%e7%9a%84%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%a1.aspx</link>
      <pubDate>Mon, 20 Dec 2004 05:00:42 GMT</pubDate>
      <description>&lt;p&gt;
&lt;table style="TABLE-LAYOUT: fixed" cellspacing=0 cellpadding=10 width="100%" border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=middle&gt;
&lt;span class=title&gt;一个log4j的学习笔计&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span class=highlight1&gt;转贴：&lt;/span&gt;snow&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=highlight1&gt;日期：&lt;/span&gt;2004-09-01&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=highlight1&gt;人气：&lt;/span&gt;76&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=middle&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=content style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"&gt;
Log4j 学习笔记 
&lt;br&gt;
&lt;br&gt;
by heavyz 
&lt;br&gt;
2003-04-15 
&lt;br&gt;
&lt;br&gt;
转自：http://zooo.51.net/heavyz_cs/notebook/log4j.html 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
-------------------------------------------------------------------------------- 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Log4j主页：http://jakarta.apache.org/log4j 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
-------------------------------------------------------------------------------- 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Index 
&lt;br&gt;
&lt;br&gt;
Log4j的类图 
&lt;br&gt;
Logger：日志写出器 
&lt;br&gt;
Logger的输出方法 
&lt;br&gt;
Logger的命名规则 
&lt;br&gt;
Log level 
&lt;br&gt;
示例代码 
&lt;br&gt;
关于logger的两点说明 
&lt;br&gt;
Appender：日志目的地 
&lt;br&gt;
ConsoleAppender 
&lt;br&gt;
FileAppender 
&lt;br&gt;
RollingFileAppender 
&lt;br&gt;
Layout：日志格式化器 
&lt;br&gt;
PatternLayout 
&lt;br&gt;
patterns in PatternLayout 
&lt;br&gt;
Configuration：配置 
&lt;br&gt;
默认的log4j初始化过程 
&lt;br&gt;
BasicConfigurator.configure() 
&lt;br&gt;
xml格式的log4j配置文件概述 
&lt;br&gt;
在xml文件中配置appender和layout 
&lt;br&gt;
我自己的一个使用xml文件配置log4j环境的很简单的例子 
&lt;br&gt;
Log4j的编码习惯 
&lt;br&gt;
参考资料 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Log4j的类图 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Logger - 日志写出器，供程序员输出日志信息 
&lt;br&gt;
Appender - 日志目的地，把格式化好的日志信息输出到指定的地方去 
&lt;br&gt;
ConsoleAppender - 目的地为控制台的Appender 
&lt;br&gt;
FileAppender - 目的地为文件的Appender 
&lt;br&gt;
RollingFileAppender - 目的地为大小受限的文件的Appender 
&lt;br&gt;
Layout - 日志格式化器，用来把程序员的logging request格式化成字符串 
&lt;br&gt;
PatternLayout - 用指定的pattern格式化logging request的Layout 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Logger：日志写出器 
&lt;br&gt;
Logger对象是用来取代System.out或者System.err的日志写出器，用来供程序员输出日志信息。 
&lt;br&gt;
&lt;br&gt;
Logger的输出方法 
&lt;br&gt;
Logger类对象提供一系列方法供程序员输出日志信息。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
------ Log4j APIs : class Logger ------ 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
// Printing methods : 
&lt;br&gt;
&lt;br&gt;
public void debug(Object msg); 
&lt;br&gt;
public void debug(Object msg, Throwable t); 
&lt;br&gt;
&lt;br&gt;
public void info(Object msg); 
&lt;br&gt;
public void info(Object msg, Throwable t); 
&lt;br&gt;
&lt;br&gt;
public void warn(Object msg); 
&lt;br&gt;
public void warn(Object msg, Throwable t); 
&lt;br&gt;
&lt;br&gt;
public void error(Object msg); 
&lt;br&gt;
public void error(Object msg, Throwable t); 
&lt;br&gt;
&lt;br&gt;
public void fatal(Object msg); 
&lt;br&gt;
public void fatal(Object msg, Throwable t); 
&lt;br&gt;
&lt;br&gt;
// Generic printing method : 
&lt;br&gt;
&lt;br&gt;
public void log(Level l, Object msg); 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Logger的命名规则 
&lt;br&gt;
Logger由一个String类的名字识别，logger的名字是大小写敏感的，且名字之间具有继承的关系，子名有父名作为前缀，用点号.分隔。如：x.y是x.y.z的父亲。 
&lt;br&gt;
&lt;br&gt;
根logger (root logger)是所有logger的祖先，它具有如下属性：1) 它总是存在的；2) 它不可以通过名字获得。 
&lt;br&gt;
&lt;br&gt;
通过调用public static Logger Logger.getRootLogger()获得root logger；通过调用public static Logger
Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)获得（或者创建）一个named
logger。后者相当于调用Logger.getLogger(clazz.getName())。 
&lt;br&gt;
&lt;br&gt;
在某对象中，用该对象所属的类为参数，调用Logger.getLogger(Class clazz)以获得logger被认为是目前所知的最理智的命名logger的方法。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Log level 
&lt;br&gt;
每个logger都被分配了一个日志级别 (log level)，用来控制日志信息的输出。未被分配level的logger将继承它最近的父logger的level。 
&lt;br&gt;
&lt;br&gt;
每条输出到logger的日志请求(logging request)也都有一个level，如果该request的level大于等于该logger的level，则该request将被处理（称为enabled）；否则该request将被忽略。故可得知： 
&lt;br&gt;
&lt;br&gt;
logger的level越低，表示该logger越详细 
&lt;br&gt;
logging request的level越高，表示该logging request越优先输出 
&lt;br&gt;
&lt;br&gt;
Level类中预定义了五个level，它们的大小关系如下： 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Level.ALL &amp;lt; Level.DEBUG &amp;lt; Level.INFO &amp;lt; Level.WARN &amp;lt; Level.ERROR &amp;lt; Level.FATAL
&amp;lt; Level.OFF 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
示例代码 
&lt;br&gt;
以下代码将用自己所属的类为参数，创建一个logger，启用默认配置，设置其level并向其输出若干logging request。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
import org.apache.log4j.Logger; 
&lt;br&gt;
import org.apache.log4j.BasicConfigurator; 
&lt;br&gt;
import org.apache.log4j.Level; 
&lt;br&gt;
&lt;br&gt;
public class Log4jTest { 
&lt;br&gt;
public static void main(String argv[]) { 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
// Create a logger by the name of class Log4jTest. 
&lt;br&gt;
&lt;br&gt;
Logger logger = Logger.getLogger(Log4jTest.class); 
&lt;br&gt;
&lt;br&gt;
// Use the default configuration. 
&lt;br&gt;
&lt;br&gt;
BasicConfigurator.configure(); 
&lt;br&gt;
&lt;br&gt;
// Set the logger level to Level.INFO 
&lt;br&gt;
&lt;br&gt;
logger.setLevel(Level.INFO); 
&lt;br&gt;
&lt;br&gt;
// This request will be disabled since Level.DEBUG &amp;lt; Level.INFO. 
&lt;br&gt;
&lt;br&gt;
logger.debug("This is debug."); 
&lt;br&gt;
&lt;br&gt;
// These requests will be enabled. 
&lt;br&gt;
&lt;br&gt;
logger.info("This is an info."); 
&lt;br&gt;
logger.warn("This is a warning."); 
&lt;br&gt;
logger.error("This is an error."); 
&lt;br&gt;
logger.fatal("This is a fatal error."); 
&lt;br&gt;
&lt;br&gt;
return; 
&lt;br&gt;
} 
&lt;br&gt;
} 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
关于logger的两点说明 
&lt;br&gt;
&lt;br&gt;
用同名参数调用Logger.getLogger(String name)将返回同一个logger的引用。故可以在一个地方配置logger，在另外一个地方获得配置好的logger，而无须相互间传递logger的引用。 
&lt;br&gt;
logger的创建可以按照任意的顺序，即，父logger可以后于子logger被创建。log4j将自动维护logger的继承树。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Appender：日志目的地 
&lt;br&gt;
每个logger都可以拥有一个或者多个appender，每个appender表示一个日志的输出目的地，比如console或者某个文件。可以使用Logger.addAppender(Appender
app)为logger增加一个appender；可以使用Logger.removeAppender(Appender app)为logger移除一个appender。 
&lt;br&gt;
&lt;br&gt;
默认情况下，logger的additive标志被设置为true，表示子logger将继承父logger的所有appenders。该选项可以被重新设置，表示子logger将不再继承父logger的appenders。 
&lt;br&gt;
&lt;br&gt;
root logger拥有目标为system.out的consoleAppender，故默认情况下，所有的logger都将继承该appender。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
------ Log4j APIs : class Logger ------ 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
// 为logger对象增加或者移除一个Appender对象 :. 
&lt;br&gt;
&lt;br&gt;
public void appAppender(Appender app); 
&lt;br&gt;
public void removeAppender(Appender app); 
&lt;br&gt;
&lt;br&gt;
// 获得和设置additive标志：是否继承父logger的appenders :. 
&lt;br&gt;
// 注意：在设置additive标志为false时，必须保证已经为该logger设置了新的appender， :. 
&lt;br&gt;
// 否则log4j将报错：log4j:WARN No appenders could be found for logger (x.y.z). :. 
&lt;br&gt;
&lt;br&gt;
public boolean getAdditivity(); 
&lt;br&gt;
public void setAdditivity(boolean additive); 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
ConsoleAppender 
&lt;br&gt;
可以使用ConsoleAppender对象把日志输出到控制台。每个ConsoleAppender都有一个target，表示它的输出目的地。它可以是System.out，标准输出设备（缓冲显示屏）；或者是System.err，标准错误设备（不缓冲显示屏）。ConsoleAppender的使用方法参考如下API
:. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
------ Log4j APIs : class ConsoleAppender extends WriterAppender ------ 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
// 构造方法，使用一个Layout对象构造一个ConsoleAppender对象 :. 
&lt;br&gt;
// 默认情况下，ConsoleAppender的target是System.out :. 
&lt;br&gt;
&lt;br&gt;
public ConsoleAppender(Layout layout); 
&lt;br&gt;
&lt;br&gt;
// 构造方法，使用一个Layout对象和一个target字符串构造ConsoleAppender对象 :. 
&lt;br&gt;
// target的可能取值为ConsoleAppender.SYSTEM_OUT和ConsoleAppender.SYSTEM_ERR :. 
&lt;br&gt;
&lt;br&gt;
public ConsoleAppender(Layout layout, String target); 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
FileAppender 
&lt;br&gt;
可以使用FileAppender对象把日志输出到一个指定的日志文件中去。使用方法可以参考如下的API :. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
------ Log4j APIs : class FileAppender extends WriterAppender ------ 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
// 构造方法，使用一个Layout对象和日志文件名构造一个FileAppender对象 :. 
&lt;br&gt;
&lt;br&gt;
public FileAppender(Layout layout, String filename) 
&lt;br&gt;
throws IOException; 
&lt;br&gt;
public FileAppender(Layout layout, String filename, boolean append) 
&lt;br&gt;
throws IOException; 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
RollingFileAppender 
&lt;br&gt;
可以使用FileAppender的子类RollingFileAppender对象，把日志输出到一个指定的日志文件中。不同的是该日志文件的大小受到限制，当日志内容超出最大的尺寸时，该文件将向上滚动（最老的日志被擦除）。还可以在该类对象中指定为日志文件做多少个备份。具体使用方法参考如下API
:. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
------ Log4j APIs : class RollingFileAppender extends FileAppender ------ 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
// 构造方法，使用一个Layout对象和日志文件名构造一个RollingFileAppender对象 :. 
&lt;br&gt;
&lt;br&gt;
public RollingFileAppender(Layout layout, String filename) 
&lt;br&gt;
throws IOException; 
&lt;br&gt;
public RollingFileAppender(Layout layout, String filename, boolean append) 
&lt;br&gt;
throws IOException; 
&lt;br&gt;
&lt;br&gt;
// 获得和设置日志备份文件的个数 :. 
&lt;br&gt;
&lt;br&gt;
public int getMaxBackupIndex(); 
&lt;br&gt;
public void setMaxBackupIndex(int index); 
&lt;br&gt;
&lt;br&gt;
// 获得和设置滚动日志文件的最大尺寸 :. 
&lt;br&gt;
&lt;br&gt;
public long getMaximumFileSize(); 
&lt;br&gt;
public void setMaximumFileSize(long size); 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Layout：日志格式化器 
&lt;br&gt;
每个appender都和一个layout相联系；layout的任务是格式化用户的logging request，appender的任务是把layout格式化好的输出内容送往指定的目的地。 
&lt;br&gt;
&lt;br&gt;
PatternLayout 
&lt;br&gt;
PatternLayout是Layout的一个子类，用来使用类似C语言的printf函数中使用的格式控制字符串来控制日志的输出格式。使用方法参考如下API :. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
------ Log4j APIs : class PatternLayout extends Layout ------ 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
// 无参数构造方法，使用DEFAULT_CONVERSION_PATTERN构造一个PatternLayout :. 
&lt;br&gt;
// 注意：DEFAULT_CONVERSION_PATTERN为"%m%n"，只打印消息信息 :. 
&lt;br&gt;
&lt;br&gt;
public PatternLayout(); 
&lt;br&gt;
&lt;br&gt;
// 构造方法，使用自定义的pattern构造一个PatternLayout :. 
&lt;br&gt;
&lt;br&gt;
public PatternLayout(String pattern); 
&lt;br&gt;
&lt;br&gt;
// 获得和设置PatternLayout对象的日志pattern :. 
&lt;br&gt;
&lt;br&gt;
public String getConversionPattern(); 
&lt;br&gt;
public void setConversionPattern(String pattern); 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
patterns in PatternLayout 
&lt;br&gt;
未完待续 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Configuration：配置 
&lt;br&gt;
对log4j环境的配置就是对root logger的配置，包括把root logger设置为哪个级别(level)；为它增加哪些appender，等等。这些可以通过设置系统属性的方法来隐式地完成，也可以在程序里调用XXXConfigurator.configure()方法来显式地完成。 
&lt;br&gt;
&lt;br&gt;
默认的log4j初始化过程 
&lt;br&gt;
Logger类的静态初始化块(static initialization block)中对log4j的环境做默认的初始化。注意：如果程序员已经通过设置系统属性的方法来配置了log4j环境，则不需要再显式地调用XXXConfigurator.configure()方法来配置log4j环境了。 
&lt;br&gt;
&lt;br&gt;
Logger的静态初始化块在完成初始化过程时将检查一系列log4j定义的系统属性。它所做的事情如下： 
&lt;br&gt;
&lt;br&gt;
检查系统属性log4j.defaultInitOverride，如果该属性被设置为false，则执行初始化；否则（只要不是false，无论是什么值，甚至没有值，都是否则），跳过初始化。 
&lt;br&gt;
把系统属性log4j.configuration的值赋给变量resource。如果该系统变量没有被定义，则把resource赋值为"log4j.properties"。注意：在apache的log4j文档中建议使用定义log4j.configuration系统属性的方法来设置默认的初始化文件是一个好方法。 
&lt;br&gt;
试图把resource变量转化成为一个URL对象url。如果一般的转化方法行不通，就调用org.apache.log4j.helpers.Loader.getResource(resource,
Logger.class)方法来完成转化。 
&lt;br&gt;
如果url以".html"结尾，则调用方法DOMConfigurator.configure(url)来完成初始化；否则，则调用方法PropertyConfigurator.configure(url)来完成初始化。如果url指定的资源不能被获得，则跳出初始化过程。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
BasicConfigurator.configure() 
&lt;br&gt;
BasicConfigurator.configure()方法使用最简的方法配置log4j环境。注：所谓配置log4j环境，就是指配置root logger，因为所有其它的logger都是root
logger的后代，所以它们（默认情况下）都将继承root logger的性质。 
&lt;br&gt;
&lt;br&gt;
BasicConfigurator.configure()完成的任务是： 
&lt;br&gt;
&lt;br&gt;
用默认pattern创建PatternLayout对象p： 
&lt;br&gt;
PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x - %m%n"); 
&lt;br&gt;
用p创建ConsoleAppender对象a，目标是system.out，标准输出设备： 
&lt;br&gt;
ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT); 
&lt;br&gt;
为root logger增加一个ConsoleAppender p： 
&lt;br&gt;
rootLogger.addAppender(p); 
&lt;br&gt;
把root logger的log level设置为DEBUG级别： 
&lt;br&gt;
rootLogger.setLevel(Level.DEBUG); 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
xml格式的log4j配置文件概述 
&lt;br&gt;
xml格式的log4j配置文件需要使用org.apache.log4j.html.DOMConfigurator.configure()方法来读入。对xml文件的语法定义可以在log4j的发布包中找到：org/apache/log4j/xml/log4j.dtd。 
&lt;br&gt;
&lt;br&gt;
log4j的xml配置文件的树状结构 
&lt;br&gt;
log4j的xml配置文件的树状结构如下所示，注意下图只显示了常用的部分。 :. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
xml declaration and dtd 
&lt;br&gt;
| 
&lt;br&gt;
log4j:configuration 
&lt;br&gt;
| 
&lt;br&gt;
+-- appender (name, class) 
&lt;br&gt;
| | 
&lt;br&gt;
| +-- param (name, value) 
&lt;br&gt;
| +-- layout (class) 
&lt;br&gt;
| | 
&lt;br&gt;
| +-- param (name, value) 
&lt;br&gt;
+-- logger (name, additivity) 
&lt;br&gt;
| | 
&lt;br&gt;
| +-- level (class, value) 
&lt;br&gt;
| | | 
&lt;br&gt;
| | +-- param (name, value) 
&lt;br&gt;
| +-- appender-ref (ref) 
&lt;br&gt;
+-- root 
&lt;br&gt;
| 
&lt;br&gt;
+-- param (name, class) 
&lt;br&gt;
+-- level 
&lt;br&gt;
| | 
&lt;br&gt;
| +-- param (name, value) 
&lt;br&gt;
+-- appender-ref (ref) 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
xml declaration and dtd 
&lt;br&gt;
xml配置文件的头部包括两个部分：xml声明和dtd声明。头部的格式如下： :. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt; 
&lt;br&gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
log4j:configuration (root element) 
&lt;br&gt;
&lt;br&gt;
xmlns:log4j [#FIXED attribute] : 定义log4j的名字空间，取定值"http://jakarta.apache.org/log4j/" 
&lt;br&gt;
appender [* child] : 一个appender子元素定义一个日志输出目的地 
&lt;br&gt;
logger [* child] : 一个logger子元素定义一个日志写出器 
&lt;br&gt;
root [? child] : root子元素定义了root logger 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
appender 
&lt;br&gt;
appender元素定义一个日志输出目的地。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
name [#REQUIRED attribute] : 定义appender的名字，以便被后文引用 
&lt;br&gt;
class [#REQUIRED attribute] : 定义appender对象所属的类的全名 
&lt;br&gt;
param [* child] : 创建appender对象时传递给类构造方法的参数 
&lt;br&gt;
layout [? child] : 该appender使用的layout对象 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
layout 
&lt;br&gt;
layout元素定义与某一个appender相联系的日志格式化器。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
class [#REQUIRED attribute] : 定义layout对象所属的类的全名 
&lt;br&gt;
param [* child] : 创建layout对象时传递给类构造方法的参数 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
logger 
&lt;br&gt;
logger元素定义一个日志输出器。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
name [#REQUIRED attribute] : 定义logger的名字，以便被后文引用 
&lt;br&gt;
additivity [#ENUM attribute] : 取值为"true"（默认）或者"false"，是否继承父logger的属性 
&lt;br&gt;
level [? child] : 定义该logger的日志级别 
&lt;br&gt;
appender-ref [* child] : 定义该logger的输出目的地 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
root 
&lt;br&gt;
root元素定义根日志输出器root logger。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
param [* child] : 创建root logger对象时传递给类构造方法的参数 
&lt;br&gt;
level [? child] : 定义root logger的日志级别 
&lt;br&gt;
appender-ref [* child] : 定义root logger的输出目的地 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
level 
&lt;br&gt;
level元素定义logger对象的日志级别。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
class [#IMPLIED attribute] : 定义level对象所属的类，默认情况下是"org.apache.log4j.Level类 
&lt;br&gt;
value [#REQUIRED attribute] : 为level对象赋值。可能的取值从小到大依次为"all"、"debug"、"info"、"warn"、"error"、"fatal"和"off"。当值为"off"时表示没有任何日志信息被输出 
&lt;br&gt;
param [* child] : 创建level对象时传递给类构造方法的参数 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
appender-ref 
&lt;br&gt;
appender-ref元素引用一个appender元素的名字，为logger对象增加一个appender。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
ref [#REQUIRED attribute] : 一个appender元素的名字的引用 
&lt;br&gt;
appender-ref元素没有子元素 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
param 
&lt;br&gt;
param元素在创建对象时为类的构造方法提供参数。它可以成为appender、layout、filter、errorHandler、level、categoryFactory和root等元素的子元素。 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
name and value [#REQUIRED attributes] : 提供参数的一组名值对 
&lt;br&gt;
param元素没有子元素 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
在xml文件中配置appender和layout 
&lt;br&gt;
创建不同的Appender对象或者不同的Layout对象要调用不同的构造方法。可以使用param子元素来设定不同的参数值。 
&lt;br&gt;
&lt;br&gt;
创建ConsoleAppender对象 
&lt;br&gt;
ConsoleAppender的构造方法不接受其它的参数。 :. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&amp;lt;appender name="console.log" class="org.apache.log4j.ConsoleAppender"&amp;gt; 
&lt;br&gt;
&amp;lt;layout ... &amp;gt; 
&lt;br&gt;
... ... 
&lt;br&gt;
&amp;lt;/layout&amp;gt; 
&lt;br&gt;
&amp;lt;/appender&amp;gt; 
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
创建FileAppender对象 
&lt;br&gt;
可以为FileAppender类的构造方法传递两个参数：File表示日志文件名；Append表示如文件已存在，是否把日志追加到文件尾部，可能取值为"true"和"false"（默认）。
:. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&amp;lt;appender name="file.log" class="org.apache.log4j.FileAppender"&amp;gt; 
&lt;br&gt;
&amp;lt;param name="File" value="/tmp/log.txt" /&amp;gt; 
&lt;br&gt;
&amp;lt;param name="Append" value="false" /&amp;gt; 
&lt;br&gt;
&amp;lt;layout ... &amp;gt; 
&lt;br&gt;
... ... 
&lt;br&gt;
&amp;lt;/layout&amp;gt; 
&lt;br&gt;
&amp;lt;/appender&amp;gt; 
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
创建RollingFileAppender对象 
&lt;br&gt;
除了File和Append以外，还可以为RollingFileAppender类的构造方法传递两个参数：MaxBackupIndex备份日志文件的个数（默认是1个）；MaxFileSize表示日志文件允许的最大字节数（默认是10M）。
:. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&amp;lt;appender name="rollingFile.log" class="org.apache.log4j.RollingFileAppender"&amp;gt; 
&lt;br&gt;
&amp;lt;param name="File" value="/tmp/rollingLog.txt" /&amp;gt; 
&lt;br&gt;
&amp;lt;param name="Append" value="false" /&amp;gt; 
&lt;br&gt;
&amp;lt;param name="MaxBackupIndex" value="2" /&amp;gt; 
&lt;br&gt;
&amp;lt;param name="MaxFileSize" value="1024" /&amp;gt; 
&lt;br&gt;
&amp;lt;layout ... &amp;gt; 
&lt;br&gt;
... ... 
&lt;br&gt;
&amp;lt;/layout&amp;gt; 
&lt;br&gt;
&amp;lt;/appender&amp;gt; 
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
创建PatternLayout对象 
&lt;br&gt;
可以为PatternLayout类的构造方法传递参数ConversionPattern。 :. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&amp;lt;layout class="org.apache.log4j.PatternLayout&amp;gt; 
&lt;br&gt;
&amp;lt;param name="Conversion" value="%d [%t] %p - %m%n" /&amp;gt; 
&lt;br&gt;
&amp;lt;/layout&amp;gt; 
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
我自己的一个使用xml文件配置log4j环境的很简单的例子 
&lt;br&gt;
为WSOTA项目开发java web start的胖客户端时，使用了如下的xml文件配置log4j环境（文件名为wsota-rc.log4j.html）：:. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt; 
&lt;br&gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;!-- ================================================================= --&amp;gt; 
&lt;br&gt;
&amp;lt;!-- a rolling file appender --&amp;gt; 
&lt;br&gt;
&amp;lt;!-- ================================================================= --&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;appender name="wsota-rc.file.log" class="org.apache.log4j.RollingFileAppender"&amp;gt; 
&lt;br&gt;
&amp;lt;param name="File" value="/tmp/wsota-rc.log" /&amp;gt; 
&lt;br&gt;
&amp;lt;param name="Append" value="false" /&amp;gt; 
&lt;br&gt;
&amp;lt;layout class="org.apache.log4j.PatternLayout"&amp;gt; 
&lt;br&gt;
&amp;lt;param name="ConversionPattern" value="%d [%t] %p - %m%n" /&amp;gt; 
&lt;br&gt;
&amp;lt;/layout&amp;gt; 
&lt;br&gt;
&amp;lt;/appender&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;!-- ================================================================= --&amp;gt; 
&lt;br&gt;
&amp;lt;!-- a console appender --&amp;gt; 
&lt;br&gt;
&amp;lt;!-- debug can be turned off by setting level of root to "off" --&amp;gt; 
&lt;br&gt;
&amp;lt;!-- ================================================================= --&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;appender name="wsota-rc.console.log" class="org.apache.log4j.ConsoleAppender"&amp;gt; 
&lt;br&gt;
&amp;lt;layout class="org.apache.log4j.PatternLayout"&amp;gt; 
&lt;br&gt;
&amp;lt;param name="ConversionPattern" value="%d [%t] %p - %m%n" /&amp;gt; 
&lt;br&gt;
&amp;lt;/layout&amp;gt; 
&lt;br&gt;
&amp;lt;/appender&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;!-- use this to turn on debug to a rolling file. --&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;root&amp;gt; 
&lt;br&gt;
&amp;lt;level value="debug" /&amp;gt; 
&lt;br&gt;
&amp;lt;appender-ref ref="wsota-rc.file.log" /&amp;gt; 
&lt;br&gt;
&amp;lt;/root&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;!-- use this to turn on debug to console. --&amp;gt; 
&lt;br&gt;
&amp;lt;!-- 
&lt;br&gt;
&amp;lt;root&amp;gt; 
&lt;br&gt;
&amp;lt;level value="off" /&amp;gt; 
&lt;br&gt;
&amp;lt;appender-ref ref="wsota-rc.console.log" /&amp;gt; 
&lt;br&gt;
&amp;lt;/root&amp;gt; 
&lt;br&gt;
--&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;lt;!-- use this to turn off debug. --&amp;gt; 
&lt;br&gt;
&amp;lt;!-- 
&lt;br&gt;
&amp;lt;root&amp;gt; 
&lt;br&gt;
&amp;lt;level value="off" /&amp;gt; 
&lt;br&gt;
&amp;lt;appender-ref ref="wsota-rc.console.log" /&amp;gt; 
&lt;br&gt;
&amp;lt;/root&amp;gt; 
&lt;br&gt;
--&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&amp;lt;/log4j:configuration&amp;gt; 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
在胖客户程序中使用了如下代码来使用外部xml文件配置log4j环境，注意该代码段位于程序的main class的静态初始化块中，含有以下代码的类和xml配置文件在同一个目录下：:. 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
import org.apache.log4j.html.DOMConfigurator; 
&lt;br&gt;
&lt;br&gt;
public class SapFrame extends JFrame { 
&lt;br&gt;
static { 
&lt;br&gt;
DOMConfigurator.configure(SapFrame.class.getResource("wsota-rc.log4j.html")); 
&lt;br&gt;
} 
&lt;br&gt;
... ... ... ... 
&lt;br&gt;
} 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Log4j的编码习惯 
&lt;br&gt;
&lt;br&gt;
让每个类都拥有一个private static的Logger对象，用来输出该类中的全部日志信息 
&lt;br&gt;
使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意：在一个项目中，log4j环境只需要被配置一次，而不是在每个使用了logger的类里都需要调用一次 
&lt;br&gt;
用MyClass.class作为参数创建该类的静态Logger对象 
&lt;br&gt;
补充中... 
&lt;br&gt;
&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=c7f0b35a-6564-4009-a261-1745e8e802b2" /&gt;</description>
      <category>Java 技术</category>
      <category>文摘和收藏</category>
    </item>
    <item>
      <trackback:ping>http://www.hifar.com/blog/Trackback.aspx?guid=4d67ce90-6613-4539-befd-28f2db7e04ad</trackback:ping>
      <pingback:server>http://www.hifar.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hifar.com/blog/PermaLink,guid,4d67ce90-6613-4539-befd-28f2db7e04ad.aspx</pingback:target>
      <dc:creator>Jimmy Gao</dc:creator>
      <title>Struts Validator 开发指南</title>
      <guid isPermaLink="false">http://www.hifar.com/blog/PermaLink,guid,4d67ce90-6613-4539-befd-28f2db7e04ad.aspx</guid>
      <link>http://www.hifar.com/blog/2004/12/07/StrutsValidator%e5%bc%80%e5%8f%91%e6%8c%87%e5%8d%97.aspx</link>
      <pubDate>Tue, 07 Dec 2004 16:09:00 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="TEXT-INDENT: 48pt; TEXT-ALIGN: center" align=center&gt;
&lt;span lang=EN-US style="FONT-SIZE: 24pt"&gt;Struts &lt;span class=SpellE&gt;Validator&lt;/span&gt; &lt;/span&gt;&lt;span style="FONT-SIZE: 24pt; FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;开发指南&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 24pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc1 style="TEXT-INDENT: 20.1pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span lang=EN-US&gt;&lt;span class=MsoHyperlink&gt;&lt;span style="mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710105"&gt;&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;使&lt;/span&gt;&lt;/span&gt;Struts&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;支持&lt;/span&gt;&lt;/span&gt;Validator&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.. &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;1&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; TEXT-TRANSFORM: none; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc1 style="TEXT-INDENT: 20.1pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710106"&gt;Validator-rules.xml&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;文件&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;2&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; TEXT-TRANSFORM: none; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc1 style="TEXT-INDENT: 20.1pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710107"&gt;Validator.xml &lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;文件&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;2&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; TEXT-TRANSFORM: none; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710108"&gt;Required
Validator&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.. &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;3&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710109"&gt;Mask
Validator&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.. &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;3&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710110"&gt;Range
Validator&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.. &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;4&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710111"&gt;Maxlength
Validator&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.. &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;4&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710112"&gt;Minlength
Validator&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.. &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;5&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710113"&gt;Email
Validator&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.. &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;5&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc1 style="TEXT-INDENT: 20.1pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710114"&gt;Form
Bean&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;的编写&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;5&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; TEXT-TRANSFORM: none; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc1 style="TEXT-INDENT: 20.1pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710115"&gt;Struts-config.xml&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;文件的配置&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;5&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; TEXT-TRANSFORM: none; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc1 style="TEXT-INDENT: 20.1pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710116"&gt;&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;在&lt;/span&gt;&lt;/span&gt;JSP&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;页面捕捉错误信息&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;6&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; TEXT-TRANSFORM: none; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710117"&gt;&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;捕捉服务端的错误信息&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;6&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710118"&gt;&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;捕捉&lt;/span&gt;&lt;/span&gt;JavaScript&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;的错误信息&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;6&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc1 style="TEXT-INDENT: 20.1pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710119"&gt;&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;编写&lt;span lang=EN-US&gt;扩展&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Struts
Validator&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;校验密码输入&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;.... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;7&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-WEIGHT: normal; FONT-SIZE: 10.5pt; TEXT-TRANSFORM: none; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710120"&gt;1.&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;编写一个校验器&lt;/span&gt;&lt;/span&gt;(Validator),&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;实现对&lt;/span&gt;&lt;/span&gt;form&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;中两个字段的一致性校验&lt;/span&gt;&lt;/span&gt;:&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;7&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710121"&gt;2.&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;编写&lt;/span&gt;&lt;/span&gt;validator-rules&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;文件&lt;/span&gt;&lt;/span&gt;,&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;增加一个自定义校验器的配置&lt;/span&gt;&lt;/span&gt;:&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;8&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710122"&gt;3.&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;编写&lt;/span&gt;&lt;/span&gt;JSP&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;页面&lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt;... &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;9&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoToc2 style="TEXT-INDENT: 20pt; tab-stops: right dotted 414.8pt"&gt;
&lt;span class=MsoHyperlink&gt;&lt;span lang=EN-US style="TEXT-TRANSFORM: uppercase; FONT-VARIANT: normal! important; mso-no-proof: yes"&gt;&lt;a href="http://xrh.vip.sina.com/#_Toc67710123"&gt;4.&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;编写&lt;/span&gt;&lt;/span&gt;validator.xml&lt;span lang=EN-US style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;span lang=EN-US&gt;配置文件&lt;/span&gt;&lt;/span&gt;:&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;span style="mso-tab-count: 1 dotted"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;10&lt;/span&gt;&lt;span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-VARIANT: normal! important; mso-bidi-font-size: 12.0pt; mso-no-proof: yes"&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="TEXT-INDENT: 44.15pt"&gt;&lt;a name=_Toc67710105&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;使&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710105"&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;支持&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=074 style="MARGIN-BOTTOM: 7.8pt; TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;要在&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;项目中使用&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;功能&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;首先需要配置&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;项目&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;使其支持&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框架&lt;/span&gt;&lt;span lang=EN-US&gt;.Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;通过一个插件&lt;/span&gt;&lt;span lang=EN-US&gt;(&lt;span class=SpellE&gt;Plugin&lt;/span&gt;)&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;来使&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;项目支持&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Plugin&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;由&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;默认提供&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;用户也可以自己开发自己的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt; &lt;span class=SpellE&gt;Plugin.Struts&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;默认提供的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Plugin&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;为&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p class=074 style="MARGIN-BOTTOM: 7.8pt; TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span class=GramE&gt;&lt;span lang=EN-US&gt;org.apache.struts.validator.ValidatorPlugIn&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=GramE&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;用户必须在&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中配置这个&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Plugin&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;才能使&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;项目支持&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;配置方法比较简单&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;通过任何文本编辑器打开&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在这个文件的末尾加上下面的代码&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;重新启动&lt;/span&gt;&lt;span lang=EN-US&gt;J2EE&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;服务器就可以实现对&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的支持了&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #ccffff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;plug-in &lt;span class=SpellE&gt;className&lt;/span&gt;="&lt;span class=SpellE&gt;org.apache.struts.validator.ValidatorPlugIn&lt;/span&gt;"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;set-property&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/span&gt;property="pathnames" &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 84pt; mso-char-indent-count: 8.0"&gt;
&lt;span lang=EN-US&gt;value="/WEB-&lt;span class=SpellE&gt;INF/validator-rules.xml,/WEB-INF/validation.xml&lt;/span&gt;"
/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/plug-in&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Jbuilder&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;开发环境中可以通过下面的方法使&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;项目支持&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框架&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;span style="mso-list: Ignore"&gt;1.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在项目管理器中用鼠标右键点击&lt;/span&gt;&lt;span lang=EN-US&gt;Web&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;项目&lt;/span&gt;&lt;span lang=EN-US&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在我们的项目中是&lt;/span&gt;&lt;span lang=EN-US&gt; &lt;span class=SpellE&gt;WebModule&lt;/span&gt; ).&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;span style="mso-list: Ignore"&gt;2.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;选择菜单的&lt;/span&gt;&lt;span lang=EN-US&gt; &amp;#8220;Properties&amp;#8230;&amp;#8221;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;菜单项&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;span style="mso-list: Ignore"&gt;3.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在弹出的对话框的&lt;span class=GramE&gt;左边树&lt;/span&gt;型结构中选中&lt;/span&gt; &lt;span lang=EN-US&gt;&amp;#8220;web&amp;#8221; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;节点&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;span style="mso-list: Ignore"&gt;4.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在右边的&lt;/span&gt; &lt;span lang=EN-US&gt;&amp;#8220;JSP/&lt;span class=SpellE&gt;Servlet&lt;/span&gt; frameworks&amp;#8221; &lt;/span&gt;&lt;span class=GramE&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框中勾选&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;&lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt; &amp;#8220;sturts&lt;st1:chmetcnv TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1.1" UnitName="&amp;#8221;" w:st="on"&gt;1.1&amp;#8221;&lt;/st1:chmetcnv&gt;
&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;节点以及&lt;/span&gt;&lt;span lang=EN-US&gt; &amp;#8220;struts&amp;#8221; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;节点下的&lt;/span&gt;&lt;span lang=EN-US&gt; &amp;#8220;validation&amp;#8221; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;子节点&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;span style="mso-list: Ignore"&gt;5.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;点击&lt;/span&gt; &lt;span lang=EN-US&gt;&amp;#8220;OK&amp;#8221; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;按钮完成配置&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; tab-stops: list 21.0pt; mso-list: l0 level1 lfo1"&gt;
&lt;span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"&gt;&lt;span style="mso-list: Ignore"&gt;6.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;检查&lt;/span&gt;&lt;span lang=EN-US&gt; struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;可以看到配置文件里已经加入了&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt; &lt;span class=SpellE&gt;Plugin&lt;/span&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="TEXT-INDENT: 44.15pt"&gt;&lt;a name=_Toc67710106&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710106"&gt;&lt;span lang=EN-US&gt;Validator-rules.xml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710106"&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件&lt;/span&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator-rules.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件是校验器的定义文件&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;指定了每一个校验器的基本信息和执行校验的&lt;/span&gt;&lt;span lang=EN-US&gt;JavaScript&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;代码&lt;/span&gt;&lt;span lang=EN-US&gt;.Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;默认提供了十四个校验器&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这些校验器可以满足我们平时项目开发中碰到的绝大多数的输入校验要求&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果这些校验器不能满足用户的校验要求&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;那么我们也可以开发自己的校验器&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;我们项目主就实现了一个校验密码的一致性的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;提供的校验器包括&lt;/span&gt;&lt;span lang=EN-US&gt;Required &lt;span class=SpellE&gt;Validator&lt;/span&gt; ,&lt;span class=SpellE&gt;Requiredif&lt;/span&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt;, &lt;span class=SpellE&gt;MinLength&lt;/span&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt; , &lt;span class=SpellE&gt;MaxLength&lt;/span&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt; ,
Mask &lt;span class=SpellE&gt;Validator&lt;/span&gt; , Byte &lt;span class=SpellE&gt;Validator&lt;/span&gt; ,
Short &lt;span class=SpellE&gt;Validaotr&lt;/span&gt; , Integer &lt;span class=SpellE&gt;Validator&lt;/span&gt; ,
Long &lt;span class=SpellE&gt;Validator&lt;/span&gt; , Float &lt;span class=SpellE&gt;Validator&lt;/span&gt; ,
Double &lt;span class=SpellE&gt;Validator&lt;/span&gt; , Date &lt;span class=SpellE&gt;Validator&lt;/span&gt; ,
Range &lt;span class=SpellE&gt;Validator&lt;/span&gt; , &lt;span class=SpellE&gt;IntRange&lt;/span&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt; , &lt;span class=SpellE&gt;FloatRange&lt;/span&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt; , &lt;span class=SpellE&gt;CrediteCard&lt;/span&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt; ,
Email &lt;span class=SpellE&gt;Validator&lt;/span&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;等校验器&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span class=GramE&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;后面我&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;将讲述一些比较常用的校验器的使用方法&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="TEXT-INDENT: 44.15pt"&gt;&lt;a name=_Toc67710107&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710107"&gt;&lt;span lang=EN-US&gt;Validator.xml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710107"&gt;&lt;span lang=EN-US&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710107"&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件&lt;/span&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator.xml&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件用来定义用户需要校验的每一个&lt;/span&gt;&lt;span lang=EN-US&gt;JSP
Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的每一个字段的校验规则&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个文件是我们在&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;项目开发中使用&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框架所需要配置的文件&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个文件的根节点是&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;form-&lt;span class=SpellE&gt;validator&lt;/span&gt;&amp;gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在根节点下的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;formset&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;节点的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;form&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;子节点就对应了我们在开发&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件是所定义的&lt;/span&gt;&lt;span lang=EN-US&gt;Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;也对应这&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的&lt;/span&gt;&lt;span lang=EN-US&gt;form
bean&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的定义&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;一个&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;form&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;节点由多个&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;field&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;节点组成&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;每个&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;field&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;节点的结构大概如下&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;field
property="password" depends="&lt;span class=SpellE&gt;required,minlength,twofields&lt;/span&gt;"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="required"
key="&lt;span class=SpellE&gt;test.required&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="&lt;span class=SpellE&gt;minlength&lt;/span&gt;"
key="&lt;span class=SpellE&gt;test.minlength&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="&lt;span class=SpellE&gt;twofields&lt;/span&gt;"
key="&lt;span class=SpellE&gt;test.twofields&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg0
key="&lt;span class=SpellE&gt;test.password&lt;/span&gt;" /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg1
name="&lt;span class=SpellE&gt;minlength&lt;/span&gt;" key="${&lt;span class=SpellE&gt;var:minlength&lt;/span&gt;}"
resource="false" /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;span class=SpellE&gt;minlength&lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;8&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;span class=SpellE&gt;secondProperty&lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;password2&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;其中一个&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;Field&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;对应于一个&lt;/span&gt;&lt;span lang=EN-US&gt;Form
Bean&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的一个&lt;/span&gt;&lt;span lang=EN-US&gt;Field,&amp;lt;Field&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记的&lt;/span&gt;&lt;span lang=EN-US&gt;property&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性说明了这个&lt;/span&gt;&lt;span lang=EN-US&gt;Field&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;对应的&lt;/span&gt;&lt;span lang=EN-US&gt;Form
Bean&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;Field&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;名称&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个名称要跟&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;form-bean&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中定义的名字一致&lt;/span&gt;&lt;span lang=EN-US&gt;.depends&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性说明了这个&lt;/span&gt;&lt;span lang=EN-US&gt;Field&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;依赖于那些校验器的校验&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;可以使用多个校验器&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;各个校验器之间使用逗号隔开&lt;/span&gt;&lt;span lang=EN-US&gt;.&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记说明了当这个&lt;/span&gt;&lt;span lang=EN-US&gt;Field&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;通不过校验的时候向用户提供的错误信息&lt;/span&gt;&lt;span lang=EN-US&gt;.name&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性指定了对应的校验器&lt;/span&gt;&lt;span lang=EN-US&gt;,key&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性指定了定义在&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ApplicationResources.properties&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中的错误信息&lt;/span&gt;&lt;span lang=EN-US&gt;.&amp;lt;arg0&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;和&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;arg1&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;是传递给校验器的参数&lt;/span&gt;&lt;span lang=EN-US&gt;.&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记定义了参数的名字和参数值&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;上面的这个例子说明了&lt;/span&gt;&lt;span lang=EN-US&gt;password&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;字段由&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Required,Minlength,Twofields&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验器进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;指定了这个&lt;/span&gt;&lt;span lang=EN-US&gt;Field&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;不能为空&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;而且最小长度不能小于&lt;/span&gt;&lt;span lang=EN-US&gt;8&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;为&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;并且必须和同一个&lt;/span&gt;&lt;span lang=EN-US&gt;Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的另一个名为&lt;/span&gt;&lt;span lang=EN-US&gt;password2&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的字段相同&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果用户的输入不能满足这些要求&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验器将会抛出异常&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;下面开始将怎么在这个配置文件中配置各个校验&lt;span class=GramE&gt;器实现&lt;/span&gt;对&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的多&lt;span class=GramE&gt;中类型&lt;/span&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;field&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710108&gt;&lt;span lang=EN-US&gt;Required &lt;/span&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710108"&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710108"&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个校验器用来校验&lt;/span&gt;&lt;span lang=EN-US&gt;Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的输入数据不能为空&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果某一个&lt;/span&gt;&lt;span lang=EN-US&gt;Form &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt; Field &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;依赖于这个校验器&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;那么如果用户在&lt;/span&gt;&lt;span lang=EN-US&gt;Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中没有输入这个&lt;/span&gt;&lt;span lang=EN-US&gt;Field&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;对应的输入数据时&lt;/span&gt;&lt;span lang=EN-US&gt;,Required&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验器将会触发一个&lt;/span&gt;&lt;span lang=EN-US&gt;Exception,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个&lt;/span&gt;&lt;span lang=EN-US&gt;Exception&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的错误信息可以在页面或者服务端被捕捉到&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;例子&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;field&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;property="test"
depends="required"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="required"
key="&lt;span class=SpellE&gt;test.required&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg0
key="&lt;span class=SpellE&gt;test.testField.displayName&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;上面的例子说明了&lt;/span&gt;&lt;span lang=EN-US&gt;test&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;字段的校验规则是不能为空&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ApplicationResources.properties&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的相应的定义信息可能是下面这样的情况&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Test.testField.displayName&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt; =&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;测试字段&lt;/span&gt;&lt;span lang=EN-US&gt; #&lt;/span&gt;&lt;span class=GramE&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;上面在&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;arg0&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记中定义的&lt;/span&gt;&lt;span lang=EN-US&gt;key=
&amp;#8220;&lt;span class=SpellE&gt;test.testField&lt;/span&gt;&amp;#8221; &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;对应这个信息&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Test.required&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;={0} &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;不能为空&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;请重新输入&lt;/span&gt;&lt;span lang=EN-US&gt;.
#&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在上面定义的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记对应这个信息&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验到用户没有输入&lt;/span&gt;&lt;span lang=EN-US&gt;test&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个字段&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;就会将&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;test.testField&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;对应的信息作为&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;test.required&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的参数传递给校验器&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果在&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面中捕捉了错误信息&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;错误信息将会是下面的这个形式&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;#8220;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;测试字段&lt;/span&gt; &lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;不能为空&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;请重新输入&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;#8221;&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710109&gt;&lt;span lang=EN-US&gt;Mask &lt;/span&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710109"&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710109"&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;Mask &lt;span class=SpellE&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验用户输入的数据是否遵照一定的规则&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个规则由开发者在&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中定义&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;例子&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;field property="&lt;span class=SpellE&gt;postalCode&lt;/span&gt;"
depends="mask"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;arg0 key="&lt;span class=SpellE&gt;test.postalCode.displayname&lt;/span&gt;"/&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;arg1 name=&amp;#8221;mask&amp;#8221; key="${&lt;span class=SpellE&gt;var:mask&lt;/span&gt;}"
resource="false"&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 42pt; mso-char-indent-count: 4.0"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;mask&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 42pt; mso-char-indent-count: 4.0"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;^0\d*$&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US style="mso-font-kerning: 0pt"&gt;&amp;lt;/field&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;上面的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;arg1&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记说明了这个校验的第二个参数是定义在下面的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记的名为&lt;/span&gt;&lt;span lang=EN-US&gt;mask&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的值&lt;/span&gt;&lt;span lang=EN-US&gt;.&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的值说明了这个字段必须是以数字&lt;/span&gt;&lt;span lang=EN-US&gt;0&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;开头&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;以任意数字字符结尾的一个串&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710110&gt;&lt;span lang=EN-US&gt;Range &lt;/span&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710110"&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710110"&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个校验器校验字段是否在一个数字范围内&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;例子&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;field
property="age" depends="range"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="range"
key="&lt;span class=SpellE&gt;test.rang&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg0
key="&lt;span class=SpellE&gt;test.age&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg1
name="range" key="${&lt;span class=SpellE&gt;var:min&lt;/span&gt;}" resource="false"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg2
name="range" key="${&lt;span class=SpellE&gt;var:max&lt;/span&gt;}" resource="false"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;min&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;1&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;max&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;100&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;Range &lt;span class=SpellE&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;需要三个参数&lt;/span&gt;&lt;span lang=EN-US&gt;(&lt;span class=SpellE&gt;arg&lt;/span&gt;),&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;第一个参数&lt;/span&gt;&lt;span lang=EN-US&gt;arg0&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;是指定这个字段的名字&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;第二个和第三个参数指定范围的最大和最小值&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;分别的名称是&lt;/span&gt;&lt;span lang=EN-US&gt;max&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;和&lt;/span&gt;&lt;span lang=EN-US&gt;min.&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710111&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710111"&gt;&lt;span lang=EN-US&gt;Maxlength&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710111"&gt;&lt;span lang=EN-US&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Maxlength&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验器校验一个字符串的最大长度&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;它需要两个参数&lt;/span&gt;&lt;span lang=EN-US&gt;,arg0&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;说明字段的名称&lt;/span&gt;&lt;span lang=EN-US&gt;,arg1&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;说明最大长度&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;例子&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;field
property="password" depends="&lt;span class=SpellE&gt;maxlength&lt;/span&gt;"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="&lt;span class=SpellE&gt;maxlength&lt;/span&gt;"
key="&lt;span class=SpellE&gt;test.minlength&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg0
key="&lt;span class=SpellE&gt;test.password&lt;/span&gt;" /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg1
name="&lt;span class=SpellE&gt;maxlength&lt;/span&gt;" key="${&lt;span class=SpellE&gt;var:maxlength&lt;/span&gt;}"
resource="false" /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;span class=SpellE&gt;maxlength&lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;8&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710112&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710112"&gt;&lt;span lang=EN-US&gt;Minlength&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710112"&gt;&lt;span lang=EN-US&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个校验器类似于上面的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Maxlength&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt; &lt;span class=SpellE&gt;Validator&lt;/span&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;参数一样&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验规则也一样&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;只是作为参数的变量名字为&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;minlength&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;field
property="password" depends="&lt;span class=SpellE&gt;minlength&lt;/span&gt;"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="&lt;span class=SpellE&gt;minlength&lt;/span&gt;"
key="&lt;span class=SpellE&gt;test.minlength&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg0
key="&lt;span class=SpellE&gt;test.password&lt;/span&gt;" /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg1
name="&lt;span class=SpellE&gt;minlength&lt;/span&gt;" key="${&lt;span class=SpellE&gt;var:minlength&lt;/span&gt;}"
resource="false" /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;span class=SpellE&gt;minlength&lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;8&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710113&gt;&lt;span lang=EN-US&gt;Email &lt;/span&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710113"&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710113"&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个校验器校验电子邮件字段&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;当用户输入的电子邮件地址不合法的时候&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验器抛出异常&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;例子&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;field&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;property="email"
depends="&lt;span class=SpellE&gt;required,email&lt;/span&gt;"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="required"
key="&lt;span class=SpellE&gt;test.required&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="email"
key="&lt;span class=SpellE&gt;test.error.email&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;arg0
key="&lt;span class=SpellE&gt;test.email&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;h1 style="TEXT-INDENT: 44.15pt"&gt;&lt;a name=_Toc67710114&gt;&lt;span lang=EN-US&gt;Form Bean&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710114"&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的编写&lt;/span&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;要使用&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框架进行自动校验的&lt;/span&gt;&lt;span lang=EN-US&gt;Form
Bean&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;不能继承自普通的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ActionForm&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;必须继承自&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorForm&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;或者&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorActionForm&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;我们项目组都是继承自&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorForm&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorForm&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;根据&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中的&lt;/span&gt;&lt;span lang=EN-US&gt;action&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;name&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性为当前&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的调用相应的验证器，因此在&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator-rules.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;form-bean&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;元素的名称属性&lt;/span&gt;&lt;span lang=EN-US&gt;(name)&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;应该与&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;action&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;name&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性值相匹配。&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorActionForm&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;使用&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中&lt;/span&gt;&lt;span lang=EN-US&gt;action&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;path&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性，所以&lt;/span&gt;&lt;span lang=EN-US&gt;path&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性的值相应的应该与&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的&lt;/span&gt;&lt;span lang=EN-US&gt;Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;name&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性匹配。&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="TEXT-INDENT: 44.15pt"&gt;&lt;a name=_Toc67710115&gt;&lt;span lang=EN-US&gt;Struts-&lt;/span&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710115"&gt;&lt;span lang=EN-US&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710115"&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件的配置&lt;/span&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;要使用&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框架的自动校验机制&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;还必须在&lt;/span&gt;&lt;span lang=EN-US&gt;Struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中作相应的配置&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;除了前面已经说明了的配置&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt; &lt;span class=SpellE&gt;Plugin&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;意外&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;还需要对需要校验的&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;action&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;进行配置&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;主要有两个地方需要配置&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;一个是&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;action&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;input&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;一个是&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;action&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span lang=EN-US&gt;validate&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性&lt;/span&gt;&lt;span lang=EN-US&gt;.input&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性必须指定包含校验&lt;/span&gt;&lt;span lang=EN-US&gt;Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;jsp&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面的路径&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;以便&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的校验框架校验失败的时候可以重新导向到原来的页面让用户重新输入&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;span class=SpellE&gt;validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性是一个&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;boolean&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;类型的属性&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;必须设置为&lt;/span&gt;&lt;span lang=EN-US&gt;true
struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;才会启动自动校验机制&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="TEXT-INDENT: 44.15pt"&gt;&lt;a name=_Toc67710116&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710116"&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面捕捉错误信息&lt;/span&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的校验机制可以定义在服务端进行校验或者通过&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Javascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在浏览器端进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这两种不同的方式在&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面编写的时候有很大的区别&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710117&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;捕捉服务端的错误信息&lt;/span&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;要捕捉服务端校验的错误信息比较简单&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;只需要在&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面中嵌入一下的代码就可以在页面中显示错误信息&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这些错误信息也可以自定义显示风格&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.0pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.0pt solid #FF6600; mso-border-insidev: 1.0pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1pt solid" valign=top width=568&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;logic:messagesPresent&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;bean:message&lt;/span&gt; key="&lt;span class=SpellE&gt;test.error.descript&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;html:messages&lt;/span&gt; id="error"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;li&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class=SpellE&gt;bean:write&lt;/span&gt; name="error"/&amp;gt;&amp;lt;/&lt;span class=SpellE&gt;li&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;html:messages&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/&lt;span class=SpellE&gt;logic:messagesPresent&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;bean:message&lt;/span&gt; key=&lt;span class=GramE&gt;&amp;#8221;&lt;/span&gt;&lt;span class=SpellE&gt;test.error.descript&lt;/span&gt;&lt;span class=GramE&gt;&amp;#8221;&lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;通过&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ApplicationResources.properties&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中定义的信息向用户报告错误发生的原因和简单说明&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html&lt;span class=GramE&gt;:messages&lt;/span&gt;&lt;/span&gt; id=&amp;#8221;error&amp;#8221;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;li&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class=SpellE&gt;bean&lt;span class=GramE&gt;:write&lt;/span&gt;&lt;/span&gt; name=&amp;#8221;error&amp;#8221;
/&amp;gt;&amp;lt;/&lt;span class=SpellE&gt;li&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/&lt;span class=SpellE&gt;html&lt;span class=GramE&gt;:messages&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;则是显示具体的由&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框架产生的错误信息&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 32.15pt"&gt;&lt;a name=_Toc67710118&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;捕捉&lt;/span&gt;&lt;span lang=EN-US&gt;JavaScript&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710118"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;的错误信息&lt;/span&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;要捕捉&lt;/span&gt;&lt;span lang=EN-US&gt;JavaScript&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;产生的错误信息首先要使&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面产生&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;生成的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Javascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;代码&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;并在用户点击提交按钮的时候让提交按钮触发相应的校验函数&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;实现方法如下&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;首先要让&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;触发校验函数&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;使用这样的&lt;/span&gt;&lt;span lang=EN-US&gt;HTML&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;代码&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html&lt;span class=GramE&gt;:form&lt;/span&gt;&lt;/span&gt; action="/&lt;span class=SpellE&gt;testAction.do&lt;/span&gt;" &lt;span class=SpellE&gt;onsubmit&lt;/span&gt;="return &lt;span class=SpellE&gt;validateTestForm&lt;/span&gt;(this);"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;其中&lt;/span&gt;&lt;span lang=EN-US&gt;action&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;指定这个&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;对应的&lt;/span&gt;&lt;span lang=EN-US&gt;action,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个跟普通的&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;没有区别&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;span class=SpellE&gt;onsubmit&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性就指定了校验函数&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;它的规则是&lt;/span&gt;&lt;span lang=EN-US&gt;:
return + &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;空格&lt;/span&gt;&lt;span lang=EN-US&gt; + &lt;span class=SpellE&gt;validator&lt;/span&gt;+ &lt;span class=SpellE&gt;ValidatorForm&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的名字&lt;/span&gt;&lt;span lang=EN-US&gt; +
(this) &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;注意这样的组合规则是不能变的&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;否则会导致页面错误并不能实现校验功能&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;还要注意&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorForm&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的名字的第一个字母一定要大写&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;不管在&lt;/span&gt;&lt;span lang=EN-US&gt;Struts-&lt;span class=SpellE&gt;congfig.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中的定义是否大写&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这里都要把它作为大写字母&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;然后还要在&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面中产生可以实现校验的&lt;/span&gt;&lt;span lang=EN-US&gt;JavaScript&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;代码&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个步骤也很简单&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;只需要在&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面的末尾加上下面一句&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html&lt;span class=GramE&gt;:javascript&lt;/span&gt;&lt;/span&gt; &lt;span class=SpellE&gt;formName&lt;/span&gt;="&lt;span class=SpellE&gt;testForm&lt;/span&gt;" &lt;span class=SpellE&gt;staticJavascript&lt;/span&gt;="true"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;其中&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;formName&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的名字要跟&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中配置的一致&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;大小写也要一致&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;span class=SpellE&gt;staticJavascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;为&lt;/span&gt;&lt;span lang=EN-US&gt;true&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的时候&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;将使用&lt;/span&gt;&lt;span lang=EN-US&gt;JavaScript&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;代码进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这些&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Javascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;代码由&lt;/span&gt;&lt;span lang=EN-US&gt;Struts &lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;框架自动产生&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;我们只需要配置&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件&lt;/span&gt;&lt;span lang=EN-US&gt;),&lt;span class=SpellE&gt;staticJavascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;为&lt;/span&gt;&lt;span lang=EN-US&gt;false&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的时候&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;将使用服务端代码进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这些服务端的校验代码也不需要我们编写&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="TEXT-INDENT: 0cm; mso-char-indent-count: 0"&gt;&lt;a name=_Toc67710119&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;编写扩展&lt;/span&gt;&lt;span lang=EN-US&gt;Struts
V&lt;/span&gt;&lt;/a&gt;&lt;span class=SpellE&gt;&lt;span style="mso-bookmark: _Toc67710119"&gt;&lt;span lang=EN-US&gt;alidator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710119"&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验密码输入&lt;/span&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;使用&lt;/span&gt;&lt;span lang=EN-US&gt;Struts&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验页面&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的两个字段是否一致&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;一般用在校验密码&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;当用户输入两次密码的时候需要校验用户的两次输入是否一致&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果不一致需要报错&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;实现这个功能的步骤如下&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 0cm; mso-char-indent-count: 0"&gt;&lt;a name=_Toc67710120&gt;&lt;span lang=EN-US&gt;1.&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710120"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;编写一个校验器&lt;/span&gt;&lt;span lang=EN-US&gt;(&lt;span class=SpellE&gt;Validator&lt;/span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710120"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;实现对&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710120"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;中两个字段的一致性校验&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.5pt solid #FF6600; mso-border-insidev: 1.5pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1.5pt solid; WIDTH: 452.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1.5pt solid" valign=top width=604&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;package cn.com.syni.net800114.validator;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;import &lt;span class=SpellE&gt;org.apache.commons.validator.ValidatorUtil&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;import &lt;span class=SpellE&gt;org.apache.commons.validator.Field&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;import &lt;span class=SpellE&gt;org.apache.commons.validator.ValidatorAction&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;import &lt;span class=SpellE&gt;org.apache.commons.validator.GenericValidator&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;import &lt;span class=SpellE&gt;org.apache.struts.action.ActionErrors&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;import &lt;span class=SpellE&gt;org.apache.struts.validator.Resources&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;import &lt;span class=SpellE&gt;javax.servlet.http.HttpServletRequest&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;public class &lt;span class=SpellE&gt;ValidationUtil&lt;/span&gt; {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public
static &lt;span class=SpellE&gt;boolean&lt;/span&gt; &lt;span class=SpellE&gt;validateTwoFields&lt;/span&gt;(
Object bean, &lt;span class=SpellE&gt;ValidatorAction&lt;/span&gt; &lt;span class=SpellE&gt;va&lt;/span&gt;,&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Field &lt;span class=SpellE&gt;field&lt;/span&gt;, &lt;span class=SpellE&gt;ActionErrors&lt;/span&gt; errors,&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;HttpServletRequest&lt;/span&gt; request)
{&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;String
value = &lt;span class=SpellE&gt;ValidatorUtil.getValueAsString&lt;/span&gt;(bean, &lt;span class=SpellE&gt;field.getProperty&lt;/span&gt;());&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;String
sProperty2 = &lt;span class=SpellE&gt;field.getVarValue&lt;/span&gt;("&lt;span class=SpellE&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: #ff6600"&gt;secondProperty&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;");&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;String
value2 = &lt;span class=SpellE&gt;ValidatorUtil.getValueAsString&lt;/span&gt;(bean, sProperty2);&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;
&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(!&lt;span class=SpellE&gt;GenericValidator.isBlankOrNull&lt;/span&gt;(value)) {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;try
{&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(!&lt;span class=SpellE&gt;value.equals&lt;/span&gt;(value2)) {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;errors.add&lt;/span&gt;(&lt;span class=SpellE&gt;field.getKey&lt;/span&gt;(),&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;Resources.getActionError&lt;/span&gt;(request, &lt;span class=SpellE&gt;va&lt;/span&gt;,
field));&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return
false;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;catch
(Exception e) {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;errors.add&lt;/span&gt;(&lt;span class=SpellE&gt;field.getKey&lt;/span&gt;(),&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;Resources.getActionError&lt;/span&gt;(request, &lt;span class=SpellE&gt;va&lt;/span&gt;,
field));&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return
false;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return
true;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 0cm; mso-char-indent-count: 0"&gt;&lt;a name=_Toc67710121&gt;&lt;span lang=EN-US&gt;2.&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710121"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;编写&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;-rules&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710121"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;文件&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710121"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;增加一个自定义校验器的配置&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.5pt solid #FF6600; mso-border-insidev: 1.5pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1.5pt solid; WIDTH: 452.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1.5pt solid" valign=top width=604&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;validator&lt;/span&gt; name="&lt;span class=SpellE&gt;twofields&lt;/span&gt;" &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;classname&lt;/span&gt;="cn.com.syni.net800114.validator.ValidationUtil"
method="&lt;span class=SpellE&gt;validateTwoFields&lt;/span&gt;" &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;methodParams&lt;/span&gt;="&lt;span class=SpellE&gt;java.lang.Object&lt;/span&gt;,&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;org.apache.commons.validator.ValidatorAction&lt;/span&gt;,&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;org.apache.commons.validator.Field&lt;/span&gt;,&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;org.apache.struts.action.ActionErrors&lt;/span&gt;,&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;javax.servlet.http.HttpServletRequest&lt;/span&gt;" &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;depends="required" &lt;span class=SpellE&gt;msg&lt;/span&gt;="&lt;span class=SpellE&gt;errors.twofields&lt;/span&gt;"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;javascript&lt;/span&gt;&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;function &lt;span class=SpellE&gt;validateTwoFields&lt;/span&gt;(form)
{&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; &lt;span class=SpellE&gt;bValid&lt;/span&gt; =
true;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; &lt;span class=SpellE&gt;focusField&lt;/span&gt; =
null;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; &lt;span class=SpellE&gt;i&lt;/span&gt; =
0;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; fields
= new Array();&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;oTwoFields&lt;/span&gt; =
new &lt;span class=SpellE&gt;twofields&lt;/span&gt;();&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;for
(x in &lt;span class=SpellE&gt;oTwoFields&lt;/span&gt;) {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; field
= form[&lt;span class=SpellE&gt;oTwoFields&lt;/span&gt;[x][0]];&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; &lt;span class=SpellE&gt;secondField&lt;/span&gt; =
form[&lt;span class=SpellE&gt;oTwoFields&lt;/span&gt;[x][2]("&lt;span class=SpellE&gt;secondProperty&lt;/span&gt;")];&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(&lt;span class=SpellE&gt;field.type&lt;/span&gt; == 'text' ||&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;field.type&lt;/span&gt; ==
'&lt;span class=SpellE&gt;textarea&lt;/span&gt;' ||&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;field.type&lt;/span&gt; ==
'select-one' ||&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;field.type&lt;/span&gt; ==
'radio' ||&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;field.type&lt;/span&gt; ==
'password') {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; value;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; &lt;span class=SpellE&gt;secondValue&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//
get field's value&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;if
(&lt;span class=SpellE&gt;field.type&lt;/span&gt; == "select-one") {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;var&lt;/span&gt; &lt;span class=SpellE&gt;si&lt;/span&gt; = &lt;span class=SpellE&gt;field.selectedIndex&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;value
= &lt;span class=SpellE&gt;field.options&lt;/span&gt;[&lt;span class=SpellE&gt;si&lt;/span&gt;].value;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;secondValue&lt;/span&gt; = &lt;span class=SpellE&gt;secondField.options&lt;/span&gt;[&lt;span class=SpellE&gt;si&lt;/span&gt;].value;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}
else {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;value
= &lt;span class=SpellE&gt;field.value&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;secondValue&lt;/span&gt; = &lt;span class=SpellE&gt;secondField.value&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(value != &lt;span class=SpellE&gt;secondValue&lt;/span&gt;) {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(&lt;span class=SpellE&gt;i&lt;/span&gt; == 0) {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=SpellE&gt;focusField&lt;/span&gt; =
field;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;fields[&lt;span class=SpellE&gt;i&lt;/span&gt;++]
= &lt;span class=SpellE&gt;oTwoFields&lt;/span&gt;[x][1];&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;bValid&lt;/span&gt; =
false;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if
(&lt;span class=SpellE&gt;fields.length&lt;/span&gt; &amp;gt; 0) {&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=SpellE&gt;focusField.focus&lt;/span&gt;();&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;alert(&lt;span class=SpellE&gt;fields.join&lt;/span&gt;('\n'));&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return &lt;span class=SpellE&gt;bValid&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}]]&amp;gt;&amp;lt;/&lt;span class=SpellE&gt;javascript&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/&lt;span class=SpellE&gt;validator&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 0cm; mso-char-indent-count: 0"&gt;&lt;a name=_Toc67710122&gt;&lt;span lang=EN-US&gt;3.&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710122"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;编写&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710122"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;页面&lt;/span&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中包括要进行自定义校验的字段&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这里是两个&lt;/span&gt;&lt;span lang=EN-US&gt;password&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;类型的&lt;/span&gt;&lt;span lang=EN-US&gt;input,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;校验器将校验用户输入的这两个字段是否一致&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果不一致&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;将通过弹出对话框告诉用户&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.5pt solid #FF6600; mso-border-insidev: 1.5pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1.5pt solid; WIDTH: 452.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1.5pt solid" valign=top width=604&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;%@ &lt;span class=SpellE&gt;taglib&lt;/span&gt; &lt;span class=SpellE&gt;uri&lt;/span&gt;="/WEB-INF/struts-&lt;span class=SpellE&gt;bean.tld&lt;/span&gt;"
prefix="bean" %&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;%@ &lt;span class=SpellE&gt;taglib&lt;/span&gt; &lt;span class=SpellE&gt;uri&lt;/span&gt;="/WEB-INF/struts-&lt;span class=SpellE&gt;html.tld&lt;/span&gt;"
prefix="html" %&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;%@ page &lt;span class=SpellE&gt;contentType&lt;/span&gt;="text/html; &lt;span class=SpellE&gt;charset&lt;/span&gt;=GBK"
%&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:html&lt;/span&gt;&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&lt;span class=SpellE&gt;Regiestation&lt;/span&gt;&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:form&lt;/span&gt; action="/&lt;span class=SpellE&gt;registationAction.do&lt;/span&gt;" &lt;span class=SpellE&gt;onsubmit&lt;/span&gt;="return &lt;span class=SpellE&gt;validateRegistation&lt;/span&gt;(this);"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;bean:message&lt;/span&gt; key="&lt;span class=SpellE&gt;userForm.password&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:password&lt;/span&gt; property="password"/&amp;gt;&amp;lt;&lt;span class=SpellE&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;bean:message&lt;/span&gt; key="userForm.password2"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:password&lt;/span&gt; property="password2"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:submit&lt;/span&gt; property="submit" value="Submit"/&amp;gt;&amp;lt;&lt;span class=SpellE&gt;br&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:reset&lt;/span&gt; value ="Reset"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/&lt;span class=SpellE&gt;html:form&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:javascript&lt;/span&gt; &lt;span class=SpellE&gt;formName&lt;/span&gt;="&lt;span class=SpellE&gt;registation&lt;/span&gt;" &lt;span class=SpellE&gt;staticJavascript&lt;/span&gt;="true" &lt;span class=SpellE&gt;dynamicJavascript&lt;/span&gt;="true"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/&lt;span class=SpellE&gt;html:html&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;其中&lt;/span&gt;&lt;span lang=EN-US&gt;,&amp;lt;&lt;span class=SpellE&gt;html:form&lt;/span&gt; action=&lt;span class=GramE&gt;&amp;#8221;&lt;/span&gt;/&lt;span class=SpellE&gt;registationAction.do&lt;/span&gt;&lt;span class=GramE&gt;&amp;#8221;&lt;/span&gt; &lt;span class=SpellE&gt;onsubmit&lt;/span&gt;=&lt;span class=GramE&gt;&amp;#8221;&lt;/span&gt;return &lt;span class=SpellE&gt;validatorRegistation&lt;/span&gt;(this);&amp;#8221;&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;说明这个窗口需要使用&lt;/span&gt;&lt;span lang=EN-US&gt;Struts &lt;span class=SpellE&gt;Validator&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;,action&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性指定这个&lt;/span&gt;&lt;span lang=EN-US&gt;JSP&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;页面对应的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Action,onsubmit&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性指定了这个页面校验所对应的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ActionForm&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt; Bean,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;它的规则是&lt;/span&gt; &lt;span lang=EN-US&gt;&amp;#8220;return
+ &lt;span class=SpellE&gt;validator&lt;/span&gt; + &lt;span class=SpellE&gt;FormBeanName&lt;/span&gt; + (this);&amp;#8221;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这里的例子表示这个页面的&lt;/span&gt;&lt;span lang=EN-US&gt;action&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;是&lt;/span&gt;&lt;span lang=EN-US&gt;/&lt;span class=SpellE&gt;regiestationAction.do&lt;/span&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;它对应的&lt;/span&gt;&lt;span lang=EN-US&gt;Action
Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;名称为&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;Registation&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US&gt;(&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;注意&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;如果在&lt;/span&gt;&lt;span lang=EN-US&gt;Struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ActionForm&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的名字为&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;registation&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的话这里也要把第一个字母变为大写&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;否则出错&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;最后倒数第二行的&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;html:javascrip&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;标记说明要使用&lt;/span&gt;&lt;span lang=EN-US&gt;java
script&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;进行客户端校验&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;span class=SpellE&gt;formName&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性指定&lt;/span&gt;&lt;span lang=EN-US&gt;Action
Form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的名称&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个名称要跟&lt;/span&gt;&lt;span lang=EN-US&gt;struts-&lt;span class=SpellE&gt;config.xml&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件中的配置一致&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;严格区分大小写&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;span class=SpellE&gt;staticJavascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;和&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;dynamicJavascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;分别指定是使用静态的还是动态的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;javascript&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;代码进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;h2 style="TEXT-INDENT: 0cm; mso-char-indent-count: 0"&gt;&lt;a name=_Toc67710123&gt;&lt;span lang=EN-US&gt;4.&lt;/span&gt;&lt;/a&gt;&lt;span style="mso-bookmark: _Toc67710123"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;编写&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;validator.xml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-bookmark: _Toc67710123"&gt;&lt;span style="FONT-FAMILY: SimHei; mso-ascii-font-family: Arial"&gt;配置文件&lt;/span&gt;&lt;span lang=EN-US&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #99ccff; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid #FF6600 1.5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.5pt solid #FF6600; mso-border-insidev: 1.5pt solid #FF6600" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: #ff6600 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ff6600 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ff6600 1.5pt solid; WIDTH: 452.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #ff6600 1.5pt solid" valign=top width=604&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;form name="&lt;span class=SpellE&gt;registation&lt;/span&gt;" &amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0"&gt;
&lt;span lang=EN-US&gt;&amp;lt;field property="password" depends="&lt;span class=SpellE&gt;required,twofields&lt;/span&gt;"&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="required"
key="&lt;span class=SpellE&gt;errors.required&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;msg&lt;/span&gt; name="&lt;span class=SpellE&gt;twofields&lt;/span&gt;"
key="&lt;span class=SpellE&gt;errors.twofields&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;arg0
key="&lt;span class=SpellE&gt;userForm.password&lt;/span&gt;"/&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;arg1
key="userForm.password2" /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;span class=SpellE&gt;secondProperty&lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;password2&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;/&lt;span class=SpellE&gt;var&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span lang=EN-US&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="TEXT-INDENT: 21pt"&gt;
&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这里要注意&lt;/span&gt;&lt;span lang=EN-US&gt;&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-name&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性的&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;secondProperty&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;要跟&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorUtil.java&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的校验方法中的代码一致&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;否则&lt;/span&gt;&lt;span class=SpellE&gt;&lt;span lang=EN-US&gt;ValidatorUtil.java&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;不能正确进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;,&amp;lt;&lt;span class=SpellE&gt;var&lt;/span&gt;-value&amp;gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;属性指定这个校验字段所参照的校验字段&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;上面的配置代码说明要对&lt;/span&gt;&lt;span lang=EN-US&gt;form&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的&lt;/span&gt;&lt;span lang=EN-US&gt;password&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;字段进行校验&lt;/span&gt;&lt;span lang=EN-US&gt;,&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;它必须和另外一个叫做&lt;/span&gt;&lt;span lang=EN-US&gt;password2&lt;/span&gt;&lt;span style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的字段一致&lt;/span&gt;&lt;span lang=EN-US&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=4d67ce90-6613-4539-befd-28f2db7e04ad" /&gt;</description>
      <category>Java 技术</category>
      <category>文摘和收藏</category>
    </item>
    <item>
      <trackback:ping>http://www.hifar.com/blog/Trackback.aspx?guid=354be4c2-0076-4653-9c12-c1216721c874</trackback:ping>
      <pingback:server>http://www.hifar.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hifar.com/blog/PermaLink,guid,354be4c2-0076-4653-9c12-c1216721c874.aspx</pingback:target>
      <dc:creator>Jimmy Gao</dc:creator>
      <title>探查内存不足/内存泄漏问题</title>
      <guid isPermaLink="false">http://www.hifar.com/blog/PermaLink,guid,354be4c2-0076-4653-9c12-c1216721c874.aspx</guid>
      <link>http://www.hifar.com/blog/2004/12/02/%e6%8e%a2%e6%9f%a5%e5%86%85%e5%ad%98%e4%b8%8d%e8%b6%b3%e5%86%85%e5%ad%98%e6%b3%84%e6%bc%8f%e9%97%ae%e9%a2%98.aspx</link>
      <pubDate>Thu, 02 Dec 2004 09:41:08 GMT</pubDate>
      <description>&lt;p&gt;
&lt;table cellspacing=0 cellpadding=0 width=615 border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=px14L150gray height=40&gt;
&lt;div align=center&gt;&lt;b&gt;探查内存不足/内存泄漏问题&lt;/b&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=px12none&gt;
&lt;img height=3 src="http://www.bea.com.cn/support_pattern/images/line.gif" width=615&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=px12none&gt;
&lt;table style="WIDTH: 615px; TEXT-ALIGN: left" cellspacing=2 cellpadding=2&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="VERTICAL-ALIGN: top"&gt;
&lt;p style="COLOR: rgb(0,0,0)"&gt;
&lt;b&gt;&lt;u&gt;问题描述&lt;/u&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;内存不足&lt;/strong&gt; (OOM) － 由于 java 堆或本地内存中的内存耗尽，应用程序显示&amp;#8220;内存不足&amp;#8221;错误。
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;内存泄漏&lt;/strong&gt; － java 堆或本地内存的持续内存增长，最终将导致内存不足状态。调试内存泄漏状态的技术与调试内存不足状态的技术相同。
&lt;/p&gt;
&lt;p&gt;
&lt;b style="COLOR: rgb(0,0,0)"&gt;&lt;u&gt;&lt;/u&gt;&lt;/b&gt;&lt;font style="COLOR: rgb(0,0,0)" color=#009900&gt;&lt;u&gt;&lt;b&gt;故障排除&lt;/b&gt;&lt;/u&gt;&lt;/font&gt;
&lt;br&gt;
请注意，并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。
&lt;/p&gt;
&lt;p style="COLOR: rgb(0,0,0)"&gt;
&lt;u&gt;&lt;b&gt;快速链接：&lt;/b&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Java" size="" process="" memory="" native="" heap=""&gt;Java
堆、本地内存和进程大小&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Difference" process="" memory="" physical="" and="" space="" address="" between=""&gt;进程地址空间和物理内存之间的差异&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Why" occur="" problem="" oom="" the="" does=""&gt;为什么会发生
OOM 问题，JVM 在这种情况下如何处理？&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Steps" problem="" the="" debug="" to=""&gt;排除故障的步骤&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#determine_OOM_type"&gt;确定是
Java OOM 还是本地 OOM&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Java_OOM"&gt;Java
OOM&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Native_OOM"&gt;本地
OOM&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Jrockit" features="" specific=""&gt;Jrockit
特定特性&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#Bibliography"&gt;参考文献&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="COLOR: rgb(0,0,0)"&gt;
&lt;b&gt;&lt;u&gt;&lt;a name=Java size="" process="" memory="" native="" heap=""&gt;Java 堆、本地内存和进程大小&lt;/a&gt;&lt;/u&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Java 堆&lt;/strong&gt; － 这是 JVM 用来分配 java 对象的内存。java 堆内存的最大值用 java 命令行中的 .Xmx 标志来指定。如果未指定最大的堆大小，那么该极限值由
JVM 根据诸如计算机中的物理内存量和该时刻的可用空闲内存量这类因素来决定。始终建议您指定最大的 java 堆值。
&lt;/p&gt;
&lt;strong&gt;本地内存&lt;/strong&gt; － 这是 JVM 用于其内部操作的内存。JVM 将使用的本地内存堆数量取决于生成的代码量、创建的线程、GC 期间用于保存
java 对象信息的内存，以及在代码生成、优化等过程中使用的临时空间。&lt;br&gt;
&lt;br&gt;
如果有一个第三方本地模块，那么它也可能使用本地内存。例如，本地 JDBC 驱动程序将分配本地内存。&lt;br&gt;
&lt;br&gt;
最大本地内存量受到任何特定操作系统上的虚拟进程大小限制的约束，也受到用 .Xmx 标志指定用于 java 堆的内存量的限制。例如，如果应用程序能分配总计为 3 GB
的内存量，并且最大 java 堆的大小为 1 GB，那么本地内存量的最大值可能在 2 GB 左右。 
&lt;p&gt;
&lt;strong&gt;进程大小&lt;/strong&gt; － 进程大小将是 java 堆、本地内存与加载的可执行文件和库所占用内存的总和。在 32 位操作系统上，进程的虚拟地址空间最大可达到
4 GB。从这 4 GB 内存中，操作系统内核为自己保留一部分内存（通常为 1 - 2 GB）。剩余内存可用于应用程序。
&lt;/p&gt;
&lt;p&gt;
Windows缺省情况下，2 GB 可用于应用程序，剩余 2 GB 保留供内核使用。但是，在 Windows 的一些变化版本中，有一个 /3GB 开关可用于改变该分配比率，使应用程序能够获得
3 GB。有关 /3GB 开关的详细信息，可以在以下网址中找到：&lt;br&gt;
&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/bootini_1fcj.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/bootini_1fcj.asp&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
RH Linux AS 2.1 － 3 GB 可用于应用程序。
&lt;/p&gt;
&lt;p&gt;
对于其它操作系统，请参考操作系统文档了解有关配置。
&lt;/p&gt;
&lt;p&gt;
&lt;font size=-1&gt;&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#TOP"&gt;返回页首&lt;/a&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="COLOR: rgb(0,0,0)"&gt;
&lt;b&gt;&lt;u&gt;&lt;a name=Difference process="" memory="" physical="" and="" space="" address="" between=""&gt;进程地址空间和物理内存之间的差异&lt;/a&gt;&lt;/u&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
每个进程都获得其自有的地址空间。在 32 位操作系统中，此地址空间范围为 0 到 4 GB。此范围与计算机的可用随机存取内存 (RAM) 或交换空间无关。计算机中的可用物理内存总量是该计算机上的可用
RAM 和交换空间之和。所有运行的进程共享这些物理内存。
&lt;/p&gt;
&lt;p&gt;
进程内的存储地址是虚拟地址。内核将此虚拟地址映射到物理地址上。物理地址指向物理内存中的某个位置。在任一给定时间，计算机中运行进程所使用的全部虚拟内存的总和不能超过该计算机上可用物理内存的总量。
&lt;/p&gt;
&lt;p&gt;
&lt;font size=-1&gt;&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#TOP"&gt;返回页首&lt;/a&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="COLOR: rgb(0,0,0)"&gt;
&lt;u&gt;&lt;b&gt;&lt;a name=Why occur="" problem="" oom="" the="" does=""&gt;为什么会发生 OOM 问题，JVM 在这种情况下如何处理？&lt;/a&gt;&lt;/b&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;java 堆中的内存不足&lt;/strong&gt;
&lt;br&gt;
如果 JVM 不能在 java 堆中获得更多内存来分配更多 java 对象，将会抛出 java 内存不足 (java OOM) 错误。如果 java 堆充满了活动对象，并且
JVM 无法再扩展 java 堆，那么它将不能分配更多 java 对象。
&lt;/p&gt;
&lt;p&gt;
在这种情况下，JVM 让应用程序决定在抛出 java.lang.OutOfMemoryError 后该执行什么操作。例如，应用程序可以处理此错误，并决定以安全方式自行关闭或决定忽略此错误。如果应用程序不处理此错误，那么抛出此错误的线程将退出（如果您进行
java Thread Dump，那么将看不到该线程）。
&lt;/p&gt;
&lt;p&gt;
在使用 Weblogic Server 的情况下，如果此错误是由某个执行线程抛出的，则会处理此错误并将其记录在日志中。如果连续抛出此错误，那么核心运行状况监视器线程将关闭
Weblogic Server。
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;本地堆中的内存不足&lt;/strong&gt;
&lt;br&gt;
如果 JVM 无法获得更多本地内存，它将抛出本地内存不足（本地 OOM）错误。当进程到达操作系统的进程大小限值，或者当计算机用完 RAM 和交换空间时，通常会发生这种情况。
&lt;/p&gt;
&lt;p&gt;
当发生这种情况时，JVM 处理本地 OOM 状态，记录说明它已用完本地内存或无法获得内存的消息，然后退出。如果 JVM 或加载的任何其它模块（如 libc 或第三方模块）不处理这个本地
OOM 状态，那么操作系统将给 JVM 发送命令 JVM 退出的 sigabort 信号。通常情况下，JVM 收到 sigabort 信号时将会生成一个核心文件。
&lt;/p&gt;
&lt;p&gt;
&lt;font size=-1&gt;&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#TOP"&gt;返回页首&lt;/a&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;u&gt;&lt;font size=+0&gt;&lt;a name=Steps problem="" the="" debug="" to=""&gt;&lt;span style="COLOR: rgb(0,0,0)"&gt;排除故障的步骤&lt;/span&gt;&lt;/a&gt;&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;strong style="FONT-WEIGHT: normal"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a name=determine_OOM_type&gt;&lt;/a&gt;确定是 &lt;font face="Arial, Helvetica, sans-serif"&gt;Java
OOM&lt;/font&gt; 还是本地 &lt;font face="Arial, Helvetica, sans-serif"&gt;OOM&lt;/font&gt;：&lt;/span&gt;&lt;/strong&gt; 
&lt;ul&gt;
&lt;li&gt;
如果 stdout/stderr 消息说明这是一个 java.lang.OutOfMemoryError，那么这就是 &lt;span style="FONT-WEIGHT: bold"&gt;&lt;font face="Arial, Helvetica, sans-serif"&gt;Java
OOM&lt;/font&gt;&lt;/span&gt; 
&lt;li&gt;
如果 stdout/stderr 消息说明无法获得内存，那么这就是&lt;span style="FONT-WEIGHT: bold"&gt;本地&lt;font face="Arial, Helvetica, sans-serif"&gt; OOM&lt;/font&gt;&lt;/span&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
请注意，上述消息仅发送到 stdout 或 stderr 中，而不发送到应用程序特定的日志文件（如 weblogic.log）
&lt;/p&gt;
&lt;p&gt;
&lt;font size=-1&gt;&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#TOP"&gt;返回页首&lt;/a&gt;&lt;/font&gt;
&lt;br&gt;
&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;
&lt;br&gt;
&lt;strong style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a name=Java_OOM&gt;&lt;/a&gt;对于
Java OOM：&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;收集和分析 verbose gc 输出&lt;/strong&gt; 
&lt;ol style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;li&gt;
&lt;strong&gt;在 java 命令行中添加&amp;#8220;&lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;-verbosegc&lt;/font&gt;&lt;/span&gt;&lt;/small&gt;&amp;#8221;标志&lt;/strong&gt;。这样将会把
GC 活动信息打印到 stdout/stderr。将 stdout/stderr 重定向到一个文件。运行应用程序，直到该问题重现。 
&lt;ul&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;strong&gt;确保 JVM 在抛出 java OOM 之前完成下列任务&lt;/strong&gt; 
&lt;p&gt;
&lt;strong style="TEXT-DECORATION: underline"&gt;完整 GC 运行：&lt;/strong&gt;
&lt;br&gt;
执行一次完整 GC 运行，并且删除了所有不可及对象以及虚可及、弱可及、软可及对象，并回收了那些空间。有关不同级别的对象可及性的详细信息，可以在以下网址中可找到：&lt;br&gt;
&lt;a href="http://java.sun.com/developer/technicalArticles/ALT/RefObj"&gt;http://java.sun.com/developer/technicalArticles/ALT/RefObj&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
您可以检查是否在发出 OOM 消息之前执行了完整 GC 运行。当完成一次完整 GC 运行时，将会打印类似如下消息（格式取决于 JVM － 请查看 JVM 帮助信息以了解有关格式）
&lt;/p&gt;
&lt;p style="FONT-FAMILY: courier new"&gt;
&lt;small&gt;&lt;font size=1&gt;[memory ] 7.160: GC 131072K-&amp;gt;130052K (131072K) in 1057.359
ms&lt;/font&gt;&lt;/small&gt;
&lt;/p&gt;
&lt;p&gt;
以上输出的格式如下（备注：在此模式下将全部使用相同的格式）：
&lt;/p&gt;
&lt;p style="FONT-FAMILY: courier new"&gt;
&lt;small&gt;&lt;font size=1&gt;[memory ] &amp;lt;start&amp;gt;: GC &amp;lt;before&amp;gt;K-&amp;gt;&amp;lt;after&amp;gt;K
(&amp;lt;heap&amp;gt;K), &amp;lt;total&amp;gt; ms&lt;br&gt;
[memory ] &amp;lt;start&amp;gt; - start time of collection (seconds since jvm start)&lt;br&gt;
[memory ] &amp;lt;before&amp;gt; - memory used by objects before collection (KB)&lt;br&gt;
[memory ] &amp;lt;after&amp;gt; - memory used by objects after collection (KB)&lt;br&gt;
[memory ] &amp;lt;heap&amp;gt; - size of heap after collection (KB)&lt;br&gt;
[memory ] &amp;lt;total&amp;gt; - total time of collection (milliseconds)&lt;/font&gt;&lt;/small&gt;
&lt;/p&gt;
&lt;p&gt;
但是，没有办法断定是否使用 verbose 消息删除了软/弱/虚可及的对象。如果您怀疑在抛出 OOM 时这些对象仍然存在，请与 JVM 供应商联系。
&lt;/p&gt;
&lt;p&gt;
如果垃圾回收算法是一种按代回收算法（对于 Jrockit 为 gencopy 或 gencon，对于其它 JDK 则是缺省算法），您也将看到类似如下的 verbose
输出：&lt;br&gt;
&lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;[memory ] 2.414: Nursery
GC 31000K-&amp;gt;20760K (75776K), 0.469 ms&lt;/font&gt;&lt;/span&gt;&lt;/small&gt;
&lt;/p&gt;
&lt;p&gt;
以上是 nursery GC（即 young GC）周期，它将把活动对象从 nursery（或 young 空间）提升到 old 空间。这个周期对我们的分析不重要。有关按代回收算法的详细信息，可以在
JVM 文档中找到。
&lt;/p&gt;
&lt;p&gt;
如果在 java OOM 之前未发生 GC 周期，那么这是一个 JVM 错误。
&lt;/p&gt;
&lt;p&gt;
&lt;strong style="TEXT-DECORATION: underline"&gt;完全压缩：&lt;/strong&gt;
&lt;br&gt;
确保 JVM 执行了适当的压缩工作，并且内存并未成碎片（否则会阻止分配大对象并触发 java OOM 错误）。
&lt;/p&gt;
&lt;p&gt;
Java 对象要求内存是连续的。如果可用空闲内存是一些碎片，那么 JVM 将无法分配大对象，因为它可能无法放入任何可用空闲内存块中。在这种情况下，JVM 将执行一次完全压缩，以便形成更多连续的空闲内存来容纳大对象。
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt; 
&lt;p&gt;
压缩工作包括在 java 堆内存中将对象从一个位置移动到另一个位置，以及更新对这些对象的引用以指向新位置。除非确有必要，否则 JVM 不会压缩所有对象。这是为了减少
GC 周期的暂停时间。
&lt;/p&gt;
&lt;p&gt;
我们可以通过分析 verbose gc 消息来检查 java OOM 是否由碎片引起。如果您看到类似如下的输出（在此无论是否有可用的空闲 java 堆都会抛出 OOM），那么这就是由碎片引起的。
&lt;/p&gt;
&lt;p style="FONT-FAMILY: courier new"&gt;
&lt;small&gt;&lt;font size=1&gt;[memory ] 8.162: GC 73043K-&amp;gt;72989K (131072K) in 12.938 ms&lt;br&gt;
[memory ] 8.172: GC 72989K-&amp;gt;72905K (131072K) in 12.000 ms&lt;br&gt;
[memory ] 8.182: GC 72905K-&amp;gt;72580K (131072K) in 13.509 ms&lt;br&gt;
java.lang.OutOfMemoryError&lt;/font&gt;&lt;/small&gt;
&lt;/p&gt;
&lt;p&gt;
在上述情况中您可以看到，所指定的最大堆内存是 128MB，并且当实际内存使用量仅为 72580K 时，JVM 抛出 OOM。堆使用量仅为 55%。因此在这种情况下，碎片影响是：即使还有
45％ 的空闲堆，内存也会抛出 OOM。这是一个 JVM 错误或缺陷。您应当与 JVM 供应商联系。
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;li&gt;
&lt;strong&gt;如果 JVM 一切都正常&lt;/strong&gt;（上一步中提到的所有操作），那么此 java OOM 可能是应用程序的问题。应用程序可能在不断泄漏一些 java
内存，而这可能导致出现上述问题。或者，应用程序使用更多的活动对象，因此它需要更多 java 堆内存。在应用程序中可以检查以下方面： 
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;应用程序中的缓存功能&lt;/strong&gt; － 如果应用程序在内存中缓存 java 对象，则应确保此缓存并没有不断增大。对缓存中的对象数应有一个限值。我们可以尝试减少此限值，来观察其是否降低
java 堆使用量。 
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Java 软引用也可用于数据缓存，当 JVM 用完 java 堆时，可以保证删除软可及对象。
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;长期活动对象&lt;/strong&gt; － 如果应用程序中有长期活动对象，则可以尝试尽可能减少这些对象的存在期。例如，调整 HTTP 会话超时值将有助于更快地回收空闲会话对象。 
&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;内存泄漏&lt;/strong&gt; － 内存泄漏的一个例子是在应用服务器中使用数据库连接池。当使用连接池时，必须在 finally 块中显式关闭 JDBC
语句和结果集对象。这是因为，当从池中调用连接对象上的 close() 时，只是简单地把连接返回池中以供重用，并没有实际关闭连接和关联的语句/结果集对象。&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;增加 java 堆&lt;/strong&gt; － 如果可能的话，我们也可尝试增加 java 堆，以观察是否能解决问题。 
&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;li&gt;
&lt;strong&gt;如果上述建议都不适用于该应用程序&lt;/strong&gt;，那么，我们需要使用一个基于 JVMPI（JVM 事件探查器接口）的事件探查器（如 Jprobe
或 OptimizeIt）来找出哪些对象正在占用 java 堆。事件探查器还提供 java 代码中正在创建这些对象的位置的详细信息。本文档并不介绍每个事件探查器的详细信息。可以参考事件探查器文档来了解如何用事件探查器设置和启动应用程序。一般而言，基于
JVMPI 的事件探查器需要较高的系统开销，并会大大降低应用程序的性能。因此，在生产环境中使用这些事件探查器并不可取。&lt;br&gt;
&lt;a href="http://www.borland.com/optimizeit"&gt;http://www.borland.com/optimizeit&lt;/a&gt;
&lt;br&gt;
&lt;a href="http://www.quest.com/jprobe"&gt;http://www.quest.com/jprobe&lt;/a&gt; 
&lt;/li&gt;
&gt;
&lt;p&gt;
&lt;font size=-1&gt;&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#TOP"&gt;返回页首&lt;/a&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;a name=Native_OOM&gt;&lt;/a&gt;对于本地
OOM 问题：&lt;/span&gt;&lt;/strong&gt; 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;收集下列信息：&lt;/strong&gt; 
&lt;ol style="LIST-STYLE-TYPE: lower-alpha"&gt;
&lt;li&gt;
&lt;strong&gt;&amp;nbsp;&lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;.verbosegc&lt;/font&gt;&lt;/span&gt;&lt;/small&gt;&lt;/strong&gt; 输出，通过它可监视
java 堆使用量。这样将有助于了解此应用程序的 java 内存要求。 
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt; 
&lt;div style="MARGIN-LEFT: 0px"&gt;应当注意，指定的最大堆内存量（在 java 命令行中使用&lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt; Xmx&lt;/font&gt;&lt;/span&gt;&lt;/small&gt; 标志）与应用程序的实际
java 堆使用量无关，其在 JVM 启动时被保留，并且此保留内存不能用于其它任何用途。 
&lt;div style="MARGIN-LEFT: 0px"&gt;
&lt;br&gt;
在使用 Jrockit 时，使用 &lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;-verbose&lt;/font&gt;&lt;/span&gt;&lt;/small&gt; 来代替 &lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;-verbosegc&lt;/font&gt;&lt;/span&gt;&lt;/small&gt;，因为这可以提供
codegen 信息以及 GC 信息。
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt; 
&lt;ol type=a&gt;
&lt;li type=a value=2&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;&lt;strong&gt;定期记录进程虚拟内存大小&lt;/strong&gt;，从启动应用程序时起直到 JVM 用完本地内存。这样将有助于了解此进程是否确实达到该操作系统的大小限值。
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt; 
&lt;div style="MARGIN-LEFT: 0px"&gt;在 Windows 环境下，使用下列步骤来监视虚拟进程大小：
&lt;/div&gt;
&lt;ol&gt;
&lt;ol type=i&gt;
&lt;li type=i value=1&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;在&amp;#8220;开始&amp;#8221; -&amp;gt; &amp;#8220;运行&amp;#8221;对话框中，输入&amp;#8220;perfmon&amp;#8221;并单击&amp;#8220;确定&amp;#8221;。
&lt;/div&gt;
&lt;li&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;在弹出的&amp;#8220;性能&amp;#8221;窗口中，单击&amp;#8220;+&amp;#8221;按钮（图表上部）。
&lt;/div&gt;
&lt;li&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;在显示的对话框中选择下列选项：
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;性能对象：进程（不是缺省的处理器）
&lt;/div&gt;
&lt;li&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;从列表中选择计数器：虚拟字节数
&lt;/div&gt;
&lt;li&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;从列表中选择实例：选择 JVM (java) 实例
&lt;/div&gt;
&lt;li&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;单击&amp;#8220;添加&amp;#8221;，然后单击&amp;#8220;关闭&amp;#8221; 
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="MARGIN-LEFT: 0px"&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&gt;&gt;&gt;
&lt;blockquote&gt; 
&lt;p style="MARGIN-LEFT: 40px"&gt;
在 Unix 或 Linux 环境下，对于一个给定 PID，可以使用以下命令来查找虚拟内存大小 - &lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;ps
-p &amp;lt;PID&amp;gt; -o vsz&lt;/font&gt;&lt;/span&gt;&lt;/small&gt;。
&lt;/p&gt;
&lt;p style="MARGIN-LEFT: 40px"&gt;
在 Linux 环境下，单个 JVM 实例内的每个 java 线程都显示为一个独立的进程。如果我们获得根 java 进程的 PID，那么这就足够了。可以使用 &lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;ps&lt;/font&gt;&lt;/span&gt;&lt;/small&gt; 命令的 &lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;.forest&lt;/font&gt;&lt;/span&gt;&lt;/small&gt; 选项来找到根
java 进程。例如，&lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;ps lU &amp;lt;user&amp;gt;
--forest&lt;/font&gt;&lt;/span&gt;&lt;/small&gt; 将提供一个由指定用户启动的所有进程的 ASCII 树图。您可以从该树图中找到根 java。
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;ol type=1&gt;
&lt;li type=1 value=2&gt;
&lt;strong&gt;计算机中的内存可用性&lt;/strong&gt;
&lt;br&gt;
如果计算机没有足够的 RAM 和交换空间，则操作系统将不能为此进程提供更多内存，这样也会导致内存不足。请确保 RAM 与磁盘中的交换空间之和足以满足该计算机中正在运行的所有进程的需要。 
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol type=1&gt;
&lt;li type=1 value=3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;strong&gt;调整 java 堆&lt;/strong&gt; 
&lt;br&gt;
如果 java 堆使用量完全在最大堆范围内，则减小 java 最大堆将为 JVM 提供更多的本地内存。这不是一个解决办法，而是一个可尝试的变通方法。由于操作系统限制进程大小，我们需要在
java 堆和本地堆之间寻求一个平衡。 
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol type=1&gt;
&lt;li type=1 value=4&gt;
&lt;strong&gt;JVM 的本地内存使用量&lt;/strong&gt;
&lt;br&gt;
在加载了所有类并调用了方法（代码生成结束）后，JVM 的本地内存用量预计将会几乎达到稳定。对于大多数应用程序而言，这通常发生在最初几小时内。此后，JVM 可能会因加载运行时类型、生成优化代码等处理而仅使用少量本地内存。 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
为了缩小问题的范围，可尝试禁用运行时优化，并检查这是否会产生任何效果。
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
在使用 Jrockit 时，可使用 &lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;-Xnoopt&lt;/font&gt;&lt;/span&gt;&lt;/small&gt; 标志来禁用运行时优化。&lt;br&gt;
&lt;li&gt;
在使用 SUN hotspot JVM 时，&lt;small&gt;&lt;span style="FONT-FAMILY: courier new"&gt;&lt;font size=1&gt;-Xint&lt;/font&gt;&lt;/span&gt;&lt;/small&gt; 标志将强迫
JVM 在解释模式中运行（不生成代码）。 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="MARGIN-LEFT: 0px"&gt;
如果在整个运行过程中，本地内存使用量继续不断增加，那么这可能是本地代码中的内存泄漏。
&lt;/p&gt;
&lt;li&gt;
&lt;strong&gt;第三方本地模块或应用程序中的 JNI 代码&lt;/strong&gt;
&lt;br&gt;
检查您是否在使用类似数据库驱动程序的任何第三方本地模块。这些本地模块也可以分配本地内存，泄漏可能从这些模块中发生。为了缩小问题的范围，应尝试在没有这些第三方模块的情况下重现问题。例如，可以使用纯
java 驱动程序来代替本地数据库驱动程序。 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
检查应用程序是否使用一些 JNI 代码。这也可能造成本地内存泄漏，如果可能的话，您可以尝试在没有 JNI 代码的情况下运行应用程序。
&lt;/p&gt;
&lt;li&gt;
&lt;strong&gt;如果在执行上述步骤后还不能找到本地内存泄漏的根源&lt;/strong&gt;，那么您需要与 JVM 供应商合作来获得一个特殊的编译版本，它可以跟踪本地内存分配调用，并可提供有关泄漏的更多信息。 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;font size=-1&gt;&lt;a href="http://www.bea.com.cn/support_pattern/Investigating_Out_of_Memory_Memory_Leak_Pattern.html#TOP"&gt;返回页首&lt;/a&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p style="COLOR: rgb(0,0,0)"&gt;
&lt;b&gt;&lt;u&gt;&lt;a name=Jrockit features="" specific=""&gt;Jrockit 特定特性&lt;/a&gt;&lt;/u&gt;&lt;/b&gt;
&lt;br&gt;
Jrockit 81SP1 和更高版本支持 JRA 记录（Java 运行时间分析器）。这对于收集 JVM 运行时的信息很有用，将提供应用程序的有关信息，例如，正在运行的
GC 数、软/弱/虚引用的数目、热方法，等等。如果 JVM 出现性能问题或挂起问题，那么用几分钟进行记录和分析数据就会很有用。有关详细信息，可以在 Jrockit
文档中找到。&lt;br&gt;
&lt;a href="http://e-docs.bea.com/wljrockit/docs142/userguide/jra.html"&gt;http://e-docs.bea.com/wljrockit/docs142/userguide/jra.html&lt;/a&gt;
&lt;/p&gt;
&lt;b style="COLOR: rgb(0,0,0)"&gt;&lt;u&gt;&lt;a name=Bibliography&gt;参考文献&lt;/a&gt;&lt;/u&gt;&lt;/b&gt; 
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://java.sun.com/"&gt;Sun Java 网站&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://forum.java.sun.com/"&gt;Sun Java 新闻组&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://edocs.bea.com/wljrockit/docs81/index.html"&gt;JRockit 文档&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://dev2dev.bea.com/products/wljrockit81/index.jsp"&gt;dev2dev (JRockit)&lt;/a&gt; 
&lt;li&gt;
&lt;a href="news://newsgroups.bea.com/jrockit.developer.interest.general"&gt;JRockit 新闻组&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&gt;
&gt;
&gt;&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.hifar.com/blog/aggbug.ashx?id=354be4c2-0076-4653-9c12-c1216721c874" /&gt;</description>
      <category>文摘和收藏</category>
      <category>Java 技术</category>
    </item>
  </channel>
</rss>