<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 銀河使者 閱讀(37892) 評論(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 | 最代碼
    主站蜘蛛池模板: 黄页免费视频播放在线播放| 黄页免费在线观看 | 毛茸茸bbw亚洲人| 两个人看的www免费视频| 亚洲午夜精品国产电影在线观看| 国产精品jizz在线观看免费| 免费观看成人久久网免费观看| 亚洲AV无码专区在线亚| 国产亚洲精品线观看动态图| 国产成人午夜精品免费视频| 国产免费高清69式视频在线观看| 亚洲国产高清视频在线观看| 亚洲视频人成在线播放| 性xxxxx免费视频播放| 国产精品黄页免费高清在线观看| 国产免费A∨在线播放| 在线免费观看亚洲| 亚洲福利精品一区二区三区| 黄色片在线免费观看| 国产在线精品一区免费香蕉| 久久水蜜桃亚洲AV无码精品| 亚洲精品视频在线| 久久久久久国产精品免费免费男同| 亚洲国产成人AV在线播放 | 91亚洲va在线天线va天堂va国产 | 人碰人碰人成人免费视频| 亚洲ts人妖网站| 亚洲成A人片在线观看无码不卡| 一级特黄aa毛片免费观看| 猫咪免费观看人成网站在线| 亚洲AV无码精品蜜桃| 水蜜桃亚洲一二三四在线| 中文字幕亚洲专区| 四虎影库久免费视频| 大陆一级毛片免费视频观看| 亚洲网站免费观看| 嫩草成人永久免费观看| 巨胸狂喷奶水视频www网站免费| 亚洲av综合日韩| 亚洲欧美日韩中文字幕一区二区三区| 亚洲国产精品综合久久网各|