程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts從零開始五、Struts中驗證數據實例

Struts從零開始五、Struts中驗證數據實例

編輯:關於JAVA

一、Struts的ActionForm的表單驗證

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會話中都有效。

在Struts框架中,使用ActionForm Bean來實現應用程序系統的非持久性數據存儲和維護功能,它采用了自動填充屬性和調用的機制。所以必須繼承ActionForm類,並且包涵用戶表單輸入的屬性,以及相應的get方法和set方法。另外,還可以根據需要重寫父類的reset()和validate()方法,實現屬性的重置和表單數據驗證功能。

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裡面元素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文件

path="/login"
name="loginActionForm"
scope="request"
type="actions.LoginAction"
validate="true"
input="/login.jsp">

在元素中,name和scope屬性分別指定ActionForm的名字和它的范圍,valudate屬性指定是否執行表單驗證,而input屬性表示驗證失敗,所要顯示用戶的內容。

4、修改login.jsp,在元素添加,目的是顯示錯誤信息,具體代碼片段如下:

:用於輸出消息。屬性介紹如下:

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對象,它和標簽的name屬性匹配。

:表示顯示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驗證組件

組件

說明

驗證器

處理原生和其它通用類型。基本驗證器包括required,mask(匹配正則表達式),minLength,maxLength,range,nativetypes, date,email,和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)驗證規則:

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文件中的哪個驗證規則進行驗證。

一個自定義的驗證規則如下:

Validator.xml文件的根元素為元素,它包含兩個子元素:和元素。

1) 元素可以定義子元素,它用來定義常量表達式。

2) 元素包含兩個子元素:和。

3) 元素用於為表單配置驗證規則,它的name屬性表示你驗證formBean,必須和struts-config.xml裡面FormBean名字保持一致。元素可以包含一個或多個子元素。

4) 元素是針對表單中字段的驗證規則。Property屬性用於指定FormBean中需要驗證的字段的名稱,depends屬性用於指定字段的驗證規則,多個用逗號分隔。

5) 元素表示出錯時的主體信息,key 是你屬性文件裡面的key。

6) 主要是對前面元素包含的驗證規則的定義。

3、插入Validator

每一個Struts應用需要知道是否使用了Validator框架,可以通過PlugIn(插件)機制將Validator框架配置到Struts應用中。

下面的代碼演示了如何將Validator 作為一個插件加入到Struts 應用中,在Struts 應用的配置文件Struts-config.xml 中加入如下代碼片段:

value="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml"/>

pathnames屬性的值用來指定Validator 框架所使用的配置文件,多個配置文件之間用逗號分隔。

當應用啟動的時候,Struts框架將調用ValidatorPlugIn的init()方法。Validator框架的配置文件將會加載到內存中供應用使用。在init()方法被調用之前,pathnames所指定的值將會傳遞給ValidatorPlugIn的實例,ValidatorPlugIn實例將會依據這個值去加載配置文件。

案例說明:根據前面的例子我們進行進階,要求用戶輸入用戶名、密碼。並且用戶名、密碼是必須,若為空,則提示錯誤信息。

A、服務器段驗證

1、修改FormBean

我們以前的是繼承ActionForm,現在改成ValidatorForm,導入相應的包,並刪除validator和reset方法。

2、修改struts-config.xml文件,具體代碼如下:

path="/login"
name="loginActionForm"
scope="request"
type="org.zhoudq.webapp.action.LoginAction"
validate="true"
input="/login.jsp">

將validator改為true,告訴服務器對這個表單進行驗證,input的值,是告訴服務器如果嚴整失敗的話,將跳轉的頁面。

3、添加驗證規則

在WEB-INF下創建validaton.xml這個文件,導入引用的dtd,添加如下內容:

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

value="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml"/>

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,直接點確定,如下圖:

簡單嗎?嘿嘿,兩步就搞定了吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved