最愛Java

          書山有路勤為徑,學(xué)海無涯苦作舟

          Struts2學(xué)習(xí)筆記——輸入校驗(yàn)(一)

              Struts2提供了基于驗(yàn)證框架的輸入校驗(yàn),在這種校驗(yàn)方式下,所有的輸入校驗(yàn)只需要通過指定的配置文件即可。Struts2中每個(gè)Action都有一個(gè)校驗(yàn)文件,其規(guī)則為:<Action名字>-validation.xml。如:

          package com.struts.test.action;

          import java.util.Date;

          import com.opensymphony.xwork2.ActionSupport;

          public class RegistAction extends ActionSupport {
              
          private static final long serialVersionUID = -2113900523366315993L;
              
              
          //該請(qǐng)求包含的4個(gè)請(qǐng)求參數(shù)
              private String name;
              
          private String pass;
              
          private int age;
              
          private Date birth;
              
              
              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }

              
          public String getPass() {
                  
          return pass;
              }

              
          public void setPass(String pass) {
                  
          this.pass = pass;
              }

              
          public int getAge() {
                  
          return age;
              }

              
          public void setAge(int age) {
                  
          this.age = age;
              }

              
          public Date getBirth() {
                  
          return birth;
              }

              
          public void setBirth(Date birth) {
                  
          this.birth = birth;
              }

          }

              在類RegistAction.class相同目錄下有RegistAction-validation.xml文件:

          <?xml version="1.0" encoding="GBK"?>
          <!--指定校驗(yàn)配置文件的DTD信息-->
          <!DOCTYPE validators PUBLIC 
              "-//OpenSymphone GROUP/ /XWork Validator 1.0.2/ /EN"
              "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"
          >
          <!--校驗(yàn)文件的根元素-->
          <validators>
              
          <!--校驗(yàn)Action的name屬性-->
              
          <field name="name">
                  
          <!--指定name屬性必須滿足必填規(guī)則-->
                  
          <field-validator type="requiredstring">
                      
          <param name="trim">true</param>
                      
          <message>必須輸入名字</message>
                  
          </field-validator>
                  
          <!--指定name屬性必須匹配正則表達(dá)式-->
                  
          <field-validator type="regex">
                      
          <param name="expression"><![CDATA[(\w{4,25})]]></param>
                      
          <message>您輸入的用戶名只能是字母和數(shù)字,且長度必須在4到25之間</message>
                  
          </field-validator>
              
          </field>
              
          <!--校驗(yàn)Action的pass屬性-->
              
          <field name="pass">
                  
          <!--指定pass屬性必須滿足必填規(guī)則-->
                  
          <field-validator type="requiredstring">
                      
          <param name="trim">true</param>
                      
          <message>必須輸入密碼</message>
                  
          </field-validator>
                  
          <!--指定pass屬性必須匹配正則表達(dá)式-->
                  
          <field-validator type="regex">
                      
          <param name="expression"><![CDATA[(\w{4,25})]]></param>
                      
          <message>您輸入的密碼只能是字母和數(shù)字,且長度必須在4到25之間</message>
                  
          </field-validator>
              
          </field>
              
          <!--校驗(yàn)Action的age屬性-->
              
          <field name="age">
                  
          <!--指定age屬性必須在指定范圍內(nèi)-->
                  
          <field-validator type="int">
                      
          <param name="min">1</param>
                      
          <param name="max">150</param>
                      
          <message>年齡必須在1到150之間</message>
                  
          </field-validator>
              
          </field>
              
          <!--校驗(yàn)Action的birth屬性-->
              
          <field name="birth">
                  
          <!--指定birth屬性必須在指定范圍內(nèi)-->
                  
          <field-validator type="date">
                      
          <param name="min">1900-01-01</param>
                      
          <param name="max">2050-02-21</param>
                      
          <message>生日必須在${min}到${max}之間</message>
                  
          </field-validator>
              
          </field>
          </validators>

              增加了這個(gè)校驗(yàn)文件后,系統(tǒng)會(huì)自動(dòng)加載該文件,當(dāng)用戶提交請(qǐng)求的時(shí)候,Struts2的校驗(yàn)框架會(huì)根據(jù)該文件對(duì)用戶的請(qǐng)求進(jìn)行校驗(yàn)。當(dāng)校驗(yàn)失敗后,Struts2會(huì)自動(dòng)返回名為input的邏輯視圖。我們可以在視圖中添加<s:fielderror/>來查看所返回的校驗(yàn)失敗信息。

              上面的校驗(yàn)中,我們沒有使用國際化,如需國際化,可將message配置成<message key="name.required">這樣的形式。

              上述的校驗(yàn)是在服務(wù)器端進(jìn)行的,如果需要在客戶端進(jìn)行校驗(yàn),可以將jsp改成struts2的標(biāo)簽格式,如:

          <html>
              
          <head/>
                  
          <!--可以導(dǎo)入一些CSS的樣式-->
              
          <s:head/>  
              
          <body>
                          
          <!--添加validate='true'來進(jìn)行校驗(yàn)-->
                  
          <s:form action="regist.action" validate="true">
                      
          <s:textfield label="用戶名" name="name"/>
                      
          <s:textfield label="密碼" name="pass"/>
                      
          <s:textfield label="年齡" name="age"/>
                      
          <s:textfield label="生日" name="birth"/>
                      
          <s:submit/>
                  
          </s:form>
              
          </body>
          </html>

              這里需要注意的是,國際化中需要使用<message>${getText("name.required")}</message>這樣的形式。同時(shí),客戶端校驗(yàn)僅僅支持如下校驗(yàn)器:

          •     required validator(必填校驗(yàn)器)
          •     requiredstring validator(必填字符串校驗(yàn)器)
          •     string length validator(字符串長度校驗(yàn)器)
          •     regex validator(正則表達(dá)式校驗(yàn)器)
          •     email validator(郵件校驗(yàn)器)
          •     url validator(網(wǎng)址校驗(yàn)器)
          •     int validator(整數(shù)校驗(yàn)器)
          •     double validator(雙精度數(shù)校驗(yàn)器)

              Struts2提供了兩種方式來配置校驗(yàn)規(guī)則:字段校驗(yàn)器和非字段校驗(yàn)器風(fēng)格。這兩種風(fēng)格其實(shí)并沒有本質(zhì)的不同,只是組織校驗(yàn)規(guī)則的方式不同:一種是字段優(yōu)先,稱為字段校驗(yàn)器風(fēng)格;另外一種是校驗(yàn)器優(yōu)先,稱為非字段校驗(yàn)器風(fēng)格。

              上面的例子RegistAction-validate.xml就是字段優(yōu)先校驗(yàn)器風(fēng)格。如果變成非字段校驗(yàn)器風(fēng)格,則如下:

          <?xml version="1.0" encoding="GBK"?>
          <!--指定校驗(yàn)配置文件的DTD信息-->
          <!DOCTYPE validators PUBLIC 
              "-//OpenSymphone GROUP/ /XWork Validator 1.0.2/ /EN"
              "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"
          >
          <!--校驗(yàn)文件的根元素-->
          <validators>
              
          <validator type="requiredstring">
                  
          <param name="fieldName">name</param>
                  
          <param name="trim">true</param>
                  
          <message>${getText("name.requried")}</message>
              
          </validator>
              
          <validator type="regex">
                  
          <param name="fieldName">name</param>
                  
          <param name="trim">true</param>
                  
          <param name="expression"><![CDATA[(\w{4,25})]]></param>
                  
          <message>${getText("name.requried")}</message>
              
          </validator>
              
          </validators>

              上面的校驗(yàn)操作并沒有使用短路操作,即當(dāng)我們使用空字符串提交頁面的時(shí)候,會(huì)發(fā)現(xiàn)error信息是:"您必須輸入用戶名! 您輸入的用戶名只能是字母和數(shù)字,且長度必須在4到25之間!"。為了達(dá)到短路效果,我們可以在<validator.../>元素或<field-validator.../>元素中增加short-curcuit="true"即可。我們?cè)诶又袑ame和pass的必填校驗(yàn)器配置成校驗(yàn)器,那么當(dāng)必填校驗(yàn)器失敗后,同一字段的其他校驗(yàn)器就不會(huì)繼續(xù)校驗(yàn)了。

              我們總結(jié)一下校驗(yàn)順序和短路:

              校驗(yàn)器的執(zhí)行順序有如下原則:

                    所有非字段風(fēng)格的校驗(yàn)器優(yōu)先于字段風(fēng)格的校驗(yàn)器

                    所有非字段風(fēng)格的校驗(yàn)器中,排在前面的會(huì)先執(zhí)行。

                    所有字段風(fēng)格的校驗(yàn)器中,排在前面的會(huì)先執(zhí)行。

              校驗(yàn)器短路的原則是:

                  所有非字段校驗(yàn)器是最優(yōu)先執(zhí)行,如果某個(gè)非字段校驗(yàn)器校驗(yàn)失敗了,則該字段上所有字段校驗(yàn)器都不會(huì)獲得校驗(yàn)的機(jī)會(huì)。

                  非字段校驗(yàn)器的校驗(yàn)失敗,不會(huì)阻止其他非字段校驗(yàn)的執(zhí)行。

                  如果一個(gè)字段校驗(yàn)器校驗(yàn)失敗后,則該字段下的且排在該校驗(yàn)失敗的校驗(yàn)器之后的其他字段校驗(yàn)器不會(huì)獲得校驗(yàn)的機(jī)會(huì)。

                  字段校驗(yàn)器永遠(yuǎn)不會(huì)阻止非字段校驗(yàn)器的執(zhí)行。

              Strut2的一個(gè)Action中可能包含多個(gè)處理邏輯,當(dāng)一個(gè)Action類包含多個(gè)類似于execute的方法時(shí),每個(gè)方法都是一個(gè)處理邏輯。不同的處理邏輯需要不同的校驗(yàn)規(guī)則,Struts2也提供了對(duì)不同Action指定不同校驗(yàn)規(guī)則的的支持。

              當(dāng)需要讓一個(gè)Action可以處理多個(gè)請(qǐng)求時(shí),需要配置多個(gè)邏輯的Action,如:


           

                  <action name="regist" class="com.struts.test.action.RegistAction">
                      
          <result name="input">/regist.jsp</result>
                      
          <result name="error">/error.jsp</result>
                      
          <result>/show.jsp</result>
                  
          </action>

                  
          <action name="login" class="com.struts.test.action.RegistAction" method="login">
                      
          <result name="input">/login.jsp</result>
                      
          <result name="error">/error.jsp</result>
                      
          <result>/show.jsp</result>
                  
          </action>

             

          posted on 2010-10-24 15:01 Brian 閱讀(361) 評(píng)論(0)  編輯  收藏 所屬分類: Struts2

          公告


          導(dǎo)航

          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統(tǒng)計(jì)

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 阿克苏市| 平顶山市| 阳谷县| 旺苍县| 甘谷县| 洛川县| 葫芦岛市| 鄯善县| 赤壁市| 屯门区| 来安县| 福泉市| 疏附县| 旅游| 资溪县| 团风县| 广元市| 越西县| 东乡族自治县| 滕州市| 金华市| 铜山县| 北宁市| 武平县| 木兰县| 台中县| 昭苏县| 湖南省| 芦溪县| 朔州市| 玛多县| 东兰县| 阿巴嘎旗| 孟连| 淄博市| 河源市| 辽阳县| 汕尾市| 桐庐县| 蓬莱市| 崇左市|