国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

Struts初級教程(5)-表單驗(yàn)證

2024-09-05 00:17:22
字體:
供稿:網(wǎng)友
     應(yīng)該清楚在Struts框架中,使用ActionForm Bean來實(shí)現(xiàn)應(yīng)用程序系統(tǒng)的非持久性數(shù)據(jù)存儲和維護(hù)功能,它采用了自動填充屬性和調(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)前的請求/響應(yīng)生命周期中有效。如果ActionForm Bean存在于session范圍,同一個ActionForm Bean實(shí)例在整個HTTP會話中都有效。 

     Ø   validate()方法
     這個方法主要負(fù)責(zé)檢查數(shù)據(jù)的格式和語法,而不負(fù)責(zé)檢查數(shù)據(jù)是否符合業(yè)務(wù)邏輯。
     ActionForm基類中的validate()方法在默認(rèn)情況下將返回null。如果創(chuàng)建了ActionForm的子類,那么應(yīng)該在子類覆蓋validate()方法。
     Ø   reset()方法
    這個方法用于恢復(fù)ActionForm Bean 的屬性的默認(rèn)值。例如:把字符串屬性設(shè)為null或某個初始值。
     1、 修改前面我們寫的LoginActionForm,如果你不清楚的話,請您先看前幾個實(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;
}

這個方法返回ActionErrors對象,如果返回的ActionErrors對象為null,或者不包含任何ActionMessage對象,就表示沒有錯誤,數(shù)據(jù)驗(yàn)證通過。如果ActionErrors中包含ActionMessage對象,就表示發(fā)生了驗(yàn)證錯誤,此時就回把請求轉(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=請輸入用戶名
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屬性指定是否執(zhí)行表單驗(yàn)證,而input屬性表示驗(yàn)證失敗,所要顯示用戶的內(nèi)容。
     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范圍內(nèi)的屬性key。標(biāo)簽處理類將根據(jù)這一屬性key來檢索request或session范圍的ActionMessages對象。
n         message屬性:指定消息的來源。如果為true,則從request或session范圍內(nèi)檢索出屬性key為Globals.MESSAGE_KEY的ActionMessages對象,此時name屬性無效;如果為false,則根據(jù)name屬性來檢索ActionMessage對象,如果此時沒有設(shè)置name屬性,將采取默認(rèn)值Globals.ERROR_KEY.message屬性的默認(rèn)值為false。
n         id屬性:用來命名從消息中檢索出來的每個ActionMessage對象,它和<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()方法對用戶輸入的表單數(shù)據(jù)進(jìn)行驗(yàn)證。但是這種驗(yàn)證方式又有一定的局限性。必須由具體的代碼來實(shí)現(xiàn)驗(yàn)證邏輯,如果驗(yàn)證邏輯發(fā)生了改變,就需要重新編寫程序代碼。此外,如果系統(tǒng)中有多個ActionForm Bean,并且他們包含一些相同的驗(yàn)證邏輯時,那么開發(fā)人員必須對每個ActionForm Bean進(jìn)行重復(fù)開發(fā)呢? 
       Validator框架能夠克服在ActionForm Bean中進(jìn)行數(shù)據(jù)驗(yàn)證的局限性,它允許為Struts應(yīng)用靈活的配置驗(yàn)證規(guī)則,無需編程。
Validator框架主要依賴于兩個JAR文件:
Ø         Jakarta-oro.jar
提供了一組處理文本的類,具有文本替換,過錄和分割等功能。
Ø         commons-validator.jar
提供了一個簡單、可擴(kuò)展的驗(yàn)證框架,包含了通用的驗(yàn)證方法和驗(yàn)證規(guī)則。 

主要的Struts驗(yàn)證組件

組件

說明

驗(yàn)證器

處理原生和其它通用類型。基本驗(yàn)證器包括required,mask(匹配正則表達(dá)式),minLengthmaxLengthrange,nativetypes, dateemail,和creditCard。也可以定義定制 (或者插件) 驗(yàn)證器。

資源文件

提供(本地化的)標(biāo)注和消息。默認(rèn)與Struts 共享消息資源。

XML 配置文件

根據(jù)需要定義針對字段的表單集和驗(yàn)證。驗(yàn)證器可以在一個單獨(dú)的文件中定義。

JSP 標(biāo)簽

對給定的表單或Action 路徑產(chǎn)生JavaScript 驗(yàn)證器

ValidatorForm

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

ValidatorActionForm

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


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

安裝和配置 
       Validator框架采用兩個基于XML的配置文件來配置驗(yàn)證規(guī)則。一個是validator-rules.xml,另一個是validation.xml,這兩個文件應(yīng)該部署在對應(yīng)于WEB應(yīng)用程序的WEB-INF文件夾下,對應(yīng)的兩個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é)。這個配置文件是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,它包含一到多個global元素,global元素包含一到多個validator 元素。
