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=。就可以了。

到這裏表單數據的後臺驗證就結束了。

 

  

最後附上一張數據驗證流程圖。

發佈了10 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章