JAVA流通橋

          JAVA啟發(fā)者

          統(tǒng)計(jì)

          留言簿(3)

          AJAX相關(guān)網(wǎng)址

          Eclipse相關(guān)網(wǎng)址

          Hibernate

          java相關(guān)網(wǎng)址

          LINUX相關(guān)網(wǎng)址

          webwork相關(guān)網(wǎng)址

          友好鏈接

          閱讀排行榜

          評(píng)論排行榜

          驗(yàn)證框架

          驗(yàn)證框架

          WebWork提供了在Action執(zhí)行之前,對(duì)輸入數(shù)據(jù)的驗(yàn)證功能,它使用了其核心XWork的驗(yàn)證框架。提供了如下功能:

          1、 可配置的驗(yàn)證文件。它的驗(yàn)證文件是一個(gè)獨(dú)立的XML配置文件,對(duì)驗(yàn)證的添加、修改只需更改配置文件,無(wú)需編譯任何的Class

          2、 驗(yàn)證文件和被驗(yàn)證的對(duì)象完全解藕。驗(yàn)證對(duì)象是普通的JavaBean就可以了(可以是FormBean、域?qū)ο蟮龋鼈儾恍鑼?shí)現(xiàn)任何額外的方法或繼承額外的類(lèi)。

          3、 多種不同的驗(yàn)證方式。因?yàn)樗?yàn)證功能是可以繼承的,所以可以用多種不同的方式指定驗(yàn)證文件,比如:通過(guò)父類(lèi)的Action、通過(guò)Action、通過(guò)Action的方法、通過(guò)Action所使用的對(duì)象,等等。

          4、 強(qiáng)大的表達(dá)式驗(yàn)證。它使用了OGNL的表達(dá)式語(yǔ)言,提供強(qiáng)大的表達(dá)式驗(yàn)證功能。

          5、 同時(shí)支持服務(wù)器端和客戶(hù)端驗(yàn)證。

          為用戶(hù)注冊(cè)添加驗(yàn)證功能

          下面我們來(lái)看看如何為用戶(hù)注冊(cè)添加驗(yàn)證功能:

          1、 注冊(cè)我們的驗(yàn)證類(lèi)型

          WebWork為不同的驗(yàn)證要求提供不同的驗(yàn)證類(lèi)型。一個(gè)驗(yàn)證類(lèi)型,一般是有一個(gè)類(lèi)來(lái)提供。這個(gè)類(lèi)必須實(shí)現(xiàn)接口:com.opensymphony.xwork.validator.Validator,但我們?cè)趯?xiě)自己的驗(yàn)證類(lèi)型時(shí),無(wú)需直接實(shí)現(xiàn)Validator接口,它有抽象類(lèi)可供直接使用如ValidatorSupportFieldValidatorSupport等。

          驗(yàn)證類(lèi)型在使用之前,必須要在ValidatorFactorycom.opensymphony.xwork.validator. ValidatorFactory)中注冊(cè)。可以有二種方法實(shí)現(xiàn)驗(yàn)證類(lèi)型的注冊(cè)。一、寫(xiě)程序代碼進(jìn)行注冊(cè),它使用ValidatorFactory類(lèi)的靜態(tài)方法:registerValidator(String name, String className)二、使用配置文件validators.xml進(jìn)行注冊(cè),要求把文件validators.xml放到ClassPath的跟目錄中(/WEB-INF/classes)。但在實(shí)際開(kāi)發(fā)中,一般都使用第二中注冊(cè)方法。我們的驗(yàn)證類(lèi)型注冊(cè)如下:

          <validators>

              <validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>

              <validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>

              <validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>

              <validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>

              <validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>

              <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>

              <validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>

              <validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>

              <validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>

              <validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>

              <validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>

          </validators>

          注冊(cè)驗(yàn)證類(lèi)型的配置文件非常簡(jiǎn)單。它使用標(biāo)簽<validator>提供名-值對(duì)的形式注冊(cè)。這樣我們的驗(yàn)證文件就可以直接引用它的名字。

          2、 開(kāi)啟Action的驗(yàn)證功能

           如果Action要使用驗(yàn)證框架的驗(yàn)證功能,它必須在配置文件中指定攔截器“validation”,它的定義如下:

          <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>

          我們的驗(yàn)證文件必須以ActionName-validation.xml格式命名,它必須被放置到與這個(gè)Action相同的包中。你也可以為這個(gè)Action通過(guò)別名的方式指定驗(yàn)證文件,它的命名格式為:ActionName-aliasname-validation.xml。“ActionName ”是我們Action的類(lèi)名;“aliasname”是我們?cè)谂渲梦募?/span>xwork.xml)中定義這個(gè)Action所用到的名稱(chēng)。這樣,同一個(gè)Action類(lèi),在配置文件中的不同定義就可以對(duì)應(yīng)不同的驗(yàn)證文件。驗(yàn)證框架也會(huì)根據(jù)Action的繼承結(jié)構(gòu)去查找Action的父類(lèi)驗(yàn)證文件,如果找到它會(huì)去執(zhí)行這個(gè)父類(lèi)的驗(yàn)證。

           

          3、 實(shí)現(xiàn)我們的驗(yàn)證文件:RegisterActionSupport-validation.xml

          <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">

          <validators>

              <field name="user.username">

              <field-validator type="requiredstring">

                      <message>You must enter a value for username.</message>

                  </field-validator>

              </field>

              <field name="user.password">

              <field-validator type="requiredstring">

                      <message>You must enter a value for password.</message>

                  </field-validator>

                  <field-validator type="fieldexpression">

                      <param name="expression">user.password == verifyPassword</param>

                      <message>Passwords don't match.</message>

                  </field-validator>

              </field>

              <field name="user.email">

              <field-validator type="email">

                      <message>You must enter a valid email.</message>

                  </field-validator>

              </field>

              <field name="user.age">

              <field-validator type="int">

                      <param name="min">6</param>

                      <param name="max">100</param>

                      <message>Age must be between ${min} and ${max}, current value is ${user.age}.</message>

                  </field-validator>

              </field>

          </validators>

          說(shuō)明:

          1)、<field>標(biāo)簽代表一個(gè)字段,它的屬性“name”和頁(yè)面輸入框的“name”屬性必需完全一致,其實(shí)它也就是我們的表達(dá)式語(yǔ)言。

          2)、<field-validator>標(biāo)簽定義我們的驗(yàn)證規(guī)則,type屬性的值就是就是我們前面定義的驗(yàn)證類(lèi)型。

          3)、驗(yàn)證文件中,字段的數(shù)據(jù)是通過(guò)表達(dá)式語(yǔ)言從我們的值堆棧(OgnlValueStack)中取得,一般是ActionModel對(duì)象。例如:我們的字段“user.age”,它會(huì)通過(guò)ActiongetUser().getAge()來(lái)取得用戶(hù)輸入的年齡,再來(lái)根據(jù)驗(yàn)證的類(lèi)型“int”和最大值最小值的參數(shù)來(lái)判斷輸入的數(shù)據(jù)是否能通過(guò)驗(yàn)證。

          4)、不管驗(yàn)證是否通過(guò),我們的Action都會(huì)執(zhí)行,但如果驗(yàn)證沒(méi)有通過(guò),它不會(huì)調(diào)用Actionexecute()方法。

           

          4、 顯示Action的驗(yàn)證錯(cuò)誤信息

          如果用戶(hù)輸入的數(shù)據(jù)驗(yàn)證沒(méi)有通過(guò),我們需重新返回輸入頁(yè)面,并給出錯(cuò)誤信息提示。攔截器棧“validationWorkflowStack”為我們實(shí)現(xiàn)了這個(gè)功能。它首先驗(yàn)證用戶(hù)輸入的數(shù)據(jù),如果驗(yàn)證沒(méi)有通過(guò)將不執(zhí)行我們Actionexecute()方法,而是將請(qǐng)求重新返回到輸入頁(yè)面。

          我們的xwork.xml配置文件如下:

          <action name="registerSupport" class="com.test.RegisterActionSupport" >

                     <result name="success" type="dispatcher">

                        <param name="location">/registerResult.vm</param>

                     </result>

                     <result name="input" type="dispatcher">

                        <param name="location">/registerSupport.vm</param>

                     </result>

                     <interceptor-ref name="validationWorkflowStack"/>

                 </action>

           

          通過(guò)接口ValidationAware我們可以獲得類(lèi)級(jí)別或字段級(jí)別的驗(yàn)證錯(cuò)誤信息,這個(gè)錯(cuò)誤信息也就是我們驗(yàn)證文件中<message>標(biāo)簽里的數(shù)據(jù)。ActionSupport類(lèi)已實(shí)現(xiàn)了此接口,這樣在應(yīng)用中我們的Action只要繼承ActionSupport類(lèi)就可以了。RegisterActionSupport.java代碼如下:

          package com.test;

           

          import com.opensymphony.xwork.ActionSupport;

           

          public class RegisterActionSupport extends ActionSupport {

           

              private User user= new User();

              private String verifyPassword;

             

              public User getUser(){

                 return this.user;

              }

             

              public String execute(){

                 //在這里調(diào)用用戶(hù)注冊(cè)的業(yè)務(wù)邏輯,比如:將注冊(cè)信息存儲(chǔ)到數(shù)據(jù)庫(kù)

                 return SUCCESS;

              }

           

              public String getVerifyPassword(){

                 return this.verifyPassword;

              }

             

              public void setVerifyPassword(String verPassword){

                 this.verifyPassword = verPassword;

              }

          }

          我們WebWorkUI標(biāo)簽庫(kù)直接提供了驗(yàn)證錯(cuò)誤信息顯示功能。如果字段級(jí)別的驗(yàn)證沒(méi)有通過(guò),它會(huì)在輸入框上方顯示驗(yàn)證文件定義的錯(cuò)誤提示信息。我們將用戶(hù)輸入的頁(yè)面更改如下:

          registerSupport.vm

          <html>

          <head>

          <title>WebWork Register - Example 4</title>

          <meta name="help-path" content="/help/help5.html"/>

          </head>

          <body>

          <p>Custom Component Example:</p>

           

          <table border=0 width=97%>

          <tr><td align="left">

              #bodytag (form "name='test'" "action='/registerSupport.action'" "method='POST'")

                      #tag(textfield "label='Username'" "name='user.username'" "required='true'")

                      #tag(textfield "label='Password'" "name='user.password'" "required='true'")

                      #tag(textfield "label='VerifyPassword'" "name='verifyPassword'" "required='true'")

                      #tag(textfield "label='Email'" "name='user.email'" "required='true'")

                      #tag(textfield "label='Age'" "name='user.age'" "required='true'")

                      #tag(submit value="'Submit'")

               #end

          </td></tr>

          </table>

          <br/>

          </body>

          </html>

           

          我們上面的相應(yīng)結(jié)果文件registerResult.vm為:

          <html>

          <head><title>WebWork Register - Example 4 - Register result</title></head>

          <body>

              <table border=0 width=97%>

                  <tr>

                      <td align="left">

                      Congratulation,your register success!<p>

                      Username:$!user.username<br>

                      Password:$!user.password<br>

                      Email:$!user.email<br>

                      Age:$!user.age<br>

                      </td>

                  </tr>

              </table>

          </body>

          </html>

           

          我們上面的例子使用的是服務(wù)器端驗(yàn)證。

          posted on 2007-04-12 17:29 朱巖 閱讀(279) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): webwork文章


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 余江县| 大化| 朝阳县| 武功县| 丰台区| 克山县| 广汉市| 庄河市| 麻江县| 海兴县| 进贤县| 广东省| 开江县| 报价| 江口县| 大理市| 正宁县| 图木舒克市| 鹤庆县| 揭东县| 海丰县| 郯城县| 南安市| 阜阳市| 奈曼旗| 洱源县| 亳州市| 垣曲县| 定安县| 固安县| 廉江市| 大化| 万山特区| 汉中市| 东阿县| 元阳县| 清原| 射阳县| 江津市| 格尔木市| 垦利县|