Struts初級(jí)教程(5)-表單驗(yàn)證_JSP教程
推薦:Struts初級(jí)教程(4)-對(duì)國際化的支持隨著全球經(jīng)濟(jì)的在體化趨勢(shì),網(wǎng)頁設(shè)計(jì)開發(fā)者應(yīng)該開發(fā)出支持多國語言、國家化的web應(yīng)用程序。就是一個(gè)web應(yīng)用程序在運(yùn)行時(shí)能夠根據(jù)客戶端請(qǐng)求所來自的國家和語言的不同顯示不同的用戶界面。這樣當(dāng)需要在應(yīng)用程序中添加對(duì)一種新的語言的支持時(shí),不需要對(duì)已有的軟
應(yīng)該清楚在Struts框架中,使用ActionForm Bean來實(shí)現(xiàn)應(yīng)用程序系統(tǒng)的非持久性數(shù)據(jù)存儲(chǔ)和維護(hù)功能,它采用了自動(dòng)填充屬性和調(diào)用的機(jī)制。所以必須繼承ActionForm類,并且包涵用戶表單輸入的屬性,以及相應(yīng)的get方法和set方法。另外,還可以根據(jù)需要重寫父類的reset()和validate()方法,實(shí)現(xiàn)屬性的重置和表單數(shù)據(jù)驗(yàn)證功能。ActionForm類用于在視圖層和控制層之間傳遞HTML表單數(shù)據(jù)�?刂茖涌梢詮腁ctionForm Bean中讀取用戶輸入的表單數(shù)據(jù),也可以把來自模型層的數(shù)據(jù)存放到ActionForm Bean中,然后把數(shù)據(jù)返回給視圖。即ActionForm Bean從HTML表單中獲取用戶輸入的數(shù)據(jù)并將傳遞給Action類,也可以把從業(yè)務(wù)層返回的數(shù)據(jù)用來填充ActionForm Bean,然后JSP頁面用它來為HTML表單提供各種輸出字段的數(shù)據(jù)。此外,ActionForm Bean還具有表單驗(yàn)證功能,可以過濾不合法的數(shù)據(jù)。
ActionForm Bean有兩種存在范圍:request和session。如果ActionForm Bean存在于request范圍,它僅在當(dāng)前的請(qǐng)求/響應(yīng)生命周期中有效。如果ActionForm Bean存在于session范圍,同一個(gè)ActionForm Bean實(shí)例在整個(gè)HTTP會(huì)話中都有效。
Ø validate()方法
這個(gè)方法主要負(fù)責(zé)檢查數(shù)據(jù)的格式和語法,而不負(fù)責(zé)檢查數(shù)據(jù)是否符合業(yè)務(wù)邏輯。
ActionForm基類中的validate()方法在默認(rèn)情況下將返回null。如果創(chuàng)建了ActionForm的子類,那么應(yīng)該在子類覆蓋validate()方法。
Ø reset()方法
這個(gè)方法用于恢復(fù)ActionForm Bean 的屬性的默認(rèn)值。例如:把字符串屬性設(shè)為null或某個(gè)初始值。
1、 修改前面我們寫的LoginActionForm,如果你不清楚的話,請(qǐng)您先看前幾個(gè)實(shí)例,具體代碼如下:
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;
}
這個(gè)方法返回ActionErrors對(duì)象,如果返回的ActionErrors對(duì)象為null,或者不包含任何ActionMessage對(duì)象,就表示沒有錯(cuò)誤,數(shù)據(jù)驗(yàn)證通過。如果ActionErrors中包含ActionMessage對(duì)象,就表示發(fā)生了驗(yàn)證錯(cuò)誤,此時(shí)就回把請(qǐng)求轉(zhuǎn)發(fā)到你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
因?yàn)槲覀兦懊孀隽藝H化,所以打開applicationResource_zh_CN.properties文件,添加如下:
loginform.error.username=請(qǐng)輸入用戶名
loginform.error.password=請(qǐng)輸入密碼
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屬性指定是否執(zhí)行表單驗(yàn)證,而input屬性表示驗(yàn)證失敗,所要顯示用戶的內(nèi)容。
4、 修改login.jsp,在<body>元素添加,目的是顯示錯(cuò)誤信息,具體代碼片段如下:
<div>
<font color="red">
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
</font>
</div>
<html:message/> :用于輸出消息。屬性介紹如下:
n name:指定ActionMessages對(duì)象存放在request或session范圍內(nèi)的屬性key。標(biāo)簽處理類將根據(jù)這一屬性key來檢索request或session范圍的ActionMessages對(duì)象。
n message屬性:指定消息的來源。如果為true,則從request或session范圍內(nèi)檢索出屬性key為Globals.MESSAGE_KEY的ActionMessages對(duì)象,此時(shí)name屬性無效;如果為false,則根據(jù)name屬性來檢索ActionMessage對(duì)象,如果此時(shí)沒有設(shè)置name屬性,將采取默認(rèn)值Globals.ERROR_KEY.message屬性的默認(rèn)值為false。
n id屬性:用來命名從消息中檢索出來的每個(gè)ActionMessage對(duì)象,它和<bean:write>標(biāo)簽的name屬性匹配。
<bean:write/>:表示顯示javaBean或其屬性的內(nèi)容。
5、 運(yùn)行
打開IE,鍵入如下地址:http://localhost:8080/Struts1_Login/login.jsp
不輸入任何東西,我們直接點(diǎn)幾擊“確定”,如下:

