Struts初級教程(5)-表單驗證_JSP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:Struts初級教程(4)-對國際化的支持
      隨著全球經濟的在體化趨勢,網頁設計開發者應該開發出支持多國語言、國家化的web應用程序。就是一個web應用程序在運行時能夠根據客戶端請求所來自的國家和語言的不同顯示不同的用戶界面。這樣當需要在應用程序中添加對一種新的語言的支持時,不需要對已有的軟

           應該清楚在Struts框架中,使用ActionForm Bean來實現應用程序系統的非持久性數據存儲和維護功能,它采用了自動填充屬性和調用的機制。所以必須繼承ActionForm類,并且包涵用戶表單輸入的屬性,以及相應的get方法和set方法。另外,還可以根據需要重寫父類的reset()和validate()方法,實現屬性的重置和表單數據驗證功能。 
           ActionForm類用于在視圖層和控制層之間傳遞HTML表單數據。控制層可以從ActionForm Bean中讀取用戶輸入的表單數據,也可以把來自模型層的數據存放到ActionForm Bean中,然后把數據返回給視圖。即ActionForm Bean從HTML表單中獲取用戶輸入的數據并將傳遞給Action類,也可以把從業務層返回的數據用來填充ActionForm Bean,然后JSP頁面用它來為HTML表單提供各種輸出字段的數據。此外,ActionForm Bean還具有表單驗證功能,可以過濾不合法的數據。 
           ActionForm Bean有兩種存在范圍:request和session。如果ActionForm Bean存在于request范圍,它僅在當前的請求/響應生命周期中有效。如果ActionForm Bean存在于session范圍,同一個ActionForm Bean實例在整個HTTP會話中都有效。 

           Ø   validate()方法
           這個方法主要負責檢查數據的格式和語法,而不負責檢查數據是否符合業務邏輯。
           ActionForm基類中的validate()方法在默認情況下將返回null。如果創建了ActionForm的子類,那么應該在子類覆蓋validate()方法。
           Ø   reset()方法
          這個方法用于恢復ActionForm Bean 的屬性的默認值。例如:把字符串屬性設為null或某個初始值。
           1、 修改前面我們寫的LoginActionForm,如果你不清楚的話,請您先看前幾個實例,具體代碼如下:
           public ActionErrors validate(ActionMapping actionMapping, 
                     HttpServletRequest httpServletRequest) { 
          ActionErrors errors = new ActionErrors(); 
          if (username == null|| username.equals("")) { 
              errors.add(ActionErrors.GLOBAL_MESSAGE,  
                          new ActionError("loginform.error.username")); 
          } 
          if (userpass == null||userpass.equals("")) { 
              errors.add(ActionErrors.GLOBAL_MESSAGE,  
                          new ActionError("loginform.error.password")); 
          } 
          return errors;
      }

      這個方法返回ActionErrors對象,如果返回的ActionErrors對象為null,或者不包含任何ActionMessage對象,就表示沒有錯誤,數據驗證通過。如果ActionErrors中包含ActionMessage對象,就表示發生了驗證錯誤,此時就回把請求轉發到你struts.xml里面<action>元素input屬性指定的web資源。
      new ActionError("loginform.error.username");取得資源文件里面的鍵值,用于頁面的輸出。
           2、 打開applicationResource.properties,加入如下信息:
      loginform.error.username=please enter your username
      loginform.error.password=please enter your password
      因為我們前面做了國際化,所以打開applicationResource_zh_CN.properties文件,添加如下:
      loginform.error.username=請輸入用戶名
      loginform.error.password=請輸入密碼
           3、 修改struts-config.xml文件
      <action  
          path="/login"  
          name="loginActionForm"  
          scope="request" 
          type="actions.LoginAction" 
          validate="true"  
          input="/login.jsp"> 
              <forward name="success" path="/success.jsp" /> 
              <forward name="error" path="/wrong.jsp" /> 
       </action>
      在<action>元素中,name和scope屬性分別指定ActionForm的名字和它的范圍,valudate屬性指定是否執行表單驗證,而input屬性表示驗證失敗,所要顯示用戶的內容。
           4、 修改login.jsp,在<body>元素添加,目的是顯示錯誤信息,具體代碼片段如下:
      <div> 
          <font color="red"> 
              <html:messages id="error"> 
                  <li><bean:write name="error"/></li> 
               </html:messages> 
          </font>
      </div>
      <html:message/> :用于輸出消息。屬性介紹如下:
      n         name:指定ActionMessages對象存放在request或session范圍內的屬性key。標簽處理類將根據這一屬性key來檢索request或session范圍的ActionMessages對象。
      n         message屬性:指定消息的來源。如果為true,則從request或session范圍內檢索出屬性key為Globals.MESSAGE_KEY的ActionMessages對象,此時name屬性無效;如果為false,則根據name屬性來檢索ActionMessage對象,如果此時沒有設置name屬性,將采取默認值Globals.ERROR_KEY.message屬性的默認值為false。
      n         id屬性:用來命名從消息中檢索出來的每個ActionMessage對象,它和<bean:write>標簽的name屬性匹配。
      <bean:write/>:表示顯示javaBean或其屬性的內容。
      5、 運行
      打開IE,鍵入如下地址:http://localhost:8080/Struts1_Login/login.jsp
      不輸入任何東西,我們直接點幾擊“確定”,如下:


      二、Struts的Validator驗證框架
      Validator 目前是Jakarta Commons 項目的一部分,它也被包含在Struts主分發里面,可以直接使用Struts 中自帶的Validator 庫,也可以去網站上下載http://jakarta.apache.org/commons/。 
             Struts框架能夠通過ActionForm Bean的validate()方法對用戶輸入的表單數據進行驗證。但是這種驗證方式又有一定的局限性。必須由具體的代碼來實現驗證邏輯,如果驗證邏輯發生了改變,就需要重新編寫程序代碼。此外,如果系統中有多個ActionForm Bean,并且他們包含一些相同的驗證邏輯時,那么開發人員必須對每個ActionForm Bean進行重復開發呢? 
             Validator框架能夠克服在ActionForm Bean中進行數據驗證的局限性,它允許為Struts應用靈活的配置驗證規則,無需編程。
      Validator框架主要依賴于兩個JAR文件:
      Ø         Jakarta-oro.jar
      提供了一組處理文本的類,具有文本替換,過錄和分割等功能。
      Ø         commons-validator.jar
      提供了一個簡單、可擴展的驗證框架,包含了通用的驗證方法和驗證規則。 

      主要的Struts驗證組件

      組件

      說明

      驗證器

      處理原生和其它通用類型。基本驗證器包括requiredmask(匹配正則表達式)minLengthmaxLengthrangenativetypes dateemail,和creditCard。也可以定義定制 (或者插件) 驗證器。

      資源文件

      提供(本地化的)標注和消息。默認與Struts 共享消息資源。

      XML 配置文件

      根據需要定義針對字段的表單集和驗證。驗證器可以在一個單獨的文件中定義。

      JSP 標簽

      對給定的表單或Action 路徑產生JavaScript 驗證器

      ValidatorForm

      根據FormBean 的名稱自動驗證屬性(在運行時通過ActionMapping 參數傳到validate 方法)。必須被擴展才能提供表單之上的期望屬性的驗證。

      ValidatorActionForm

      基于action 路徑自動驗證屬性(在運行時通過ActionMapping參數傳到validate 方法)。必須被擴展才能提供表單之上的期望屬性的驗證。


      有些字段可能必須要求有數據輸入。而郵政編碼總是具有已知的長度。其它公共字段類型包括數值、日期、身份證號碼等等。
      驗證器本身具有一些基本的驗證器來處理這些公共需要,當然還有其它一些需要。如果你的驗證不能被基本驗證器或者正則表達式滿足,你可以開發你自己的驗證器并插入到包中。基本驗證器支持其自身附帶的基本插件。

      安裝和配置 
             Validator框架采用兩個基于XML的配置文件來配置驗證規則。一個是validator-rules.xml,另一個是validation.xml,這兩個文件應該部署在對應于WEB應用程序的WEB-INF文件夾下,對應的兩個jar文件也添加到WEB-INF/lib目錄下。
      1、 validation-rules.xml
      在validation-rules.xml 文件中配置了一些全局性的驗證規則,使得你在應用程序中使用校驗而不用關注實現細節。這個配置文件是Validator 框架自帶的,可以用在所有Struts應用中。它默認配置了許多很常用的規則,一般來說,不用去更改它,除非需要擴展或修改這些默認的驗證規則。
      建議:即使你需要擴展一些規則,也不要去修改validation-rules.xml,而是通過新的配置文件去定義你所擴展的校驗規則。
      validator-rules.xml文件的根元素是form-validation,它包含一到多個global元素,global元素包含一到多個validator 元素。
      每一個validator 元素定義了一個唯一的驗證規則。下面是validation-rules.xml 文件中的一個片斷, (mask)驗證規則:
      <validator name="mask" 
          classname="org.apache.struts.validator.FieldChecks" 
          method="validateMask" 
          methodParams="java.lang.Object, 
                        org.apache.commons.validator.ValidatorAction, 
                        org.apache.commons.validator.Field, 
                        org.apache.struts.action.ActionMessages, 
                        org.apache.commons.validator.Validator, 
                        javax.servlet.http.HttpServletRequest" 
          depends=""
      msg="errors.invalid"/>
      1) name:                  賦予驗證規則的一個唯一的名稱。
      2) classname:           指的是具體實現驗證規則的類。
      3) method:               指包含具體實現類的方法。
      4) methodParams:    聲明method屬性所指定的方法參數,多個參數之間用逗號分隔。
      5) depends:              指定在調用當前的嚴整規則之前必須先調用的其他驗證規則。多個則用逗號分隔。
      6) msg:                   指定來自于Resource Bundle中的消息key。當驗證失敗時,validator框架根據這個消息key到Resource Boundle中查找匹配的消息。
      2、 validation.xml 
            Validator框架所需要的第二個配置文件是validation.xml,這個配置文件是具體應用(項目)所特定的,可以根據你的應用(項目)情況進行自定義配置。它描述了具體的ActionForm使用validation-rules.xml文件中的哪個驗證規則進行驗證。
      一個自定義的驗證規則如下:
      <form-validation> 
          <formset> 
              <form name="loginActionForm"> 
                  <field property="username" depends="required"> 
                      <arg key="label.username" /> 
                  </field> 
                  <field property="userpass" depends="required"> 
                      <arg key="label.password" /> 
                  </field> 
              </form> 
          </formset>
      </form-validation>
      Validator.xml文件的根元素為<form-validation>元素,它包含兩個子元素:<global>和<formset>元素。 
      1) <global>元素可以定義<constant>子元素,它用來定義常量表達式。 
      2)  <formset>元素包含兩個子元素:<contant>和<form>。
      3) <form>元素用于為表單配置驗證規則,它的name屬性表示你驗證formBean,必須和struts-config.xml里面FormBean名字保持一致。<form>元素可以包含一個或多個<field>子元素。 
      4) <field>元素是針對表單中字段的驗證規則。Property屬性用于指定FormBean中需要驗證的字段的名稱,depends屬性用于指定字段的驗證規則,多個用逗號分隔。 
      5) <arg>元素表示出錯時的主體信息,key 是你屬性文件里面的key。 
      6) 主要是對前面<depends>元素包含的驗證規則的定義。
      3、插入Validator 
             每一個Struts應用需要知道是否使用了Validator框架,可以通過PlugIn(插件)機制將Validator框架配置到Struts應用中。
      下面的代碼演示了如何將Validator 作為一個插件加入到Struts 應用中,在Struts 應用的配置文件Struts-config.xml 中加入如下代碼片段:
      <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> 
          <set-property property="pathnames"  
                        value="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml"/>
      </plug-in>
      pathnames屬性的值用來指定Validator 框架所使用的配置文件,多個配置文件之間用逗號分隔。 當應用啟動的時候,Struts框架將調用ValidatorPlugIn的init()方法。Validator框架的配置文件將會加載到內存中供應用使用。在init()方法被調用之前,pathnames所指定的值將會傳遞給ValidatorPlugIn的實例,ValidatorPlugIn實例將會依據這個值去加載配置文件。
      案例說明:根據前面的例子我們進行進階,要求用戶輸入用戶名、密碼。并且用戶名、密碼是必須,若為空,則提示錯誤信息。
      A、服務器段驗證 
             1、修改FormBean 
                    我們以前的是繼承ActionForm,現在改成ValidatorForm,導入相應的包,并刪除validator和reset方法。 
             2、修改struts-config.xml文件,具體代碼如下:
      <action  
             path="/login"  
             name="loginActionForm"  
             scope="request" 
             type="org.zhoudq.webapp.action.LoginAction" 
             validate="true"  
             input="/login.jsp">
       
                    <forward name="success" path="/success.jsp" /> 
                    <forward name="error" path="/wrong.jsp" />
      </action> 
            將validator改為true,告訴服務器對這個表單進行驗證,input的值,是告訴服務器如果嚴整失敗的話,將跳轉的頁面。
      3、添加驗證規則 
       在WEB-INF下創建validaton.xml這個文件,導入引用的dtd,添加如下內容:
      <form-validation> 
          <formset> 
              <form name="loginActionForm"> 
                  <field property="username" depends="required"> 
                      <arg key="label.username" /> 
                  </field> 
                  <field property="userpass" depends="required"> 
                      <arg key="label.password" /> 
                  </field> 
              </form> 
          </formset>
      </form-validation>
      3、修改Resource Boundle文件:
      英文的資源文件:applicationResource_en_US.properties
      errors.required={0} is required.
      errors.minlength={0} can not be less than {1} characters.
      errors.maxlength={0} can not be greater than {1} characters.
      errors.invalid={0} is invalid.
      errors.byte={0} must be a byte.
      errors.short={0} must be a short.
      errors.integer={0} must be an integer.
      errors.long={0} must be a long.
      errors.float={0} must be a float.
      errors.double={0} must be a double.
      errors.date={0} is not a date.
      errors.range={0} is not in the range {1} through {2}
      errors.creditcard={0} is an invalid credit card number.
      errors.email={0} is an invalid e-mail address.
      button.submit=Submit
      button.reset=Reset
      button.cancel=Cancel
      label.username=UserName:
      label.password=Password:
      loginform.error.username=please enter your username
      loginform.error.password=please enter your password
      loginform.fail=invalidation name and password,login error!
      中文的資源文件:applicationResource_zh_CN.properties
      errors.required={0} 是必須的.
      errors.minlength={0} 不能少于 {1} 個字符.
      errors.maxlength={0} 不能多于 {1} 個字符.
      errors.invalid={0} 是非法的.
      errors.byte={0} 必須是 byte 類型.
      errors.short={0} 必須是 short 類型.
      errors.integer={0} 必須是 Integer 類型.
      errors.long={0} 必須是 long 類型.
      errors.float={0} 必須是 float 類型.
      errors.double={0} 必須是 double 類型.
      errors.date={0} 不是一個日期.
      errors.range={0} 不在 {1}- {2} 之間.
      errors.creditcard={0} 是一個非法的身份證號r.
      errors.email={0} 是一個非法的油箱地址.
      button.submit=確定
      button.reset=重置
      button.cancel=取消
      label.username=用戶名:
      label.password=密碼:
      loginform.error.username=請輸入用戶名
      loginform.error.password=請輸入密碼
      loginform.fail=用戶名或密碼錯誤,登錄失敗!
      5、在struts-config.xml添加validator
      <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> 
          <set-property property="pathnames"  
                        value="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml"/>
      </plug-in>
      5、運行 
              打開IE,鍵入:http://localhost:8080/Struts1_Login/login.jsp,直接點確定,如下圖:



      B、客戶端驗證 
             這也表現了Validator驗證框架的強大之處,又服務器生成javascript腳本,這樣就直接在客戶端進行驗證了,從而減少了服務器的壓力,萬事有力又有避,這中方式服務器在生成腳本的同時又犧牲能性能,呵呵,看如何實現吧,一定很振奮吧. 
         1) 修改login.jsp頁面
      <%@ page contentType="text/html; charset=GBK"%>
      <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
      <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
      <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
      <html:html> 
          <head><title>login</title></head> 
          <body bgcolor="#ffffff"> 
          <h1>login</h1> 
          <div> 
              <font color="red"> 
                  <html:messages id="error"> 
                      <li><bean:write name="error"/></li> 
                  </html:messages> 
                 </font> 
             </div> 
          <html:javascript formName="loginActionForm" /> 
          <html:form action="login.do" onsubmit="return validateLoginActionForm(this);">
       
          <bean:message key="label.username"/> 
          <html:text property="username" /> 
          <br /> 
          <bean:message key="label.password"/> 
          <html:text property="userpass" /> 
          <br> 
          <html:submit property="submit"><bean:message key="button.submit"/></html:submit> 
          &nbsp;<html:reset><bean:message key="button.reset"/></html:reset> 
          </html:form> 
          </body>
      </html:html>
      a)<html:javascript formName="loginActionForm" />表示生成js代碼,formName屬性指定驗證表單的名字,必須和struts-config.xml里面的form一樣。
      b)<html:form action="login.do" onsubmit="return validateLoginActionForm(this);"> 
       當用戶提交表單的時候,就會調用<html:javascript>標簽生成的javascript腳本的方法,從而執行客戶端的驗證,其中的LoginActionForm是你FormBean的名字對用,必須和struts-config.xml里面的form一樣,在這里面第一個字母大寫哦。
      2)運行測試:
      打開IE,鍵入:http://localhost:8080/Struts1_Login/login.jsp,直接點確定,如下圖:





      分享:Struts初級教程(3)-結合數據庫應用
      這一節我們開始用 Struts 結合數據庫設計程序,主要將上一節的程序略做修改,如下所示: 效果圖: 顯示結果如下圖: 如果您輸入的是不合法的話,則如下圖: 程序修改步驟: A、數據源配置 在struts-config.xml文件中有一data-sources元素是用來配置應用所需要

      來源:模板無憂//所屬分類:JSP教程/更新時間:2010-03-23
      相關JSP教程