隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

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

          本文為原創,如需轉載,請注明作者和出處,謝謝!

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

          在《Struts2教程4:使用validate方法驗證數據》中曾講到使用validate方法來驗證客戶端提交的數據,但如果使用validate方法就會將驗證代碼和正常的邏輯代碼混在一起,但這樣做并不利于代碼維護,而且也很難將過些代碼用于其他程序的驗證。在Struts2中為我們提供了一個Validation框架,這個框架和Struts1.x提供的Validation框架類似,也是通過XML文件進行配置。

          一、服務端驗證

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

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

          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屬性。

          【第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步】編寫驗證規則配置文件


             
          這是一個基于XML的配置文件,和struts1.x中的validator框架的驗證規則配置文件類似。但一般放到和要驗證的.class文件在同一目錄下,而且配置文件名要使用如下兩個規則中的一個來命名:

          <ActionClassName>-validation.xml

          <ActionClassName>-<ActionAliasName>-validation.xml

          其中<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

          二、客戶端驗證

           

          Struts2中實現客戶端驗證非常簡單,只需要在<s:form>中加入一個validate屬性,值為true。如<s:form validate="true" ... > ... </form>即可。

          三、驗證嵌套屬性

              有一類特殊的屬性,即這個屬性的類型是另外一個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對象的四種方法






          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-04-21 20:06 銀河使者 閱讀(37918) 評論(32)  編輯  收藏 所屬分類: Struts2 原創

          評論

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          為什么我按這個方法去做, 不會顯示不良的信息呢? 你例子中的紅色字體部分. 謝謝.
          2008-06-02 21:30 | Jeanvixue

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          需要設置其他的什么屬性之類的來達到的嗎?
          2008-06-02 22:01 | Jeanvixue

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          @Jeanvixue

          有可能是你的用于驗證的xml文件名不對。或是嵌套字段寫的不對。如下面的所示:

          <s:textfield name="user.name" label="姓名1" />
          <s:textfield name="user.age" label="年齡1"/>

          再仔細檢查一下。
          2008-06-02 22:17 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          以下是我實際使用的部分, 但是沒有辦法看到提示的信息.
          JSP內容:
          <s:form action="login">
          <s:textfield name="username" key="username"/>
          <s:password name="password" key="password" />

          <s:submit key="login"></s:submit>
          </s:form>

          loging的Class為loginAction
          loginAction-validation.xml內容:
          <validators>
          <field name="username">
          <field-validator type="requiredstring">
          <message>usernamerequired</message>
          </field-validator>
          </field>
          </validators>
          2008-06-03 16:17 | Jeanvixue

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          有幾點你可以看一下。
          1. 類名是loginAction嗎?一般類名單詞第一個字母都是大寫,如LoginAction。看看是不是名子弄錯了。是區分大小寫的。
          2. 驗證xml文件名為:類名-validation.xml,如類名為LoginAction,xml文件名為LoginAction-validation.xml,注意大小寫。
          3. LoginAction-validation.xml和LoginAction.class必須在同一個目錄下。看看這些文件的位置
          2008-06-03 16:27 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          謝謝您的回復.
          以上3點沒有問題我都注意到了, 因為我的手誤,所以我把LoginAction的第一個字母用了小寫了. 所以我就都用小寫了.
          我用的是Netbeans6.1進行開發的. 我不知道是否還有哪里的設置會影響到這些.
          2008-06-03 17:10 | Jeanvixue

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          我沒用過netbeans6.1開發過基于struts的程序,用的是myeclipse6.x。

          但我想netbeans6.1應該差不多。至于沒出來錯誤提示的原因可能是某些資源沒找到,如資源文件、驗證文件(可能路徑不對)、或是要驗證的屬性寫的不正確。具體的只有調程序才能出來,原因很多。
          2008-06-03 20:06 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          建議你做個簡單的程序,用記事本寫個程序,最簡單的,按著步驟寫,看看到底是哪個地方出錯了。用struts做這些東西稍有不注意,就可能出錯。
          2008-06-03 20:07 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          大家要注意一下,如果在struts.xml的<package>標簽中指定namespace屬性,需要在<s:form>中也將namespace和action分開寫,如上面代碼所示。不能將其連在一起,Struts2需要分開的action和namespace。如下面的代碼是錯誤的:

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

          ... ...

          </s:form>


          你這里提到這個,但你前面的章節都是這樣寫的

          <s:form action="mystruts/sum.action" >
          <s:textfield name="operand1" label=" 操作數1"/>
          <s:textfield name="operand2" label=" 操作數2" />
          <s:submit value="代數和" />
          </s:form>

          讓我很郁悶!!!!
          2008-08-20 11:53 | bigheadbird

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          to bigheadbird

          是這樣的,可能是我沒寫清楚。在struts 2中,如果在<package>標簽中加namespace,一般需要在<s:form>標簽中使用namespace指定命名空間,再用action屬性指定動作名,代碼如下:
          <s:form action="abcd" namespace="xyz" >
          ... ...
          </s:form>

          上面的代碼所對應的struts.xml中定義如下:
          <package name="mypackage" namespace="xyz" extends="struts-default">
          <action name="abcd" class="..."/>
          </package>

          如果按著上面的寫法是沒有任何問題的,也是Struts 2建議的方式
          但要知道,<s:form>實際上就是對應的html的<form>標簽,而action屬性其實就是<form>的屬性,因此,也可以直接將命名空間寫在action屬性值中,而不使用<s:form>的namespace屬性。如下面代碼所示:
          <s:form action="mystruts/sum.action" >
          <s:textfield name="operand1" label=" 操作數1"/>
          <s:textfield name="operand2" label=" 操作數2" />
          <s:submit value="代數和" />
          </s:form>

          這么做同樣可以成功提交給Action類,但這么做,Struts 2會在控制臺輸出一個類似于下面的警告:
          警告: No configuration found for the specified action: 'xyz/parent.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.
          說是未找到xyz/parent.action, 這也說明Struts 2在處理時是將namespace和action屬性分開的。但這個警告并不會影響程序的運行。就象我們在編寫java或其他語言的程序時,編譯器可能會出現一些警告信息,但仍然可以編譯通過,并成功運行。
          但要注意,如果不使用namespace,只使用action來表示命名空間的話,后面必須加上“.action”后綴,如果Struts 2未找到這個action,是不會自動加上.action后綴的。

          實際上,還可以直接使用<form>來處理

          我在后面的程序中直接使用了第二種方式,其實讀者可以選擇自己想用的方式,但筆者建議使用Struts 2建議的第一種方式。
          2008-08-20 13:04 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          哈哈,回復很及時,很詳細.謝謝.
          2008-08-20 15:04 | bigheadbird

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          您好 ,請問您驗證后的錯誤信息是用什么標簽顯示出來的,我顯示不出來,謝謝
          2008-09-27 17:00 |

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          to 董

          是這樣的,如果使用Struts 2的<s:textfield>或其他的表單標簽,字段錯誤是可以自動顯示出的,并不需要編寫代碼或使用<s:fielderror/>標簽去顯示,當然,使用<s:fielderror/>標簽也可以顯示字段錯誤,但就重復了。

          如果使用普通的html標簽,就需要使用<s:fielderror/>標簽顯示字段錯誤了。如果是動作錯誤或消息,就需要使用<actionerror/>或<actionmessage/>標簽顯示了。
          2008-09-29 10:26 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          您好!我把類和valition.xml文件放置在同一個包中,配置文件也配置好了,但是出錯信息不會顯示(紅色部分),是什么原因!配置也和你的服務器端驗證的例子一樣,導入顯示出錯信息的樣式,但并沒有進行驗證!
          2008-09-30 22:30 | jackie

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          不是validation.xmL文件,是<ActionClassName>-validation.xml文件
          2008-09-30 22:49 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          Document root element "validators", must match DOCTYPE root "struts".
          我出現了這個錯誤
          怎么也找不錯來問題。
          請指教!
          2008-10-24 10:45 | lyshyhaungli

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          我解決了這個問題了
          哈哈!!
          2008-10-24 10:54 | lyshyhaungli

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          那么麻煩的驗證??而且還要把驗證的xml和bean放在同一個目錄下.我們的工程bean本來就是jar包.
          2009-02-10 12:11 | 1121

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          @1121
          放到一起是在開發階段,發布了,就已經放到jar包中了。
          2009-02-10 12:27 | 銀河使者

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          lz寫得很好啊
          問個問題哈:這個例子里如果不想要驗證了,是不是光把<s:form>中的validate=true去掉是不夠的吧?是不是還得把*-validation.xml中的想對應的部分去掉?
          謝謝!
          2009-08-11 14:19 | 五角

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          -..- 照著作者的方法寫了驗證..一點作用也沒有....
          完全不知道錯誤出在哪里..
          大小寫,名稱,字段,檢查了又檢查..

          但是是一點反應也沒有..
          2009-10-01 10:46 | Cancer

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          知道怎么 指定 驗證 某個 方法 么
          2010-04-10 15:21 | grass

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          在<s:form>標簽中加入validate=true屬性,就為客戶端驗證。。沒試出來效果,好像跟不寫,沒什么區別呀,驗證時,還是會刷頁面,地址欄跳到action中。到底這里說的,客戶端驗證,是什么意思呀?
          2010-07-03 10:03 | elvis

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          不錯,就是驗證沒試出來,誒
          2011-03-22 17:11 | 死掉

          # re: Struts2教程5:使用Validation框架驗證數據[未登錄]  回復  更多評論   

          如你所說:

          兩個規則中的一個來命名:

          <ActionClassName>-validation.xml

          <ActionClassName>-<ActionAliasName>-validation.xml

          其中<ActionAliasName>就是struts.xml中<ation>的name屬性值。


          N久沒試出來!!!!!


          我的struts.xml 是這樣:
          <action name="login" class="action.MyAction">
          <result name="input">/login.jsp</result>
          <result name="success">/login.jsp</result>
          <result name="login">/login.jsp</result>
          </action>


          驗證的xml 取名是這樣login-validation.xml action 的name屬性值是login吧?
          后來改成MyAction-validation.xml 就ok 了,是我理解錯了,還是你忽悠人呢?
          2012-01-04 13:09 | 小拽

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          警告: Error setting expression 'age' with value '[Ljava.lang.String;@8698fa'

          當年齡 那一欄 不寫 的時候 爆這個警告
          2012-07-26 11:35 | 110

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          傻逼
          2012-07-27 16:04 | ssss

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          一、服務端驗證,沒有反應,是不是少了什么代碼沒貼
          2013-02-16 10:28 | 彭堃

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   


          @Cancer
          validation.xml沒有和驗證類放在同一個文件夾下
          2013-02-17 11:41 | 彭堃

          # re: Struts2教程5:使用Validation框架驗證數據[未登錄]  回復  更多評論   

          @elvis
          你查看網頁源代碼就能看出來了。 加了validate=“true"的客戶端會自動生成js代碼做驗證。而不加的不會有js代碼,也就是在服務端做的驗證。我想這樣做的原因是為了讓客戶端分擔服務端的壓力吧!
          2013-05-06 15:39 | zm

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          試過驗證錯誤信息沒出來
          2014-03-09 21:57 | Fylee

          # re: Struts2教程5:使用Validation框架驗證數據  回復  更多評論   

          我在最代碼網站上轉載了你的文章,有問題請回復,地址:http://www.zuidaima.com/share/1778685765291008.htm
          2014-04-13 22:01 | 最代碼
          主站蜘蛛池模板: 古田县| 新营市| 宜昌市| 昆山市| 郴州市| 徐水县| 西青区| 乐陵市| 茶陵县| 页游| 鄂伦春自治旗| 邛崃市| 布尔津县| 综艺| 女性| 乌鲁木齐县| 襄汾县| 读书| 炉霍县| 长寿区| 南城县| 鞍山市| 临洮县| 罗田县| 通河县| 林周县| 永新县| 呼和浩特市| 华阴市| 兰考县| 巩留县| 兰溪市| 广南县| 隆尧县| 天台县| 临澧县| 思茅市| 射洪县| 班玛县| 贵南县| 沙湾县|