如何使用struts做统一的客户端验证

来源:互联网 发布:telnet 端口连接失败 编辑:程序博客网 时间:2024/04/30 08:42
表单的客户端验证是常用的技术,比如说验证email是否合法,长度是否符合要求,输入的电话号码等等。而这些验证通常的做法是做成一个通用的javascript,然后在页面中引用进来,但是,这样做有一个不方便,就是假如验证的东西不止或者验证方法改变了则很难修改。下面说说struts的统一的客户端验证方案(注意:服务器端的验证必须使用form中的validate()方法)
1.首先在struts-config.xml中加入
<message-resources parameter="resources.MessageResources"></message-resources>
2.把要显示的错误消息存放在MessageResources.properties文件中,形如:
error.date={0}不是日期类型
properties文件的设置方法见我以前的blog

3.设置validation.xml代码如下,说明方法都在注释里面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
           "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
           "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation>
<formset>
   <form name="userForm"><!--form中的名字-->
    <!--对应的form中的字段统一的验证方法userId为userForm中的一个字段,其中depends的内容为验证的内容required为必须如入,mask则为正则表达式验证方法-->
    <field property="userId" depends="required,mask">

<!--这里指名用properties文件中对应的key的内容去替换{0}的内容-->
     <arg0 key="message.userId" resource="true"/>
     <var>
      <var-name>mask</var-name>

<!--做正则表达式的验证,该正则表达式的内容为要求输入的内容必须为数字或者字母,有关正则表达式的内容请查阅相关资料-->
      <var-value>^[0-9a-zA-Z_-_]*$</var-value>
     </var>
    </field>
    <field property="sn" depends="required">
     <arg0 key="message.sn" resource="true"/>
    </field>
    <field property="givenname" depends="required">
     <arg0 key="message.givenname" resource="true"/>
    </field>
    <!--<field property="password" depends="required,minlength,maxlength">
     <arg0 key="message.password" resource="true"/>
     <arg1 name="minlength" key="${var:minlength}" resource="false"/>
     <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>

<!--验证输入的密码最少为6位,最多为16位-->
     <var>
      <var-name>minlength</var-name>
      <var-value>6</var-value>
     </var>
     <var>
      <var-name>maxlength</var-name>
      <var-value>16</var-value>
        </var>
    </field>
    -->

<!--验证输入的内容是否为合法的email-->
    <field property="email" depends="required,email">
     <arg0 key="message.email" resource="true"/>
    </field>
    <field property="mobileNumber" depends="mask">
     <arg0 key="message.mobileNumber" resource="true"/>
     <var>
<!--验证移动电话号码必须为数字-->
      <var-name>mask</var-name>
      <var-value>^[0-9]*$</var-value>
     </var>
    </field>
   
   </form>
   <form name="GroupsManageGroupsForm">
    <field property="userName" depends="required">
     <arg0 key="title.groupName" resource="true"/>
    </field>
   </form>
   <form name="DepartmentManageForm">
    <field property="departmentId" depends="required">
     <arg0 key="title.departCode" resource="true"/>
    </field>
    <field property="departmentName" depends="required">
     <arg0 key="title.departName" resource="true"/>
    </field>
   </form>
   <form name="LogsForm">
    <field property="startTime" depends="date">
     <arg0 key="message.startTime" resource="true"/>
     <var>
                        <var-name>datePatternStrict</var-name>

<!--验证输入的日期必须为YYYY-MM-DD格式-->
                        <var-value>yyyy-MM-dd</var-value>
                 </var>    
    </field>
    <field property="endTime" depends="date">
     <arg0 key="message.endTime" resource="true"/>
     <var>
                        <var-name>datePatternStrict</var-name>
                        <var-value>yyyy-MM-dd</var-value>
                 </var>
    </field>
   </form>
</formset>
</form-validation>

这个代码是我实际项目中的一个完整的代码。

4.jsp中的form外面增加如下代码

<html:javascript dynamicJavascript="true" staticJavascript="true" formName="userForm"/>
这句的意思为:为userForm启用javascript验证

同时在form的onsubmit事件中添加return validateUserForm(this)方法。其中名字规则为:validate+form的名字.

总结:这样一来,form在提交的时候就会去做validate.xml指定的验证规则和方法,假如以后验证方法改变了,则只需要修改xml文件就可以了,不必要去做其它的修改,这样提高软件的可维护性,可扩展性。
原创粉丝点击