二、Struts的Validator驗(yàn)證框架
Validator 目前是Jakarta Commons 項(xiàng)目的一部分,它也被包含在Struts主分發(fā)里面,可以直接使用Struts 中自帶的Validator 庫,也可以去網(wǎng)站上下載http://jakarta.apache.org/commons/。
Struts框架能夠通過ActionForm Bean的validate()方法對(duì)用戶輸入的表單數(shù)據(jù)進(jìn)行驗(yàn)證。但是這種驗(yàn)證方式又有一定的局限性。必須由具體的代碼來實(shí)現(xiàn)驗(yàn)證邏輯,如果驗(yàn)證邏輯發(fā)生了改變,就需要重新編寫程序代碼。此外,如果系統(tǒng)中有多個(gè)ActionForm Bean,并且他們包含一些相同的驗(yàn)證邏輯時(shí),那么開發(fā)人員必須對(duì)每個(gè)ActionForm Bean進(jìn)行重復(fù)開發(fā)呢?
Validator框架能夠克服在ActionForm Bean中進(jìn)行數(shù)據(jù)驗(yàn)證的局限性,它允許為Struts應(yīng)用靈活的配置驗(yàn)證規(guī)則,無需編程。
Validator框架主要依賴于兩個(gè)JAR文件:
Ø Jakarta-oro.jar
提供了一組處理文本的類,具有文本替換,過錄和分割等功能。
Ø commons-validator.jar
提供了一個(gè)簡單、可擴(kuò)展的驗(yàn)證框架,包含了通用的驗(yàn)證方法和驗(yàn)證規(guī)則。
主要的Struts驗(yàn)證組件
組件 | 說明 |
驗(yàn)證器 | 處理原生和其它通用類型�;掘�(yàn)證器包括required,mask(匹配正則表達(dá)式),minLength,maxLength,range,nativetypes, date,email,和creditCard。也可以定義定制 (或者插件) 驗(yàn)證器。 |
資源文件 | 提供(本地化的)標(biāo)注和消息。默認(rèn)與Struts 共享消息資源。 |
XML 配置文件 | 根據(jù)需要定義針對(duì)字段的表單集和驗(yàn)證。驗(yàn)證器可以在一個(gè)單獨(dú)的文件中定義。 |
JSP 標(biāo)簽 | 對(duì)給定的表單或Action 路徑產(chǎn)生JavaScript 驗(yàn)證器。 |
ValidatorForm | 根據(jù)FormBean 的名稱自動(dòng)驗(yàn)證屬性(在運(yùn)行時(shí)通過ActionMapping 參數(shù)傳到validate 方法)。必須被擴(kuò)展才能提供表單之上的期望屬性的驗(yàn)證。 |
ValidatorActionForm | 基于action 路徑自動(dòng)驗(yàn)證屬性(在運(yùn)行時(shí)通過ActionMapping參數(shù)傳到validate 方法)。必須被擴(kuò)展才能提供表單之上的期望屬性的驗(yàn)證。 |
有些字段可能必須要求有數(shù)據(jù)輸入。而郵政編碼總是具有已知的長度。其它公共字段類型包括數(shù)值、日期、身份證號(hào)碼等等。
驗(yàn)證器本身具有一些基本的驗(yàn)證器來處理這些公共需要,當(dāng)然還有其它一些需要。如果你的驗(yàn)證不能被基本驗(yàn)證器或者正則表達(dá)式滿足,你可以開發(fā)你自己的驗(yàn)證器并插入到包中�;掘�(yàn)證器支持其自身附帶的基本插件。
安裝和配置
Validator框架采用兩個(gè)基于XML的配置文件來配置驗(yàn)證規(guī)則。一個(gè)是validator-rules.xml,另一個(gè)是validation.xml,這兩個(gè)文件應(yīng)該部署在對(duì)應(yīng)于WEB應(yīng)用程序的WEB-INF文件夾下,對(duì)應(yīng)的兩個(gè)jar文件也添加到WEB-INF/lib目錄下。
1、 validation-rules.xml
在validation-rules.xml 文件中配置了一些全局性的驗(yàn)證規(guī)則,使得你在應(yīng)用程序中使用校驗(yàn)而不用關(guān)注實(shí)現(xiàn)細(xì)節(jié)。這個(gè)配置文件是Validator 框架自帶的,可以用在所有Struts應(yīng)用中。它默認(rèn)配置了許多很常用的規(guī)則,一般來說,不用去更改它,除非需要擴(kuò)展或修改這些默認(rèn)的驗(yàn)證規(guī)則。
建議:即使你需要擴(kuò)展一些規(guī)則,也不要去修改validation-rules.xml,而是通過新的配置文件去定義你所擴(kuò)展的校驗(yàn)規(guī)則。
validator-rules.xml文件的根元素是form-validation,它包含一到多個(gè)global元素,global元素包含一到多個(gè)validator 元素。
每一個(gè)validator 元素定義了一個(gè)唯一的驗(yàn)證規(guī)則。下面是validation-rules.xml 文件中的一個(gè)片斷, (mask)驗(yàn)證規(guī)則:
<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: 賦予驗(yàn)證規(guī)則的一個(gè)唯一的名稱。
2) classname: 指的是具體實(shí)現(xiàn)驗(yàn)證規(guī)則的類。
3) method: 指包含具體實(shí)現(xiàn)類的方法。
4) methodParams: 聲明method屬性所指定的方法參數(shù),多個(gè)參數(shù)之間用逗號(hào)分隔。
5) depends: 指定在調(diào)用當(dāng)前的嚴(yán)整規(guī)則之前必須先調(diào)用的其他驗(yàn)證規(guī)則。多個(gè)則用逗號(hào)分隔。
6) msg: 指定來自于Resource Bundle中的消息key。當(dāng)驗(yàn)證失敗時(shí),validator框架根據(jù)這個(gè)消息key到Resource Boundle中查找匹配的消息。
2、 validation.xml
Validator框架所需要的第二個(gè)配置文件是validation.xml,這個(gè)配置文件是具體應(yīng)用(項(xiàng)目)所特定的,可以根據(jù)你的應(yīng)用(項(xiàng)目)情況進(jìn)行自定義配置。它描述了具體的ActionForm使用validation-rules.xml文件中的哪個(gè)驗(yàn)證規(guī)則進(jìn)行驗(yàn)證。
一個(gè)自定義的驗(yàn)證規(guī)則如下:
<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>元素,它包含兩個(gè)子元素:<global>和<formset>元素。
1) <global>元素可以定義<constant>子元素,它用來定義常量表達(dá)式。
2) <formset>元素包含兩個(gè)子元素:<contant>和<form>。
3) <form>元素用于為表單配置驗(yàn)證規(guī)則,它的name屬性表示你驗(yàn)證formBean,必須和struts-config.xml里面FormBean名字保持一致。<form>元素可以包含一個(gè)或多個(gè)<field>子元素。
4) <field>元素是針對(duì)表單中字段的驗(yàn)證規(guī)則。Property屬性用于指定FormBean中需要驗(yàn)證的字段的名稱,depends屬性用于指定字段的驗(yàn)證規(guī)則,多個(gè)用逗號(hào)分隔。
5) <arg>元素表示出錯(cuò)時(shí)的主體信息,key 是你屬性文件里面的key。
6) 主要是對(duì)前面<depends>元素包含的驗(yàn)證規(guī)則的定義。
3、插入Validator
每一個(gè)Struts應(yīng)用需要知道是否使用了Validator框架,可以通過PlugIn(插件)機(jī)制將Validator框架配置到Struts應(yīng)用中。
下面的代碼演示了如何將Validator 作為一個(gè)插件加入到Struts 應(yīng)用中,在Struts 應(yīng)用的配置文件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 框架所使用的配置文件,多個(gè)配置文件之間用逗號(hào)分隔。 當(dāng)應(yīng)用啟動(dòng)的時(shí)候,Struts框架將調(diào)用ValidatorPlugIn的init()方法。Validator框架的配置文件將會(huì)加載到內(nèi)存中供應(yīng)用使用。在init()方法被調(diào)用之前,pathnames所指定的值將會(huì)傳遞給ValidatorPlugIn的實(shí)例,ValidatorPlugIn實(shí)例將會(huì)依據(jù)這個(gè)值去加載配置文件。
案例說明:根據(jù)前面的例子我們進(jìn)行進(jìn)階,要求用戶輸入用戶名、密碼。并且用戶名、密碼是必須,若為空,則提示錯(cuò)誤信息。
A、服務(wù)器段驗(yàn)證
1、修改FormBean
我們以前的是繼承ActionForm,現(xiàn)在改成ValidatorForm,導(dǎo)入相應(yīng)的包,并刪除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,告訴服務(wù)器對(duì)這個(gè)表單進(jìn)行驗(yàn)證,input的值,是告訴服務(wù)器如果嚴(yán)整失敗的話,將跳轉(zhuǎn)的頁面。
3、添加驗(yàn)證規(guī)則
在WEB-INF下創(chuàng)建validaton.xml這個(gè)文件,導(dǎo)入引用的dtd,添加如下內(nèi)容:
<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} 個(gè)字符.
errors.maxlength={0} 不能多于 {1} 個(gè)字符.
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} 不是一個(gè)日期.
errors.range={0} 不在 {1}- {2} 之間.
errors.creditcard={0} 是一個(gè)非法的身份證號(hào)r.
errors.email={0} 是一個(gè)非法的油箱地址.
button.submit=確定
button.reset=重置
button.cancel=取消
label.username=用戶名:
label.password=密碼:
loginform.error.username=請(qǐng)輸入用戶名
loginform.error.password=請(qǐng)輸入密碼
loginform.fail=用戶名或密碼錯(cuò)誤,登錄失敗!
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、運(yùn)行
打開IE,鍵入:http://localhost:8080/Struts1_Login/login.jsp,直接點(diǎn)確定,如下圖:


