struts2中服务器端数据校验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2中服务器端数据校验相关的知识,希望对你有一定的参考价值。

数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证,今天随笔主要写的是实现服务器端的数据验证,服务器端数据验证主要特点:

      ·数据提交后在服务器端验证

      ·防止绕过客户端验证提交的非法数据

      ·可以在服务器端处理数据前保证数据的合法性

Struts2中有两种实现服务器端验证的方式。

一、       使用ActionSupport编码实现验证

  1. 在Action类的方法中直接验证

在Action 类中直接进行校验是一种最为原始的方法,这里作为了解,首先是action 类中的验证代码:

private User user;

 

      @Override

      public String execute() throws Exception {

         //验证用户名

         if(user.getName()==null || "".equals(user.getName())){

           this.addFieldError("user.name", "用户名不能为空");

           return INPUT;

         }

         addActionError("用户名或密码错误!");//添加action错误提示

         if(this.hasErrors()){

           return INPUT;

         }

            return SUCCESS;

}

然后在JSP页面中使用标签输出错误信息。

                       <s:fielderror fieldName="user.name"></s:fielderror>  //根据字段输出错误信息

     <s:actionerror/>   //输出action错误信息

 

  1. 重写validate()方法验证

Validate()是实现验证的方法,他会在业务方法之前调用,验证不通过则业务处理不执行.

private User user;

     

      @Override

      public String execute() throws Exception {

          System.out.println("完成注册业务");

          addActionError("用户名或密码错误!");

          if(this.hasErrors()) return INPUT;

          return SUCCESS;

      }

     

      @Override

      public void validate() {

          if(null==user.getName() || "".equals(user.getName())){

             this.addFieldError("user.name", "用户名不能为空!");

          }

}

  1. 使用validateXxx()方法实现验证

前面的validate()方法会对所有业务方法进行验证,而我们只需对单个业务类进行验证时就要用到validateXxx()方法,Xxx指被验证的方法名,代码如下.

