1. 程式人生 > >struts2 使用驗證框架驗證域模型和ModelDriven驗證

struts2 使用驗證框架驗證域模型和ModelDriven驗證

有一類特殊的屬性,即這個屬性的型別是另外一個JavaBean,如有一個User類,程式碼如下:

package data;
public class User
{
     private String name;
     private int age;
     public String getName()
     {
         return name;
     }
     public void setName(String name)
     {
         this.name = name;
     }
     public int getAge()
     {
         return age;
     }
     public void setAge(int age)
     {
         this.age = age;
     }
}

在NewValidateAction類中加一個user屬性,程式碼如下:
package action;
import com.opensymphony.xwork2.ActionSupport;
import data.User;
public class NewValidateAction extends ActionSupport
{
     private String msg;
     private int age;
     private User user;
     public String getMsg()
     {
         return msg;
     }
     public void setMsg(String msg)
     {
         this.msg = msg;
     }
     public int getAge()
     {
         return age;
     }
     public void setAge(int age)
     {
         this.age = age;
     }
     public User getUser()
     {
         return user;
     }
    
     public void setUser(User user)
     {
         this.user = user;
     }
}

如果要驗證NewValidateAction中的user屬性,可以使用visitor驗證器。操作過程如下:
首先在NewValidateAction-validation.xml中加入一個<field>標籤,程式碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
     
     <field name="user">
     <field-validator type="visitor">
             <param name="context">abc</param>
             <param name="appendPrefix">true</param>
             <message>User:</message>
         </field-validator>
     </field>
</validators>

其中context引數將作為驗證User類屬性的檔名的一部分,如user屬性返回一個User物件,那麼用於驗證User物件屬性的檔名為User-abc-validation.xml。這個檔案要和User.class檔案在同一個目錄中。appendPrefix表示是否在欄位里加user,如果為true,Struts2就會使用user.name在form提交的資料中查詢要驗證的資料。這個屬性的預設值是true。如果出錯,Struts2會將<message>標籤中的資訊加到User-abc-validation.xml檔案中的相應錯誤資訊前面。User-abc-validation.xml檔案的內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
     <field name="name">
         <field-validator type="requiredstring">
             <message>請輸入name</message>
         </field-validator>
     </field>
     <field name="age">
         <field-validator type="int">
             <param name="min">5</param>
             <param name="max">20</param>
             <message>
                 必須在 5至20之間
             </message>
         </field-validator>
     </field>
</validators>

下面修改validate_form.jsp,程式碼如下:
<s:form validate="true" action="new_validate" namespace="/test" >
      <s:textfield name="msg" label="姓名"   />
      <s:textfield name="age" label="年齡"/>
      <s:textfield name="user.name" label="姓名1"   />
      <s:textfield name="user.age" label="年齡1"/>
     <s:submit/>
</s:form>

大家可以看到,最後兩個<s:textfield>的name屬性是user.name和user.age,正好是加了字首的。現在重新訪問 http://localhost:8080/validation/validate_form.jsp

經筆者測試,使用visitor無法以客戶端驗證的方式來驗證user屬性,但NewValidateAction中其他的屬性可以使用客戶端測試。

還有一種就是在ModelDriven動作中使用驗證框架

和域模型相似,User-validation.xml沒有變化,主要的變化在動作和JSP頁面上。在動作方面,我們必須實現ModelDriven介面。

JSP變化:省略了OGNL表示式的使用者級別,只保留頂級的引用,例如:username和password。

基於引用名稱空間的改變,現在需要對visitor驗證器的對映做一些輕微的改變。

<validators>

<field name="model">

<field-validator type="visitor">

<param name="appendPrefix">false</param>

<message>User:</message>

</field-validator>

</field>

</validators>

做了兩處變更。首先,由於ModelDriven動作的域物件通過getModel()獲取方法公開出來,所以現在我們需要改變指向model的欄位名。其次,我們需要使用appendPrefix引數告訴visitor驗證器不再需要在欄位名之前增加user字首。把這個引數設定為false允許驗證器發現頂級欄位名字。