隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          公告

          關注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網站

          關注的網站

          協議

          喜歡的Blog

          國內廣告平臺

          圖書出版

          在線培訓

          開發工具

          微博客戶端

          手機鈴聲

          操作系統

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統

          數學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1973567
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          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 銀河使者 閱讀(37921) 評論(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 | 最代碼
          主站蜘蛛池模板: 武城县| 双牌县| 芦溪县| 银川市| 望谟县| 潮州市| 肥乡县| 东至县| 太保市| 上思县| 营山县| 盐池县| 工布江达县| 光泽县| 长宁县| 醴陵市| 博白县| 奉新县| 手游| 城市| 札达县| 河源市| 武清区| 巩留县| 正宁县| 修文县| 敦化市| 饶阳县| 河南省| 东乡族自治县| 遂宁市| 龙泉市| 洛隆县| 滦平县| 郑州市| 沂水县| 射洪县| 镇沅| 克山县| 嵊州市| 上饶县|