Struts2教程5:使用Validation框架驗證數據

上一篇:Struts2教程4:使用validate方法驗證數據

在《Struts2教程4:使用validate方法驗證數據》中曾講到使用validate方法來驗證客戶端提交的數據,但若是使用validate方法就會將驗證代碼和正常的邏輯代碼混在一塊兒,但這樣作並不利於代碼維護,並且也很難將過些代碼用於其餘程序的驗證。在Struts2中爲咱們提供了一個Validation框架,這個框架和Struts1.x提供的Validation框架相似,也是經過XML文件進行配置。 css

1、服務端驗證 html

下面將給出一個例子來演示如何使用Struts2validation框架來進行服務端驗證。咱們能夠按着以下四步來編寫這個程序: java

【第1步】創建Action類(NewValidateAction.java

apache

package action;

import com.opensymphony.xwork2.ActionSupport;

public  class NewValidateAction  extends ActionSupport
{
     private String msg;   //  必須輸入
     private  int age;    //  在13和20之間
     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;
    }
}

下面咱們來驗證msgage屬性。 app

【第2步】配置Action類,struts.xml的代碼以下: 框架


<? xml version="1.0" encoding="UTF-8"  ?>
<! DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>
< struts >
     < package  name ="demo"  extends ="struts-default"  namespace ="/test" >
         < action  name ="new_validate"  class ="action.NewValidateAction" >
             < result  name ="input" >/validate_form.jsp </ result >
             < result  name ="success" >/validate_form.jsp </ result >
         </ action >
     </ package >
</ struts >

【第3步】編寫驗證規則配置文件 jsp


    這是一個基於XML的配置文件,和struts1.x中的validator框架的驗證規則配置文件相似。但通常放到和要驗證的.class文件在同一目錄下,並且配置文件名要使用以下兩個規則中的一個來命名: 測試

<ActionClassName>-validation.xml ui

<ActionClassName>-<ActionAliasName>-validation.xml this

其中<ActionAliasName>就是struts.xml<ation>name屬性值。在本例中咱們使用第一種命名規則,因此文件名是NewValidateAction-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 ="msg" >
         < field-validator  type ="requiredstring" >
             < message >請輸入信息 </ message >
         </ field-validator >
     </ field >
     < field  name ="age" >
         < field-validator  type ="int" >
             < param  name ="min" >13 </ param >
             < param  name ="max" >20 </ param >
             < message >
                必須在 13至20之間
             </ message >
         </ field-validator >
     </ field >
</ validators >

這個文件使用了兩個規則:requiredstring(必須輸入)和int(肯定整型範圍)。關於其餘更詳細的驗證規則,請讀者訪問http://struts.apache.org/2.0.11.1/docs/validation.html來查看。

【第4步】編寫數據錄入JSP頁。

Web根目錄中創建一個validate_form.jsp文件,代碼以下:

< %@ page  language ="java"  import ="java.util.*"  pageEncoding ="GBK" % >
< %@ taglib  prefix ="s"  uri ="/struts-tags"  % >
< link  rel ="stylesheet"  type ="text/css"  href ="<s:url value=" /styles/styles.css" />">
< html >
   < head >
     < title >驗證數據 </ title >
   </ head >  
   < body >
     < s:form  action ="new_validate"  namespace ="/test"   >
         < s:textfield  name ="msg"  label ="姓名"    />
         < s:textfield  name ="age"  label ="年齡" /> 
         < s:submit />
     </ s:form > 
   </ body >  
</ html >

你們要注意一下,若是在struts.xml<package>標籤中指定namespace屬性,須要在<s:form>中也將namespaceaction分開寫,如上面代碼所示。不能將其連在一塊兒,Struts2須要分開的actionnamespace。以下面的代碼是錯誤的:

<s:form action="/test/new_validate" >

   ... ...

</s:form>

在上面的程序中還使用了一個styles.css來定製錯誤信息的風格。代碼以下:

.label {font-style:italic; }

.errorLabel {font-style:italic; color:red; }

.errorMessage {font-weight:bold; color:red; }

    須要在Web根目錄中創建一個styles目錄,並將styles.css   

假設Web工程的上下文路徑是validation,能夠使用以下的URL來測試這個程序:

    http://localhost:8080/validation/validate_form.jsp

     顯示結果如圖 1 所示。



1

2、客戶端驗證

 

Struts2中實現客戶端驗證很是簡單,只須要在<s:form>中加入一個validate屬性,值爲true。如<s:form validate="true" ... > ... </form>便可。

3、驗證嵌套屬性

     有一類特殊的屬性,即這個屬性的類型是另一個 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,若是爲trueStruts2就會使用user.nameform提交的數據中查找要驗證的數據。這個屬性的默認值是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.nameuser.age,正好是加了前綴的。

如今從新訪問  http://localhost:8080/validation/validate_form.jsp ,驗證界面如圖 2 所示。


                                                    

                                           2


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


下一篇:Struts2教程6:在Action類中得到HttpServletResponse對象的四種方法

相關文章
相關標籤/搜索