<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    javaGrowing

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評(píng)論 :: 0 Trackbacks
    用Struts Validator檢查你的表單
    2004-05-12 瀏覽次數(shù):1286
     

    用Validator(驗(yàn)證器)提供的豐富的內(nèi)置驗(yàn)證方法簡化Struts的開發(fā)過程。

    Struts框架的一個(gè)主要好處是它提供了對(duì)接收到的表單數(shù)據(jù)進(jìn)行驗(yàn)證的內(nèi)置界面。如果有任何驗(yàn)證失敗,則應(yīng)用程序都會(huì)重新顯示HTML表單,這樣就可以改正無效的數(shù)據(jù)了。如果驗(yàn)證成功,則處理過程會(huì)繼續(xù)進(jìn)行。Struts框架的簡單驗(yàn)證界面會(huì)減少與處理數(shù)據(jù)驗(yàn)證有關(guān)的令人頭疼的事情,這樣你就可以把精力集中到驗(yàn)證代碼上,而不是放到捕獲數(shù)據(jù)、重新顯示不完整或無效數(shù)據(jù)的技巧上。

    但是,Struts內(nèi)置的驗(yàn)證界面也有缺點(diǎn)。例如,在整個(gè)應(yīng)用程序中驗(yàn)證代碼常常會(huì)大量重復(fù),因?yàn)樵S多域需要相同的驗(yàn)證邏輯。對(duì)一些相似字段的驗(yàn)證邏輯進(jìn)行任何修改都要求在幾個(gè)地方修改代碼,還要重新編譯受影響的代碼。為了解決這個(gè)問題并增強(qiáng)Struts驗(yàn)證界面的功能,作為Struts的第三方附加件創(chuàng)建了Validator框架。后來,Validator被集成到核心Struts代碼庫中,并從Struts中分離出來,現(xiàn)在它是一個(gè)獨(dú)立的Jakarta Commons項(xiàng)目。雖然Validator是一個(gè)獨(dú)立的框架,但它仍能與其他程序封裝在一起后提供,并與Struts無縫集成。

    Validator概述

    沒有Validator,你就不得不編寫驗(yàn)證表單數(shù)據(jù)所需的全部代碼,并把它放入Form Bean對(duì)象的validate( )方法中。對(duì)于想在其上進(jìn)行數(shù)據(jù)驗(yàn)證的每個(gè)Form Bean域來說,都需要編寫邏輯代碼來實(shí)現(xiàn)驗(yàn)證。此外,你還必須編寫代碼來存儲(chǔ)驗(yàn)證失敗時(shí)的出錯(cuò)消息。

    有了Validator,你就不必在Form Bean中編寫用于驗(yàn)證或存儲(chǔ)錯(cuò)誤消息的任何代碼。相反,F(xiàn)orm Bean提供了Validator的一個(gè)ActionForm子類,它提供驗(yàn)證或存儲(chǔ)錯(cuò)誤消息的功能。

    可把Validator框架作為一個(gè)可用于Form Bean驗(yàn)證的可插入的驗(yàn)證例行程序系統(tǒng)來進(jìn)行安裝。每個(gè)驗(yàn)證例行程序都只是一個(gè)Java方法,負(fù)責(zé)執(zhí)行特定類型的驗(yàn)證任務(wù),驗(yàn)證可能通過,也可能失敗。 默認(rèn)情況下,Validator與幾個(gè)有用的驗(yàn)證例行程序封裝在一起來提供,這些例行程序能滿足大多數(shù)情況下的驗(yàn)證要求。但是,如果Validator框架沒有提供你需要的驗(yàn)證例行程序,那么你可以自己創(chuàng)建定制的驗(yàn)證例行程序,并將它插入到該框架中。此外,Validator還支持服務(wù)器端和客戶端(JavaScript)的驗(yàn)證,而Form Bean只提供服務(wù)器端驗(yàn)證界面。

    Validator使用兩個(gè)XML配置文件來分別確定安裝哪個(gè)驗(yàn)證例行程序和如何將它們應(yīng)用于給定的應(yīng)用程序。第一個(gè)配置文件validator-rules.xml說明應(yīng)該被插入到框架中的驗(yàn)證例行程序,并提供每個(gè)驗(yàn)證的邏輯的名稱。validator-rules.xml文件還定義了每個(gè)驗(yàn)證例行程序的客戶端JavaScript代碼??梢耘渲肰alidator讓它把這個(gè)JavaScript代碼發(fā)送到瀏覽器上,這樣驗(yàn)證就可以在客戶端和服務(wù)器端進(jìn)行了。

    第二個(gè)配置文件validation.xml確定哪個(gè)驗(yàn)證例行程序應(yīng)用到哪個(gè)Form Bean。文件中的定義使用struts-config.xml文件給出的Form Bean的邏輯名稱以及validator-rules.xml文件給出的驗(yàn)證例行程序的邏輯名稱,以便把二者關(guān)聯(lián)起來。

    使用Validator框架包括啟用Validator插件、配置Validator的兩個(gè)配置文件,以及創(chuàng)建提供Validator的ActionForm子類的Form Beans。下面詳細(xì)解釋如何配置和使用Validator。

    啟用Validator插件

    雖然Validator框架是與Struts封裝在一起提供的,但在默認(rèn)狀況下Validator并不被啟用。為了啟用Validator,要向你的應(yīng)用程序的struts-config.xml文件中添加下面的插件定義。

    <!-- Validator Configuration -->
    <plug-in className="org.apache.struts
    .validator.ValidatorPlugIn">
    <set-property property="pathnames"
    value="/WEB-INF/
    validator-rules.xml, /WEB-INF/
    validation.xml"/>
    </plug-in>

    該定義告訴Struts為你的應(yīng)用程序加載并初始化Validator插件。在初始化時(shí),該插件裝入由路徑名屬性指定的、用逗號(hào)分隔的Validator配置文件清單。每個(gè)配置文件的路徑應(yīng)該用與Web應(yīng)用程序的相關(guān)的路徑來指定,如前面的例子所示。

    請(qǐng)注意,你的應(yīng)用程序的struts-config.xml文件必須與Struts Configuration Document Type Definition(Struts配置文檔類型定義,DTD)一致,后者規(guī)定文件中元素出現(xiàn)的順序。所以,你必須把Validator插件定義放到該文件的適當(dāng)位置。確保文件中元素適當(dāng)排列的最簡便方法就是使用諸如Struts Console的工具,它自動(dòng)格式化你的配置文件,以便與DTD保持一致。

    配置validator-rules.xml

    Validator框架可以設(shè)置為可插入系統(tǒng),其驗(yàn)證例行程序僅僅是插入到該系統(tǒng)中執(zhí)行具體驗(yàn)證的Java方法。validator-rules.xml文件說明性地插入Validator用于執(zhí)行驗(yàn)證的驗(yàn)證例行程序中。Struts示例應(yīng)用程序帶有這個(gè)文件的預(yù)配置拷貝。在大多數(shù)情況下,你不必修改這個(gè)預(yù)配置拷貝,除非你要向該框架中添加自己定制的驗(yàn)證。

    清單1 是一個(gè)示例validator-rules.xml文件,說明如何將驗(yàn)證例行程序插入到Validator中。validator-rules.xml文件中的每個(gè)驗(yàn)證例行程序都有自己的定義,它用validator標(biāo)記聲明,利用name屬性為該驗(yàn)證例行程序指定邏輯名,并指定該例行程序的類和方法。該例行程序的邏輯名稱供該文件中的其他例行程序以及validation.xml文件中的驗(yàn)證定義用于引用該例行程序。

    請(qǐng)注意,validator標(biāo)記放在javascript的標(biāo)記中,javascript標(biāo)記用于定義客戶端JavaScript代碼,以便在客戶端執(zhí)行與服務(wù)器端相同的驗(yàn)證。

    提供的驗(yàn)證程序

    默認(rèn)情況下,Validator中包括幾個(gè)基本驗(yàn)證例行程序,你可以用它們來處理大多數(shù)驗(yàn)證問題。這些例行程序具有邏輯名稱,如required(用于輸入要求的值)、CreditCard(用于輸入信用卡號(hào)碼值)、email(用于輸入電子郵件地址值),等等。

    創(chuàng)建Form Bean

    為了使用Validator,你的應(yīng)用程序的Form Bean必須歸到Validator的ActionForm的某一子類,而不是ActionForm本身。Validator的ActionForm子類提供了ActionForm的validate( )方法(它嵌入到Validator框架中)的實(shí)施過程。你不必從頭編寫驗(yàn)證代碼并把它投入validate( )方法中,相反,可以完全忽略該方法,因?yàn)閂alidator為你提供了驗(yàn)證代碼。

    與Struts提供的核心功能相類似,Validator提供給你兩種可供選擇的方法來創(chuàng)建Form Bean。 你可以選擇的第一種方法就是像下面這樣創(chuàng)建一個(gè)特定的Form Bean對(duì)象:

    package com.jamesholmes.minihr;

    import org.apache.struts.validator
    .ValidatorForm;

    public class LogonForm extends ValidatorForm {
    private String username;
    private String password;

    public String getUsername() {
    return username;
    }

    public void setUsername(String
    username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }
    public void setPassword(String
    password) {
    this.password = password;
    }
    }

    這個(gè)類與你不是用Validator所創(chuàng)建的類相似,但它提供ValidatorForm而不是ActionForm。這個(gè)類也不提供ActionForm的空reset( )和validate( )方法的實(shí)施過程,因?yàn)閂alidatorForm提供了相應(yīng)過程。

    在struts-config.xml文件中配置這個(gè)特定Form Bean的方法與配置正則Form Bean的方法相同:

    <form-beans>
    <form-bean name="logonForm"
    type="com.jamesholmes
    .minihr.LogonForm"/>
    </form-beans>

    用表單標(biāo)記的name屬性給特定Form Bean指定的邏輯名是在定義validation.xml文件中的驗(yàn)證時(shí)所使用的名稱,如下所示:

    <!DOCTYPE form-validation 
    PUBLIC "-//Apache Software Foundation//
    DTD Commons Validator Rules
    Configuration 1.0//EN"
    "http://jakarta.apache.org/
    commons/dtds/validator_1_0.dtd">

    <form-validation>
    <formset>
    <form name="logonForm">
    <field property="username"
    depends="required">
    <arg0 key="prompt.username"/>
    </field>
    </form>
    </formset>
    </form-validation>

    Validator使用該表單標(biāo)記的name屬性的值將驗(yàn)證定義與要應(yīng)用這些定義的Form Bean的名稱相匹配。

    創(chuàng)建Form Bean時(shí)可以選擇的第二種方法是在struts-config.xml文件中定義一個(gè)動(dòng)態(tài)Form Bean,如下所示:

    <form-beans>
    <form-bean name="logonForm"
    type="org.apache
    .struts.validator.DynaValidatorForm">
    <form-property name="username"
    type="java.lang.String"/>
    <form-property name="password"
    type="java.lang.String"/>
    </form-bean>
    </form-beans>

    動(dòng)態(tài)Form Bean不要求創(chuàng)建特定的Form Bean對(duì)象;相反,要定義Form Bean應(yīng)該具有的屬性和類型,而Struts為你動(dòng)態(tài)創(chuàng)建Form Bean。 Validator允許你使用這個(gè)概念,就像在核心Struts中使用這個(gè)概念一樣。與使用Validator的惟一區(qū)別就是要指定Form Bean是org.apache.struts.validator.DynaValidatorForm類型,而不是org.apache.struts.action.DynaActionForm類型。

    分配給動(dòng)態(tài)Form Bean的邏輯名是在定義validation.xml文件中的驗(yàn)證時(shí)使用的名稱。Validator使用與之相匹配的名稱將這些驗(yàn)證與Form Bean聯(lián)系在一起。

    除了創(chuàng)建Form Bean的這兩種標(biāo)準(zhǔn)方法之外,Validator還提供了一個(gè)高級(jí)特性,用于將多個(gè)驗(yàn)證定義與一個(gè)Form Bean定義聯(lián)系起來。當(dāng)你使用基于validatorForm或基于DynaValidatorForm的Form Bean時(shí),Validator使用struts-config.xml文件中的Form Bean的邏輯名稱,將Form Bean映射到validation.xml文件中的驗(yàn)證定義。這種機(jī)制在大多數(shù)情況下非常有用,但在某些時(shí)候,F(xiàn)orm Bean要在多個(gè)操作中共享。 一個(gè)操作可能使用Form Bean的所有域(fields),而另一個(gè)操作可能只使用這些域的一個(gè)子集。因?yàn)轵?yàn)證定義被連接到Form Bean,所以只使用域的一個(gè)子集的操作就無法繞過對(duì)未使用域的驗(yàn)證。當(dāng)驗(yàn)證Form Bean時(shí),就會(huì)對(duì)未使用的域生成錯(cuò)誤消息,因?yàn)閂alidator無從知道不去驗(yàn)證未使用的域,它只是簡單地把它們看作缺失或無效。

    為了解決這個(gè)問題,Validator提供了兩個(gè)附加的ActionForm子類,它使你能夠?qū)Ⅱ?yàn)證與操作相關(guān)聯(lián),而不是與Form Bean相關(guān)聯(lián)。這樣你就可以根據(jù)哪個(gè)操作正在使用Form Bean來指定把哪些驗(yàn)證用于該Form Bean了。對(duì)于特定的Form Bean,你要像下面這樣聲明org.apache.struts.validator.ValidatorActionForm子類:

    public class AddressForm extends ValidatorActionForm {
    ...
    }

    對(duì)于動(dòng)態(tài)Form Bean,在struts-config.xml文件中為Form Bean定義指定org.apache.struts.validator.DynaValidatorActionForm的類型,如下所示:

    <form-bean name="addressForm"
    type="org.apache.struts
    .validator.DynaValidatorActionForm">
    ...
    </form-bean>

    在validation.xml文件中,把一組驗(yàn)證映射到一個(gè)操作路徑,而不是映射到Form Bean名,因?yàn)槿绻愣x了Create Address和Edit Address兩個(gè)操作(它們使用同一個(gè)Form Bean),那么每個(gè)操作都會(huì)有一個(gè)惟一的操作名,如下所示:

    <action-mappings>
    <action path="/createAddress"
    type="com.jamesholmes
    .minihr.CreateAddressAction"
    name="addressForm"/>
    <action path="/editAddress"
    type="com.jamesholmes
    .minihr.EditAddressAction"
    name="addressForm"/>
    </action-mappings>

    下面的validation.xml文件片斷顯示了兩組驗(yàn)證,它們用于同一個(gè)Form Bean,但卻有不同的操作路徑:

    <formset>
    <form name="/createAddress">
    <field property="city"
    depends="required">
    <arg0 key="prompt.city"/>
    </field>
    </form>
    <form name="/editAddress">
    <field property="state"
    depends="required">
    <arg0 key="prompt.state"/>
    </field>
    </form>
    </formset>

    因?yàn)镕orm Bean要么屬于ValidatorActionForm子類,要么屬于DynaValidatorActionForm子類,所以Validator知道用一個(gè)操作路徑代替Form Bean的邏輯名稱來找出用于Form Bean的驗(yàn)證。

    配置validation.xml文件

    validation.xml文件用于聲明將應(yīng)用到Form Beans的一組驗(yàn)證。要驗(yàn)證的每個(gè)Form Bean在這個(gè)文件中都有自己的定義。在這個(gè)定義中,指定要應(yīng)用到該Form Bean的各域的驗(yàn)證。下面是一個(gè)validation.xml文件的例子,說明如何定義驗(yàn)證:

    <!DOCTYPE form-validation 
    PUBLIC "-//Apache Software Foundation//
    DTD Commons Validator Rules
    Configuration 1.0//EN"
    "http://jakarta.apache.org/
    commons/dtds/validator_1_0.dtd">

    <form-validation>
    <formset>
    <form name="logonForm">
    <field property="username"
    depends="required">
    <arg0 key="prompt.username"/>
    </field>
    <field property="password"
    depends="required">
    <arg0 key="prompt.password"/>
    </field>
    </form>
    </formset>
    </form-validation>

    validation.xml文件的第一個(gè)元素是form-validation。這個(gè)元素是該文件的主元素,而且只定義一次。在form-validation元素內(nèi)定義form-set元素,它包括多個(gè)表單元素。一般來說,在文件中只定義一個(gè)form-set元素,但是如果要將驗(yàn)證國際化,那就要在每個(gè)地方單獨(dú)使用一個(gè)form-set元素。

    每個(gè)表單元素使用name屬性將名稱與其所包含的域驗(yàn)證集關(guān)聯(lián)起來。Validator使用這個(gè)邏輯名稱將這些驗(yàn)證映射到在struts-config.xml文件中定義的一個(gè)Form Bean。根據(jù)要驗(yàn)證的Form Bean的類型,Validator力求將該名稱與Form Bean的邏輯名稱或操作路徑相匹配。在表單元素內(nèi),field元素定義要應(yīng)用到Form Bean的特定域的驗(yàn)證。field元素的property屬性對(duì)應(yīng)于特定Form Bean中的域名。depends屬性利用validator-rules.xml文件指定驗(yàn)證例行程序的邏輯名稱,這些例行程序?qū)?yīng)用到域驗(yàn)證中。

    配置ApplicationResources.properties

    Validator使用Struts的資源綁定(Resource Bundle)機(jī)制將錯(cuò)誤消息具體化。不用在框架中對(duì)錯(cuò)誤消息進(jìn)行硬編碼,Validator使你能在ApplicationResources.properties文件中為一個(gè)消息指定一個(gè)鍵值,如果驗(yàn)證失敗則將返回該鍵值。validator-rules.xml文件中的每個(gè)驗(yàn)證例行程序都用validator標(biāo)記的msg屬性指定錯(cuò)誤消息的鍵值,如下所示:

    <validator name="required"
    classname="org.apache
    .struts.validator.FieldChecks"
    method="validateRequired"
    methodParams="java.lang
    .Object, org.apache.commons.validator
    .ValidatorAction, org.apache.commons
    .validator.Field, org.apache.struts
    .action.ActionErrors, javax.servlet
    .http.HttpServletRequest"
    msg="errors.required">

    如果在驗(yàn)證例行程序運(yùn)行時(shí)驗(yàn)證失敗,則返回與msg屬性指定的鍵值對(duì)應(yīng)的消息。

    下面的片段顯示來自ApplicationResources.properties文件的驗(yàn)證出錯(cuò)時(shí)的默認(rèn)消息集,它們由Struts示例應(yīng)用程序提供。每個(gè)消息的鍵值對(duì)應(yīng)于每個(gè)由validator-rules.xml文件中的驗(yàn)證例行程序所指定的消息,它們由Struts示例應(yīng)用程序提供。

    # Error messages for Validator framework validations
    errors.required={0} is required.
    errors.minlength={0} cannot be less than {1} characters.
    errors.maxlength={0} cannot be greater than {2} 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.0. 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 not a valid credit card number.
    errors.email={0} is an invalid e-mail address.

    請(qǐng)注意,每條消息都有占位符,形式為{0}、{1}或{2}。在運(yùn)行期間,占位符被另一個(gè)值代替,如所驗(yàn)證的域的名稱。這一特性特別有用,它使你能夠創(chuàng)建可被幾個(gè)不同的域重復(fù)使用的通用驗(yàn)證錯(cuò)誤消息。

    例如,下面給出required驗(yàn)證的錯(cuò)誤消息errors.required:

    errors.required={0} is required.

    當(dāng)你使用validation.xml文件中的該required驗(yàn)證時(shí),必須定義用于替換該錯(cuò)誤消息中的{0}的值,如下所示:

    <form name="auctionForm">
    <field property="bid" depends="required">
    <arg0 key="prompt.bid"/>
    </field>
    </form>

    錯(cuò)誤消息最多可以有4個(gè)占位符:{0}和{3}。這些占位符分別稱為arg0到arg3,你可以通過使用arg0~arg3標(biāo)記來指定它們。在上面的例子中,arg0標(biāo)記指定了用于替換{0}占位符的值。該標(biāo)記的key屬性指定來自ApplicationResources.properties文件的一個(gè)消息鍵值,它的值用于替換占位符,如下所示:
    下一步

    閱讀
    關(guān)于Validator的更多文章
    jakarta.apache.org/commons/validator

    關(guān)于Struts Console的更多文章
    www.jamesholmes.com/struts

    prompt.bid=Auction Bid

    使用消息鍵值代替占位符的值,這一方法使你不必在validation.xml文件中對(duì)替換值反復(fù)硬編碼。但是,如果你不想使用Resource Bundle的鍵值/值機(jī)制來指定占位符的值,則可以使用arg0標(biāo)記的如下語法顯式地指定占位符的值:

    <arg0 key="Auction Bid" resource="false"/>

    在這個(gè)例子中,resource屬性的值設(shè)為false,以便通知Validator要把該key屬性指定的值作為占位符的值,而不要作為ApplicationResources.properties文件中消息的一個(gè)鍵值。

    啟用客戶端驗(yàn)證

    Validator除了提供了簡化服務(wù)器端表單數(shù)據(jù)驗(yàn)證過程的框架外,它還提供了執(zhí)行客戶端驗(yàn)證時(shí)易于使用的方法。在validator-rules.xml文件中定義的每一個(gè)驗(yàn)證例行程序都可以隨意指定JavaScript代碼,這些代碼可以在瀏覽器(客戶端上的)中運(yùn)行,從而執(zhí)行與服務(wù)器端進(jìn)行的驗(yàn)證相同的驗(yàn)證過程。在客戶端進(jìn)行驗(yàn)證時(shí),除非所有表單都通過驗(yàn)證,否則這些表單不允許被提交。

    為了啟用客戶端驗(yàn)證,必須在每個(gè)需要驗(yàn)證的JSP中放上Struts HTML Tag Library(標(biāo)記庫)的javascript標(biāo)記,如下所示:

    <html:javascript formName="logonForm"/>

    javascript標(biāo)記要求使用formName屬性來為想要對(duì)其執(zhí)行驗(yàn)證的表單指定validation.xml文件中給出的表單定義名,如下所示:

    <form name="logonForm">
    <field property="username"
    depends="required">
    <arg0 key="prompt.username"/>
    </field>
    <field property="password"
    depends="required">
    <arg0 key="prompt.password"/>
    </field>
    </form>

    為表單定義指定的服務(wù)器端的所有驗(yàn)證都將在客戶端運(yùn)行。由于客戶端驗(yàn)證用JavaScript執(zhí)行,所以可以有多種方法不去執(zhí)行它。要確保驗(yàn)證過程總是能運(yùn)行,不論你是否選擇啟用了客戶端驗(yàn)證,Validator都在服務(wù)器端執(zhí)行這些驗(yàn)證。

    結(jié)論

    Validator框架針對(duì)表單數(shù)據(jù)的驗(yàn)證提供了可配置的系統(tǒng),從而為核心Struts框架添加了很多有價(jià)值的功能。通過把Validator框架用于你的應(yīng)用程序,你可以節(jié)約時(shí)間并簡化Struts應(yīng)用程序的開發(fā)過程。

    posted on 2005-12-27 11:50 javaGrowing 閱讀(1792) 評(píng)論(14)  編輯  收藏

    評(píng)論

    # re: 用Struts Validator檢查你的表單 2006-10-04 21:19 wycwyc
    如果使用了DynaValidatorForm類型,那么在ACTION中如何得到前面JSP頁面中表單里面的數(shù)據(jù)呢?  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-11 15:12 javaGrowing
    在配置文件中定義動(dòng)態(tài)form名例如
    <form-beans>
    <form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">
    <form-property name="actionClass" type="java.lang.String"/>
    <form-property name="username" type="java.lang.String"/>
    <form-property name="password" type="java.lang.String"/>
    </form-bean>
    </form-beans>
    <action path="/login"
    type="com.ncu.test.LoginAction"
    name="loginForm"
    scope="request"
    input="tile.userLogin"validate="true">  回復(fù)  更多評(píng)論
      

    # Validator框架添加后的問題 2006-10-12 22:19 TerryZeng
    您好,我想請(qǐng)教一個(gè)問題Validator相關(guān)問題。
    首先我的情況是這樣的,有一個(gè)員工信息編輯頁面EmployeeEdit.jsp,其中有兩個(gè)字段是部門列表和職務(wù)列表,這兩個(gè)列表并不是靜態(tài),而是數(shù)據(jù)庫中動(dòng)態(tài)讀取的,為了讀取列表,我使用了一個(gè)Action來處理,將處理好的兩個(gè)集合存放在Reques范圍傳遞給EmployeeEdit.jsp,添加和更新員工信息則由另一個(gè)Action來處理;換句話說就是有兩個(gè)Action和這個(gè)頁面的ActionForm是關(guān)聯(lián)的,在未加入Validator框架之前,這樣的流程已經(jīng)正常運(yùn)作了。
    我加入Validator框架的過程是:在Struts-Config.xml中加入Validator插件,將ActionForm改為擴(kuò)展ValidatorForm,全局資源文件處的配置沒有問題,就這樣運(yùn)行后,在訪問到初始化列表的Action時(shí)出錯(cuò)了,提示需要指定input頁面,在Struts-Config.xml中設(shè)置了input="XXX/EmployeeEdit.jsp",再次運(yùn)行時(shí),又出錯(cuò)了,這回不是Action,而是EmployeeEdit.jsp頁面的下拉列表控件處,它提示Cannot find bean deptlist in any scope,也就是說我在之前從數(shù)據(jù)庫中讀取出來的部門列表和職務(wù)列表沒有傳遞到頁面上來,弄了兩天了,始終不知道是哪里錯(cuò)了,還請(qǐng)高手指點(diǎn)一二,在下拜謝  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 13:27 javaGrowing
    這個(gè)應(yīng)該跟validator沒關(guān)系吧,你是怎么綁定你的下拉列表的  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 15:06 TerryZeng
    這個(gè)問題現(xiàn)在搞定了,我設(shè)置Validator="false"就沒事了,但是有個(gè)問題就是Validator似乎沒有工作的樣子,錯(cuò)誤的數(shù)據(jù)照樣收進(jìn)Action里處理
    1.確定Struts-Config.xml里添加了Validator插件
    2.Validator里的標(biāo)簽沒有寫錯(cuò)
    3.確定資源文件里有對(duì)應(yīng)的文本

    可是就是怎么也驗(yàn)證不了,而且把validator="true"后,就會(huì)出現(xiàn)之前說的情況。
    感謝解答  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 16:05 TerryZeng
    我綁定下拉列表的方法是在預(yù)處理Action里將數(shù)據(jù)庫里的職務(wù)和部門列表分別放在List對(duì)象中,再將List對(duì)象放入Request范圍中。  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 16:11 TerryZeng
    我發(fā)現(xiàn)加入Validator驗(yàn)證后,提交會(huì)將頁面刷新,并把頁面范圍內(nèi)的變量都清空,才會(huì)導(dǎo)致這種情況!  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 16:37 javaGrowing
    當(dāng)validate屬性置為ture時(shí),input屬性值一定要被正確設(shè)置,以便validate出錯(cuò)后知道返回到那個(gè)輸入頁面,在一個(gè)上下文環(huán)境中想使用一個(gè)actionform的兩個(gè)實(shí)例,為了保證這兩個(gè)actionform的名字不會(huì)沖突,需要通過attribute屬性設(shè)定一個(gè)不同的名字  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 16:45 javaGrowing
    你提交之后,頁面會(huì)跳轉(zhuǎn)到哪里,如果又回到EmployeeEdit.jsp那原來request的數(shù)據(jù)肯定就沒了
    request的生存周期只是一次請(qǐng)求  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 17:19 TerryZeng
    那有什么辦法可以保住這些數(shù)據(jù)么?
    只要點(diǎn)了提交按鈕,它首先處理的就是將頁面刷新,此時(shí)原來Request的數(shù)據(jù)就沒了,然后頁面解悉到
    <html:optionsCollection label="deptName" value="deptId" name="deptlist"/>處時(shí)就報(bào)錯(cuò)了,Cannot find bean deptlist in any scope。  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-13 17:28 javaGrowing
    可以在request.setAttribute一邊,或者放到session里啊  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2006-10-15 20:16 TerryZeng
    照你說的,我把原先的部門列表和職務(wù)列表,放在Session范圍,又在外面加了一層<logic:present>標(biāo)簽來判斷指定范圍內(nèi)有沒有這個(gè)變量,確保萬無一失,解決問題了,要來多謝你的耐心指導(dǎo)!  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 [未登錄] 2008-08-13 16:14 aa
    路過...  回復(fù)  更多評(píng)論
      

    # re: 用Struts Validator檢查你的表單 2008-09-03 22:43 hivvyeah@163.com
    ajax怎么辦  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产大片免费天天看| 亚洲国产高清视频在线观看| 亚洲AV无码成人精品区大在线| 成年女人喷潮毛片免费播放| 欧洲乱码伦视频免费| 日本亚洲免费无线码| 国产成人免费在线| 色片在线免费观看| 毛片免费vip会员在线看| 国产成人免费网站| 成年女人色毛片免费看| 好男人视频社区精品免费| 日本一道本高清免费| 国产男女猛烈无遮挡免费视频| 国产aa免费视频| 亚洲精品视频在线看| av在线亚洲欧洲日产一区二区| 区久久AAA片69亚洲| 久久亚洲国产精品一区二区| 亚洲国产成人久久综合碰碰动漫3d| 久久亚洲AV午夜福利精品一区| 亚洲欧洲日产国码www| 亚洲另类自拍丝袜第五页| 看免费毛片天天看| 97超高清在线观看免费视频| 99视频在线看观免费| 免费看黄视频网站| 国产成人免费A在线视频| 久久久久国产成人精品亚洲午夜| 亚洲精品无码久久久久sm| 亚洲精品在线视频观看| 亚洲影院天堂中文av色| 男女男精品网站免费观看| 精品一卡2卡三卡4卡免费视频| 精品国产免费人成电影在线观看| 在线免费观看a级片| 伊人久久综在合线亚洲91| 久久亚洲AV成人无码| 亚洲AV成人精品一区二区三区| 五月婷婷免费视频| 999久久久免费精品播放|