【原創】Struts1.x系列教程(2):簡單的資料驗證

銀河使者發表於2009-01-14

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

    簡單驗證從本質上說就是在服務端來驗證客戶端提交的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方法的定義如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpublic ActionErrors validate(ActionMapping mapping, HttpServletRequest request)

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

    當客戶端向服務端提交form後,Servlet引擎首先通過ActionForm的子類的物件例項裝載form中的資料,然後再呼叫validate方法進行驗證。validate方法返回了一個ActionErrors物件。這個物件相當於一個Map,如果ActionErrors中沒有錯誤資訊,Servlet引擎就認為form中的資料是正確的,這時服務端程式就會繼續執行。如果ActionErrors中有錯誤資訊,程式就會跳轉到指定的錯誤頁面。下面讓我們通過一個完整的例子來演示一下如何通過validate方法來驗證form中的資料。實現這個例子需要如下五步:

【第1步】建立JSP頁面

    在這一步將建立一個叫simpleValidation.jsp的頁面,這個JSP頁面用於採集使用者的輸入資訊。在工程目錄>中建立一個simpleValidation.jsp檔案,並編寫如下的程式碼:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt  @ 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>

 

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4  在啟動Tomcat後,在IE的位址列中輸入如下的URL

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

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

當通過上面的URL訪問simpleValidation.jsp時,並不能正確顯示使用者資訊採集介面。原因是

標籤使用了一個simpleValidation,當JSP轉換成Servlet時,這個動作必須在struts-config.xml檔案中正確定義,否則將丟擲一個javax.servlet.jsp.JspException異常。

【第2步】建立simpleValidation動作

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

1.  設定驗證成功後,在目標頁中顯示的資訊字串(儲存在request的屬性中)。

2.       跳轉到目標頁。

    simpleValidation動作對應的動作類是SimpleValidationAction,在工程目錄>"src"action目錄中建立一個SimpleValidationAction.java檔案,並輸入如下的程式碼:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt  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頁)
      }
  }

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 【第3步】建立ActionForm類
    在這一步我們來建立一個用於接收有戶的提交資訊的ActionForm類:SimpleValidationForm。這個類從 org.apache.struts.action.ActionForm類繼承。在 "src"actionform目錄中建立一個SimpleValidationForm.java檔案,程式碼如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt  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;        
      }
  }

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

在編寫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中需要使用標籤顯示錯誤資訊。
   8. Struts實際上是將ActionErrors物件以org.apache.struts.action.ERROR作為鍵值儲存在了request的 屬性中。因此,標籤實際上是從request的屬性中獲得的錯誤資訊描述。如我們也可以通過如下的Java程式碼來 獲得produceID屬性的錯誤描述資訊:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt  <
    java
.util.Iterator> 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));
  %>

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

【第4步】建立Java屬性檔案

Java屬性檔案相當於資原始檔,以key = value形式儲存了在程式中需要的字串資訊。Java屬性檔案的副檔名為properties。在工程目錄>"src目錄中建立一個struts目錄,在struts目錄中建立一個ErrorDescription.properties檔案,並輸入如下的內容:
 
ErrorDescription.properties

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt  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.

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

【第5步】配置struts-config.xml檔案

   
在本例中需要配置struts-config.xml檔案的三個標籤:
    1. 
配置標籤

這個標籤用來定義ActionForm。在標籤中加入如下所示的標籤:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

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

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 2. 配置標籤
   
    這個標籤用來定義Struts中的動作類。在標籤中加入如下所示的標籤:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

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

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4     標籤中的屬性含義描述如下:

1.   name:表示ActionForm的名稱。也就是標籤中的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類的全名。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-538144/,如需轉載,請註明出處,否則將追究法律責任。

相關文章