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

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

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

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

    Struts1.x系列教程(2):簡單的數據驗證

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

    Struts 2系列教程》


    上一篇:Struts1.x系列教程(1):用MyEclipse開發第一個Struts程序

        簡單驗證從本質上說就是在服務端來驗證客戶端提交的form中的數據。這種驗證只是對form中的數據規則進行檢查,如必須輸入用戶ID,價格不能小于0或是對email格式的驗證。在這個驗證過程中,并不需要訪問數據庫。因此,簡單驗證需要在用戶提交form后,并且在服務器處理form中的數據之前進行。

        在進行完簡單驗證后,如果form中的數據不合法,程序就會forward到指定的JSP頁(一般是包含form的頁面),并顯示相應的錯誤信息。如果form中的數據完全正確,程序就會繼續執行。

    一、在validate方法中進行簡單驗證


       
    在上一篇文章中我們知道,Struts1.x通過ActionForm的子類來封裝了客戶端提交的form中的數據。而服務端程序只需要通過ActionForm的子類的對象實例就可以訪問form中的數據,而如果不使用ActionForm類,就必須通過request對象來獲得form中的數據。通過這種封裝機制可以使代碼更容易理解。然而,ActionForm類不僅可以封裝form中的數據,還可以通過ActionForm類的validate方法來驗證form中的數據。validate方法的定義如下:

    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)

        當客戶端向服務端提交form后,Servlet引擎首先通過ActionForm的子類的對象實例裝載form中的數據,然后再調用validate方法進行驗證。validate方法返回了一個ActionErrors對象。這個對象相當于一個Map,如果ActionErrors中沒有錯誤信息,Servlet引擎就認為form中的數據是正確的,這時服務端程序就會繼續執行。如果ActionErrors中有錯誤信息,程序就會跳轉到指定的錯誤頁面。下面讓我們通過一個完整的例子來演示一下如何通過validate方法來驗證form中的數據。實現這個例子需要如下五步:

    【第1步】建立JSP頁面

        在這一步將建立一個叫simpleValidation.jsp的頁面,這個JSP頁面用于采集用戶的輸入信息。在<samples工程目錄>中建立一個simpleValidation.jsp文件,并編寫如下的代碼:

      <%@ page pageEncoding="GBK"%>
      
    <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
      
    <html>
          
    <head>
              
    <title>注冊信息(測試簡單驗證)</title>
              
    <style type="text/css">
      .text 
    {
          height
    : 20px;
          width
    : 160px;
      
    }
      
    </style>
          
    </head>
          
    <body>
              
    <html:form action="simpleValidation">
                  
    <table width="100%">
                      
    <tr>
                          
    <td align="right" width="45%"> 用戶名:</td>
                          
    <td width="55%">
                              
    <html:text property="user" styleClass="text" />
                              
    <font color="red"><html:errors property="errorUser" /></font>
                          
    </td>
                      
    </tr><tr /><tr />
                      
    <tr>
                          
    <td align="right">登錄密碼:</td>
                          
    <td>
                              
    <html:password property="password" styleClass="text" />
                              
    <font color="red"><html:errors property="errorPassword" /></font>
                          
    </td>
                      
    </tr><tr /><tr />
                      
    <tr>
                          
    <td align="right">重復登錄密碼:</td>
                          
    <td>
                              
    <html:password property="password1" styleClass="text" />
                              
    <font color="red"><html:errors property="errorPassword1" /></font>
                          
    </td>
                      
    </tr><tr /><tr />
                      
    <tr>
                          
    <td align="right">電子郵件:</td>
                          
    <td>
                              
    <html:text property="email" styleClass="text" />
                              
    <font color="red"><html:errors property="errorEmail" /></font>
                          
    </td>
                      
    </tr><tr /><tr />
                      
    <tr>
                          
    <td align="right"> <br> ${requestScope.success } </td>
                          
    <td align="left"> <br> <html:submit value=" 提交 " /> </td>
                      
    </tr>
                  
    </table>
              
    </html:form>
          
    </body>
      
    </html>

     

     在啟動Tomcat后,在IE的地址欄中輸入如下的URL

    http://localhost:8080/samples/simpleValidation.jsp

    當通過上面的URL訪問simpleValidation.jsp時,并不能正確顯示用戶信息采集界面。原因是<html:form>標簽使用了一個simpleValidation,當JSP轉換成Servlet時,這個動作必須在struts-config.xml文件中正確定義,否則將拋出一個javax.servlet.jsp.JspException異常。

    【第2步】建立simpleValidation動作

    由于本例的著重點是簡單驗證,因此,simpleValidation動作并不需要處理更多的工作。一個動作對應于一個動作類,這個動作類一般是org.apache.struts.action.Action類的子類。simpleValidation動作只做如下兩項工作:

    1.  設置驗證成功后,在目標頁中顯示的信息字符串(保存在request的屬性中)。

    2.       跳轉到目標頁。

        simpleValidation動作對應的動作類是SimpleValidationAction,在<samples工程目錄>"src"action目錄中建立一個SimpleValidationAction.java文件,并輸入如下的代碼:

      package action;
      
      
    import javax.servlet.http.*;
      
    import org.apache.struts.action.*;
      
      
    public class SimpleValidationAction extends Action
      {
          
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                  HttpServletRequest request, HttpServletResponse response)
                  
    throws Exception
          {        
              request.setAttribute(
    "success""提交成功!");  // 設置在目標頁中顯示的信息字符串
              return mapping.findForward("simple");  // 跳轉到目錄頁(simple所指的JSP頁)
          }
      }

    【第3步】建立ActionForm類
        在這一步我們來建立一個用于接收有戶的提交信息的ActionForm類:SimpleValidationForm。這個類從org.apache.struts.action.ActionForm類繼承。在<samples工程目錄>"src"actionform目錄中建立一個SimpleValidationForm.java文件,代碼如下:

      package actionform;
      
      
    import javax.servlet.http.HttpServletRequest;
      
    import org.apache.struts.action.*;

      
    public class SimpleValidationForm extends ActionForm
      {
          
    // 以下四個變量分別對應于simpleValidation.jsp中的四個文本框中的值。
          private String user;    
          
    private String password;
          
    private String password1;
          
    private String email;
      
          
    public String getUser()  
          {
              
    return user;
          }
          
    public void setUser(String user)
          {
              
    this.user = user;
          }
          
    public String getPassword()
          {
              
    return password;
          }
          
    public void setPassword(String password)
          {
              
    this.password = password;
          }
          
    public String getPassword1()
          {
              
    return password1;
          }  
          
    public void setPassword1(String password1)
          {
              
    this.password1 = password1;
          }
          
    public String getEmail()
          {
              
    return email;
          }
          
    public void setEmail(String email)
          {
              
    this.email = email;
          }  
          
    // 開始驗證用戶提交的信息 
          public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
          {
              ActionErrors error 
    = new ActionErrors();
              
    if (user.equals(""))   // 必須輸入用戶名
                  error.add("errorUser"new ActionMessage("error.user.blank"));
              
    if (password.equals(""))  // 必須輸入密碼
                  error.add("errorPassword"new ActionMessage("error.password.blank"));
              
    else if (!password.equals(password1))  // 兩個登錄密碼必須一致
                  error.add("errorPassword1"new ActionMessage("error.password1.confirmation"));
              
    if (email.equals(""))  // 必須輸入email
                  error.add("errorEmail"new ActionMessage("error.email.blank"));
              
    else if (!email.matches("\\w+(\\.\\w+)*@\\w+(\\.\\w+)+"))  // 驗證email的格式是否正確
                  error.add("errorEmail"new ActionMessage("error.email.invalid"));
      
               // 返回錯誤信息,如果error中沒有錯誤信息,
               // 就會調用SimpleValidationAction類的對象實例來執行execute方法。
              return error;        
          }
      }

    在編寫SimpleValidationAction類時應注意如下八點:
        1. 
    要想在ActionForm類中進行驗證,必須在ActionForm類的子類中覆蓋validate方法。
        2. validate方法在ActionForm類的對象實例裝載完用戶提交的數據后調用,因此,在調用validate方法時,ActionForm類的屬性值已經是用戶提交的信息了。所以可以直接使用這些屬性值進行驗證。
        3. validate方法中驗證用戶提交的數據時,要使用ActionErrors類的實例對象返回錯誤信息
      
    4. ActionErrors類的構造方法的第二個參是一個ActionMessage類的對象實例,而不是錯誤描述信息。
       5.ActionMessage類的構造方法的參數并不是錯誤描述信息,而是錯誤描述信息的key,具體的信息在Java屬性文件中(將在下一步實現)。

        6. 使用ActionForm的屬性可以非常好地驗證字符串類型,但對于其他的數據類型(如整型)的某些驗證卻不太適合。如當用戶提交數據時,本該提交一個整數,但用戶卻提交了一個非整數信息。對于這種情況,在ActionForm類的對象實例中這個用戶提交的數據的值為0。雖然使用ActionForm類的屬性無法準確驗證這種情況,但我們可以使用validate方法的第二個參數requestgetParameter方法直接獲得客戶端提交的數據來進行驗證。
        7. 如果ActionErrors對象中有錯誤信息,在JSP中需要使用<html:errors>標簽顯示錯誤信息。
       8. Struts實際上是將ActionErrors對象以org.apache.struts.action.ERROR作為鍵值保存在了request的屬性中。因此,<html:errors>標簽實際上是從request的屬性中獲得的錯誤信息描述。如我們也可以通過如下的Java代碼來獲得produceID屬性的錯誤描述信息:

      <
        java
    .util.Iterator<org.apache.struts.action.ActionMessage> it =
     ((org.apache.struts.action.ActionErrors)request
                          .getAttribute("org.apache.struts.action.ERROR")).get("productID");
        out.println(((org.apache.struts.util.PropertyMessageResources )request
           .getAttribute("org.apache.struts.action.MESSAGE")).getMessage("error.productID.blank",null));
      %>

    【第4步】建立Java屬性文件

    Java屬性文件相當于資源文件,以key = value形式保存了在程序中需要的字符串信息。Java屬性文件的擴展名為properties。在<samples工程目錄>"src目錄中建立一個struts目錄,在struts目錄中建立一個ErrorDescription.properties文件,并輸入如下的內容:
     
    ErrorDescription.properties

      error.user.blank = User can't be null.
      error.password.blank 
    = Password can't be null.
      error.password1.confirmation 
    = Password doesn't match confirmation.
      error.email.blank 
    = Email can't be null.
      error.email.invalid 
    = It is not a valid email address.

    【第5步】配置struts-config.xml文件

       
    在本例中需要配置struts-config.xml文件的三個標簽:<form-bean><action><message-resources>
        1. 
    配置<form-bean>標簽

    這個標簽用來定義ActionForm。在<form-beans>標簽中加入如下所示的<form-bean>標簽:

    <form-bean name="simpleValidationForm" type="actionform.SimpleValidationForm" />

    2. 配置<action>標簽
       
        這個標簽用來定義Struts中的動作類。在<action-mappings>標簽中加入如下所示的<action>標簽:

      <action name="simpleValidationForm" path="/simpleValidation" scope="request" type="action.SimpleValidationAction"
                   input
    ="simpleValidation.jsp">
          <forward name="simple" path="simpleValidation.jsp" />
      </action>

        <action>標簽中的屬性含義描述如下:

    1.   name:表示ActionForm的名稱。也就是<form-bean>標簽中的name屬性的值。

    2. path:表示Struts動作,必須以“/”開頭。

    3. scope:表示ActionForm類的對象實例(在本例中是SimpleValidationForm類的對

    象實例)保存的范圍。這個屬性值只能取requestsession。默認值是session。如果scope的值為request,表示將SimpleValidationForm類的對象實例以simpleValidationForm作為鍵值保存到了request的屬性中。如果scope的值為session,表示不將SimpleValidationForm類的對象實例保存到request的屬性中。但不管scope的值是request還是sessionStruts都會將SimpleValidationForm類的對象實例保存到session的屬性中。

    4. type:表示SimpleValidationAction類的全名。

    5. input:表示如果客戶端提交的數據未通過簡單驗證后要跳轉到的頁面,也就是在

    SimpleValidationForm類的validate方法中返回的ActionErrors對象中含有錯誤描述信息。Struts會自動跳轉到input屬性所指的JSP頁面。

        <action>標簽中的子標簽<forward>定義了可以在動作類(在本例中就是SimpleValidationAction類)中讀取的forward頁的URL

    2.       配置<message-resources>標簽

    這個標簽用來定義程序中所使用的屬性文件。在struts-config.xml文件的<struts-config>根節點中加入如下內容:

    <message-resources parameter="struts.ErrorDescription" />

        其中parameter屬性表示屬性文件的路徑,在本例中屬性文件ErrorDescription.properties位于struts目錄中,因此,parameter屬性的值為struts.ErrorDescription。擴展名properties不用寫。其中“.”也可以使用“/”或“"”代替。

       
    下面我們測試一下這個例子程序。首先啟動Tomcat,然后在IE中輸入如下的URL

    http://localhost:8080/samples/simpleValidation.jsp

        訪問上面的URL后的界面如圖1所示。



    圖1
     在不輸入任何信息的情況下,點擊“確定”按鈕后的界面如圖2所示。



    圖2

    下一篇:Struts1.x系列教程(3):屬性(資源)文件亂碼問題的解決之道      





    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 2009-01-13 23:10 銀河使者 閱讀(6672) 評論(7)  編輯  收藏 所屬分類: javaweb 原創struts1.x

    評論

    # re: Struts1.x系列教程(2):簡單的數據驗證  回復  更多評論   

    博主加油哦~~~


    ======================================================
    Struts2 入門教程(一)
    Struts2 入門教程(二)
    Struts2 入門教程(三)


    2009-01-14 11:47 | 墻頭草

    # re: Struts1.x系列教程(2):簡單的數據驗證[未登錄]  回復  更多評論   

    ====>簡單驗證從本質上說就是在服務端來驗證客戶端提交的form中的數據。

    簡單的驗證應該是前臺js腳本驗證吧?


    ====>簡單驗證需要在用戶提交form后,并且在服務器處理form中的數據之前進行。

    我覺得你這樣說好象不對?按照你的觀點,暫時把actionform的驗證看做簡單驗證,我雖然沒有看struts1.x源碼,actionform中的validate()方法絕對不應該是服務器處理form中的數據之前進行的!
    action.execute(actionform,actionforward,request,response),action中的方法加載actionform,內部實現機制會去調用actionform中的方法,所以actionform中的validate()方法應該是服務器處理前段表單提交數據之后去調用的!
    純粹個人的看法,可能我理解的不正確!沒有能夠表達我要敘述的意思!
    2009-02-27 15:00 | 葛坤進

    # re: Struts1.x系列教程(2):簡單的數據驗證  回復  更多評論   

    @葛坤進
    你說的服務端處理是什么意思,是指調用execute方法,還是指處理請求參數。struts1.x的調用過程是這樣的。

    首先struts1.x會通過actionform對象裝載客戶端的請求參數,然后會調用actionform類的validate方法,最后會調用Action類的execute方法,這個過程無需爭辯,也不需要看struts1.x源代碼,誰做都會這么做的。 至于簡單驗證和復雜驗證,只是邏輯上區分一下。就算是客戶端的javascript,同樣可以通過ajax進行與數據庫相關的驗證。當然,非要在validate里進行數據庫驗證也沒有什么。不過一般ActionForm類里可直接訪問請求參數,因此,一般用于直接驗證請求參數的值是否合法。
    2009-02-27 15:15 | 銀河使者

    # re: Struts1.x系列教程(2):簡單的數據驗證  回復  更多評論   

    在本文還未涉及到客戶端驗證,在服務端也可做簡單驗證。在客戶端驗證并不保險。
    2009-02-27 15:17 | 銀河使者

    # re: Struts1.x系列教程(2):簡單的數據驗證[未登錄]  回復  更多評論   

    @銀河使者
    恩,回過頭來,您的那句話是我理解錯了!
    我簡單的把你說的服務端理解成了actionform中調用validate()方法了驗證form數據了!
    2009-02-27 15:50 | 葛坤進

    # re: Struts1.x系列教程(2):簡單的數據驗證  回復  更多評論   

    你的第三步到哪兒去了。。。
    2009-07-27 09:32 | 沃爾沃去

    # re: Struts1.x系列教程(2):簡單的數據驗證  回復  更多評論   

    好文章,正好用到Struts1.x
    2009-12-16 15:44 | 天堂露珠
    主站蜘蛛池模板: 久久国产精品2020免费m3u8| 最近免费中文字幕视频高清在线看 | 国产乱辈通伦影片在线播放亚洲| 精品人妻系列无码人妻免费视频| 亚洲AV中文无码乱人伦下载| 桃子视频在线观看高清免费完整| 亚洲国产午夜精品理论片在线播放 | 亚洲va精品中文字幕| 一本久久综合亚洲鲁鲁五月天| 成在线人视频免费视频| 亚洲一区二区三区精品视频 | 亚洲熟女综合色一区二区三区| 成人亚洲网站www在线观看| 亚洲a一级免费视频| 亚洲AV日韩综合一区| 国产V亚洲V天堂无码久久久| 久久久久久国产精品免费免费| 一级毛片免费在线观看网站| 亚洲伊人精品综合在合线| 亚洲精品无码日韩国产不卡?V| 亚洲精品在线免费看| 一个人免费播放在线视频看片| 亚洲一区二区三区国产精品无码| 亚洲中文无韩国r级电影| 国内精品乱码卡1卡2卡3免费| 国产日韩久久免费影院| 亚洲一本一道一区二区三区| 亚洲αv久久久噜噜噜噜噜| 国产中文字幕免费| 日本人的色道免费网站| 9久热精品免费观看视频| 亚洲国产欧美国产综合一区 | 99久久99久久精品免费看蜜桃| 久久国产一片免费观看| 亚洲第一街区偷拍街拍| 亚洲国产精品专区| 亚洲国产精品va在线播放| 亚洲高清无码专区视频| 麻豆国产VA免费精品高清在线| 在线a免费观看最新网站| 免费无码av片在线观看 |