每一個validator 元素定義了一個唯一的驗(yàn)證規(guī)則。下面是validation-rules.xml 文件中的一個片斷, (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ī)則的一個唯一的名稱。
2) classname:           指的是具體實(shí)現(xiàn)驗(yàn)證規(guī)則的類。
3) method:               指包含具體實(shí)現(xiàn)類的方法。
4) methodParams:    聲明method屬性所指定的方法參數(shù),多個參數(shù)之間用逗號分隔。
5) depends:              指定在調(diào)用當(dāng)前的嚴(yán)整規(guī)則之前必須先調(diào)用的其他驗(yàn)證規(guī)則。多個則用逗號分隔。
6) msg:                   指定來自于Resource Bundle中的消息key。當(dāng)驗(yàn)證失敗時,validator框架根據(jù)這個消息key到Resource Boundle中查找匹配的消息。
2、 validation.xml 
      Validator框架所需要的第二個配置文件是validation.xml,這個配置文件是具體應(yīng)用(項(xiàng)目)所特定的,可以根據(jù)你的應(yīng)用(項(xiàng)目)情況進(jìn)行自定義配置。它描述了具體的ActionForm使用validation-rules.xml文件中的哪個驗(yàn)證規(guī)則進(jìn)行驗(yàn)證。
一個自定義的驗(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>元素,它包含兩個子元素:<global>和<formset>元素。 
1) <global>元素可以定義<constant>子元素,它用來定義常量表達(dá)式。 
2)  <formset>元素包含兩個子元素:<contant>和<form>。
3) <form>元素用于為表單配置驗(yàn)證規(guī)則,它的name屬性表示你驗(yàn)證formBean,必須和struts-config.xml里面FormBean名字保持一致。<form>元素可以包含一個或多個<field>子元素。 
4) <field>元素是針對表單中字段的驗(yàn)證規(guī)則。Property屬性用于指定FormBean中需要驗(yàn)證的字段的名稱,depends屬性用于指定字段的驗(yàn)證規(guī)則,多個用逗號分隔。 
5) <arg>元素表示出錯時的主體信息,key 是你屬性文件里面的key。 
6) 主要是對前面<depends>元素包含的驗(yàn)證規(guī)則的定義。
3、插入Validator 
       每一個Struts應(yīng)用需要知道是否使用了Validator框架,可以通過PlugIn(插件)機(jī)制將Validator框架配置到Struts應(yīng)用中。
下面的代碼演示了如何將Validator 作為一個插件加入到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 框架所使用的配置文件,多個配置文件之間用逗號分隔。 當(dāng)應(yīng)用啟動的時候,Struts框架將調(diào)用ValidatorPlugIn的init()方法。Validator框架的配置文件將會加載到內(nèi)存中供應(yīng)用使用。在init()方法被調(diào)用之前,pathnames所指定的值將會傳遞給ValidatorPlugIn的實(shí)例,ValidatorPlugIn實(shí)例將會依據(jù)這個值去加載配置文件。
案例說明:根據(jù)前面的例子我們進(jìn)行進(jìn)階,要求用戶輸入用戶名、密碼。并且用戶名、密碼是必須,若為空,則提示錯誤信息。
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ù)器對這個表單進(jìn)行驗(yàn)證,input的值,是告訴服務(wù)器如果嚴(yán)整失敗的話,將跳轉(zhuǎn)的頁面。
3、添加驗(yàn)證規(guī)則 
 在WEB-INF下創(chuàng)建validaton.xml這個文件,導(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} 個字符.
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、運(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í)現(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> 
    &nbsp;<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)用戶提交表單的時候,就會調(diào)用<html:javascript>標(biāo)簽生成的javascript腳本的方法,從而執(zhí)行客戶端的驗(yàn)證,其中的LoginActionForm是你FormBean的名字對用,必須和struts-config.xml里面的form一樣,在這里面第一個字母大寫哦。
2)運(yùn)行測試:
打開IE,鍵入:http://localhost:8080/Struts1_Login/login.jsp,直接點(diǎn)確定,如下圖:





發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 晴隆县| 三门峡市| 涪陵区| 松桃| 四子王旗| 沈丘县| 县级市| 石河子市| 西乌| 云南省| 正阳县| 姚安县| 内黄县| 涿州市| 诏安县| 开江县| 万荣县| 许昌县| 长沙市| 南靖县| 浦城县| 天长市| 南部县| 青海省| 甘谷县| 双柏县| 遂川县| 三都| 岳阳市| 东城区| 开阳县| 田林县| 辽宁省| 偃师市| 通渭县| 定远县| 沁水县| 宁陕县| 昌都县| 仪陇县| 湖北省|