public String register() throws Exception {

        System.out.println("完成注册业务");

        addActionError("用户名或密码错误!");

        if(this.hasErrors()) returnINPUT;

        returnSUCCESS;

     }

  

     publicvoid validateRegister() {

        if(null==user.getName() || "".equals(user.getName())){

           this.addFieldError("user.name", "用户名不能为空!");

        }

在register()被调用之前会先调用validateRegister()进行数据校验。

 

 

二、   使用验证框架实现验证

在实际开发中,很多验证是相同的,对于这些许重复实现的验证,完全可以统一实现,struts2的验证框架就实现了这一功能。使用验证框架时,所有的验证规则是写在配置文件中,便于开发与维护,所以这里详细介绍一下验证框架。

  1. 编写JSP数据输入页面

表单部分代码:

<form id="register" action="register.action" method="post">

  <table >

    <caption>注册</s:text></caption>

    <tbody>

       <tr>

          <td>登录名:</s:text></td>

          <td><input type="text" name="user.name" value="${user.name }" /></td>

          <td><s:fielderror fieldName="user.name"></s:fielderror></td>

       </tr>

    <tr>

          <td>密码:</s:text></td>

          <td><input type="password" name="user.pass" /></td>

       <td><s:fielderror fieldName="user.pass"></s:fielderror></td>

       </tr>

    <tr>

          <td>重复密码:</s:text></td>

          <td><input type="password" name="pass" /></td>

       <td><s:fielderror fieldName="pass"></s:fielderror></td>

       </tr>

    <tr>

          <td>年龄:</td>

          <td><input type="text" name="user.age" /></td>

       <td><s:fielderror fieldName="user.age"></s:fielderror></td>

       </tr>

    <tr>

          <td>收入:</td>

          <td><input type="text" name="user.income" /></td>

       <td><s:fielderror fieldName="user.income"></s:fielderror></td>

       </tr>

    <tr>

          <td>生日:</td>

          <td><input type="text" name="user.birthday" /></td>

       <td><s:fielderror fieldName="user.birthday"></s:fielderror></td>

       </tr>

    <tr>

          <td>Email</td>

          <td><input type="text" name="user.email" /></td>

       <td><s:fielderror fieldName="user.email"></s:fielderror></td>

       </tr>

    <tr>

          <td>个人主页 URL</td>

          <td><input type="text" name="user.url" /></td>

       <td><s:fielderror fieldName="user.url"></s:fielderror></td>

       </tr>       

    <tr>

          <td colspan="3" align="center"><input class="submit" type="submit" value="提交" /></td>

       </tr>

    </tbody>

  </table></form>

 

  1. 编写action类和配置文件

首先是配置文件,配置文件的命名必须为Xxx-yyy-validation.xml,Xxx为对应的action类名,这个文件只要与对应action 类放在同一目录下就会被自动识别,这里命名为UserAction-register-validation.xml。

 

 

Action 中代码:

 技术分享

 

配置文件中的代码:

<?xml version="1.0" encoding="UTF-8"?>

 <!DOCTYPE validators PUBLIC

        "-//Apache Struts//XWork Validator 1.0.2//EN"

        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>

  <field name="user.name" >

     <field-validator type="requiredstring">

        <param name="trim">true</param>

        <message>用户名不能为空</message>

     </field-validator>

     <field-validator type="regex">

        <param name="expression"><![CDATA[\\w{4,16}]]></param>

        <message>用户名长度必须在 4-16 位之间</message>

     </field-validator>

  </field>

  <field name="user.pass">

     <field-validator type="requiredstring">

        <message >密码不能为空</message>

     </field-validator>

     <field-validator type="stringlength">

        <param name="maxLength">16</param>

        <param name="minLength">6</param>       

        <message>密码长度必须在 ${minLength} - ${maxLength} 之间</message>

     </field-validator>

  </field>

  <field name="pass">

     <field-validator type="fieldexpression">

        <param name="expression"><![CDATA[pass==user.pass]]></param>       

        <message>密码和确认密码必须一致</message>

     </field-validator>

  </field>

  <field name="user.age">

     <field-validator type="conversion"  short-circuit="true">

        <message>年龄必须是整数</message>

     </field-validator>   

     <field-validator type="required">

        <message>年龄不能为空</message>

     </field-validator>

     <field-validator type="int">

        <param name="max">150</param>

        <param name="min">0</param>       

        <message>年龄必须在 ${min}-${max} 之间</message>

     </field-validator>

  </field>

  <field name="user.income">     

     <field-validator type="conversion" short-circuit="true">

        <message>收入必须是数字</message>

     </field-validator>   

     <field-validator type="required">

        <message>收入不能为空</message>

     </field-validator>

     <field-validator type="double">

        <param name="maxInclusive">1000000</param>

        <param name="minInclusive">2999.95</param>

        <message>收入必须在 ${minInclusive}-${maxInclusive} 之间</message>

     </field-validator>

  </field> 

  <field name="user.birthday">   

     <field-validator type="conversion" short-circuit="true">

        <message>生日必须写作:2008-08-08</message>

     </field-validator>   

     <field-validator type="required" >

        <message>生日不能为空</message>

     </field-validator>

     <field-validator type="date">

        <param name="min">2000-01-01</param>

        <param name="max">2009-12-31</param>

        <message>生日必须在 (2000-01-01, 2009-12-31) 之间</message>

     </field-validator>

  </field> 

  <field name="user.email">

     <field-validator type="requiredstring">

        <message>email 不能为空</message>

     </field-validator>

     <field-validator type="email">       

        <message>email 格式不合法</message>

     </field-validator>

  </field>

  <field name="user.url">

     <field-validator type="requiredstring">

        <message>个人主页必填</message>

     </field-validator>

     <field-validator type="url">      

        <message>url 地址错误</message>

     </field-validator>

  </field>

</validators>       

 

至此验证规则也写完了,然后在我们提交表单的时候就可以看到错误提示了。

另外需要注意的是,struts2中内置了类型转换错误提示,所以有可能出现双重提示的状况。

 技术分享

 

这时候可以通过在struts.xml中设置解决。

<constant name="struts.custom.i18n.resources" value="msg"/> //设置提示资源msg

 技术分享

然后在src目录下简历msg.properties资源文件,添入xwork.default.invalid.fieldvalue=。就可以了。

到这里表单数据的后台验证就结束了。

 

  技术分享

最后附上一张数据验证流程图。

以上是关于struts2中服务器端数据校验的主要内容,如果未能解决你的问题,请参考以下文章

(转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

Struts2之数据校验

深入分析JavaWeb 46 -- Struts2数据校验与国际化

Struts2框架---Struts2的输入校验

struts2 输入校验和拦截器

struts2 之 struts2数据校验