B、客戶端驗(yàn)證
這也表現(xiàn)了Validator驗(yàn)證框架的強(qiáng)大之處,又服務(wù)器生成javascript腳本,這樣就直接在客戶端進(jìn)行驗(yàn)證了,從而減少了服務(wù)器的壓力,萬事有力又有避,這中方式服務(wù)器在生成腳本的同時(shí)又犧牲能性能,呵呵,看如何實(shí)現(xiàn)吧,一定很振奮吧.
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>
<html:reset><bean:message key="button.reset"/></html:reset>
</html:form>
</body>
</html:html>
a)<html:javascript formName="loginActionForm" />表示生成js代碼,formName屬性指定驗(yàn)證表單的名字,必須和struts-config.xml里面的form一樣。
b)<html:form action="login.do" onsubmit="return validateLoginActionForm(this);">
當(dāng)用戶提交表單的時(shí)候,就會(huì)調(diào)用<html:javascript>標(biāo)簽生成的javascript腳本的方法,從而執(zhí)行客戶端的驗(yàn)證,其中的LoginActionForm是你FormBean的名字對(duì)用,必須和struts-config.xml里面的form一樣,在這里面第一個(gè)字母大寫哦。
2)運(yùn)行測試:
打開IE,鍵入:http://localhost:8080/Struts1_Login/login.jsp,直接點(diǎn)確定,如下圖:


分享:Struts初級(jí)教程(3)-結(jié)合數(shù)據(jù)庫應(yīng)用這一節(jié)我們開始用 Struts 結(jié)合數(shù)據(jù)庫設(shè)計(jì)程序,主要將上一節(jié)的程序略做修改,如下所示: 效果圖: 顯示結(jié)果如下圖: 如果您輸入的是不合法的話,則如下圖: 程序修改步驟: A、數(shù)據(jù)源配置 在struts-config.xml文件中有一data-sources元素是用來配置應(yīng)用所需要
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實(shí)現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項(xiàng)目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對(duì)路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對(duì)路徑下的圖片解決方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-Struts初級(jí)教程(5)-表單驗(yàn)證
。