posts - 42, comments - 7, trackbacks - 0, articles - 1

Struts的数据验证

Posted on 2007-10-17 20:57 TuringJava 阅读(301) 评论(0)  编辑  收藏 所属分类: Structs
Struts中的验证框架有三种方法:
1、ActionForm的代码验证。
2、Action的代码验证。
3、结合commons-validator.jar的验证框架。

1。ActinForm的代码验证。
         重写ActionForm中的validate方法,在该方法中定义验证的规则,如果出错可以用ActionError或者ActionMessages封装错误进行出错处理。
代码示例:
public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
 {
  ActionErrors errors = new ActionErrors();
  if (ddd == null || ddd.equals(""))
  {
   errors.add("username", new ActionError("error.username","用户名"));
            //error.username对于资源文件的key.用户名是对应资源文件的第一个参数
  }
  if (password == null || password.equals(""))
  {
   errors.add("password", new ActionError("error.password","密码"));
  }
  if (vercode == null || vercode.equals(""))
  {
   errors.add("vercode", new ActionError("error.vercode","验证码"));
  }
  return errors;
 }
2。Action的代码验证
        实际上就是在Action的Excute方法的前面加上数据验证的部分代码。
         代码示例:
    public ActionForward execute(ActionMapping mapping,ActionForm form,
        HttpServletRequest request, HttpServletResponse response)throws Exception
    {
        LoginForm loginForm = (LoginForm)form;
        String username = loginForm.getUsername();
        if (username == null || username.equals("") )
        {
            request.setAttribute("errors","nameNotNull");
            return mapping.findForward("input");
        }
        else
        {
            return mapping.findForward("success");
        }
    }
        注:该方法的缺点在于在excute方法中添加验证代码使得代码比较混乱;对于静态的验证应该尽量在客户端完成,而不应该提交到服务器端,这样加大的系统的负荷和响应速度。

3。commons-validator.jar的验证框架
        通用操作:增加校验资源;利用validatorPlugIn加载校验资源;ActionForm使用ValiadateForm的子类。
  1) 继承ValidateForm的验证
        (1) Struts 的ActionForm必须是ValidatorForm的子类。
        (2) 编写表单域时必须满足校验规则。校验规则都由规则文件控制,规则文件有以

        下两个。

    * validator-rules.xml 文件

    * validation.xml 文件

    第一个文件可在Struts 的解压缩后的文件夹的lib 下找到,将该文件复制到WEB-INF ;

 而validation.xml 文件则是属于该项目的校验文件,负责定义每个表单域必须满足的规则,以及规则的详细说明。
validator.xml示例:

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- 校验规则文件的文件头-->
<!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>
<!-- 定义需要校验的表单,此处的name必须与struts-config.xrnl中定义
                      的AcitonForm的名字一致-->
 <form name="loginForm">
 <!-- 每个field元素定义一个表单域,必须满足怎样的规则此处定义必须满足两个规则:必填,匹配正则表达式-->
  <field property="username" depends="required,mask">
  <!--定义出错字符串的第一个参数的值…-->
      <arg key="loginForm.username" position="0"/>
   <!--定义正则表达式-->
   <var>
     <var-name>mask</var-name>
     <var-value>^[a-zA-Z]+$</var-value>
   </var>
  </field>
  <!-- 定义pass域,需要满足必填规则-->
  <field property="pass" depends="required">
      <arg key="loginForm.pass" position="0"/>
  </field>
  <!--定义rpass域,需要满足必填规则 -->
  <field property="rpass" depends="required,validwhen">
      <arg key="loginForm.rpass" position="0"/>
      <arg key="loginForm.pass" position="1"/>
   <msg name="validwhen" key="loginForm.valid"/>
   <!--定义必须满足的有效条件-->
   <var>
     <var-name>test</var-name>
     <!-- 设定有效条件,此项为空,或者此项与pass域相等-->
     <var-value>((*this*==null)or(*this*==pass))</var-value>
   </var>
  </field>
  <field property="mail" depends="required,email">
      <arg key="loginForm.email" position="0"/>
  </field>
 </form>

  </formset>

</form-validation>

          

(3)指定如果不满足校验规则时,系统将返回到哪个页面,可通过struts-config.xml

文件指定即可。在struts-config.xml 文件中配置action 时, action 有个input 属性,该属

性用于指定不满足规则时返回的页面。另外,还应为 action 元素增加 validate= "true"

属性。



只有注册用户登录后才能发表评论。


网站导航: