贏在執(zhí)行

          這個(gè)世界上只有兩樣?xùn)|西愈分享愈多,那就是智慧與愛(ài)。

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            17 Posts :: 11 Stories :: 13 Comments :: 0 Trackbacks
          Struts2的Ajax輸入校驗(yàn)   文章指數(shù):0  CSDN Blog推出文章指數(shù)概念,文章指數(shù)是對(duì)Blog文章綜合評(píng)分后推算出的,綜合評(píng)分項(xiàng)分別是該文章的點(diǎn)擊量,回復(fù)次數(shù),被網(wǎng)摘收錄數(shù)量,文章長(zhǎng)度和文章類(lèi)型;滿分100,每月更新一次。

              這段時(shí)間在研究Struts2,學(xué)習(xí)資料是新上市的李剛著的《Struts2權(quán)威指南》,很不錯(cuò)的一本書(shū),看了覺(jué)得收獲很大。剛研究完Struts2中的Ajax輸入校驗(yàn),并做了一些例子,現(xiàn)總結(jié)如下:


              Ajax的輸入校驗(yàn)不是客戶端校驗(yàn),而是服務(wù)器端校驗(yàn),但這種服務(wù)器端校驗(yàn)是以異步方式進(jìn)行的,瀏覽者無(wú)需顯示提交請(qǐng)求,當(dāng)瀏覽者輸入完成后,系統(tǒng)自動(dòng)完成校驗(yàn)。Struts2的Ajax校驗(yàn)建立在DWR和Dojo兩個(gè)框架之上,其中DWR負(fù)責(zé)實(shí)現(xiàn)在JavaScript中調(diào)用遠(yuǎn)程Java方法,而Dojo則負(fù)責(zé)實(shí)現(xiàn)頁(yè)面效果的實(shí)現(xiàn)。
          一. 配置DWR的核心Servlet
          DWR是Java領(lǐng)域的Ajax框架,它允許客戶端JavaScript代碼直接調(diào)用服務(wù)器端的Java方法,而這個(gè)過(guò)程是通過(guò)一個(gè)核心Servlet的轉(zhuǎn)換來(lái)實(shí)現(xiàn)的。為了讓DWR的核心Servlet起作用,必須在web.xml文件中配置該核心Servlet。配置DWR的核心Servlet的配置片段如下:
          <!-- 配置Struts2的核心Servlet -->
          <servlet>
          <servlet-name>dwr</servlet-name>
          <!-- 指定Servlet的實(shí)現(xiàn)類(lèi) -->
           <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
           <!-- 指定處于開(kāi)發(fā)階段 -->
           <init-param>
              <param-name>debug</param-name>
              <param-value>true</param-value>
           </init-param>
          </servlet>
          <!-- 指定DWR的核心Servlet攔截的URL -->
          <servlet-mapping>
           <servlet-name>dwr</servlet-name>
           <url-pattern>/dwr/*</url-pattern>
          </servlet-mapping>
          在上面配置文件中增加了DWR的核心Servlet后,該Servlet負(fù)責(zé)將服務(wù)器端的Java方法暴露出來(lái)。到底那些Java方法需要被暴露出來(lái),通過(guò)在dwr.xml配置文件中指定即可,因此需要在本應(yīng)用中增加一個(gè)dwr.xml文件。
          提示:此處并不許需要開(kāi)發(fā)者自己開(kāi)發(fā)Ajax應(yīng)用,并不需要開(kāi)發(fā)者利用DWR框架,我們只需利用Struts2對(duì)DWR的封裝即可。因此,只需在Web應(yīng)用的WEB-INF路徑下增加dwr.xml文件即可,而且dwr.xml文件的代碼也是固定的:
          <!DOCTYPE dwr PUBLIC
           "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
           " <dwr>
           <!-- 定義所有需要被暴露的Java方法 -->
               <allow>
            <!-- 定義將org.apache.struts2.validators.DWRValidator創(chuàng)建成一個(gè)validator對(duì)象 -->
                   <create creator="new" javascript="validator">
                       <param name="class" value="org.apache.struts2.validators.DWRValidator"/>
                   </create>
            <!-- 定義一個(gè)轉(zhuǎn)換器 -->
                   <convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/>
               </allow>
               <signatures>
                  <![CDATA[
                  import java.util.Map;
                  import org.apache.struts2.validators.DWRValidator;
                  DWRValidator.doPost(String, String, Map<String, String>);
                  ]]>
               </signatures>
          </dwr>
          在上面配置文件中,將org.apache.struts2.validators.DWRValidator類(lèi)創(chuàng)建成一個(gè)JavaScript對(duì)象,這個(gè)對(duì)象名為validator。當(dāng)然,這里所說(shuō)的創(chuàng)建是假創(chuàng)建,因?yàn)镴ava類(lèi)是無(wú)法創(chuàng)建JavaScript對(duì)象,但DWR提供一種方式,允許當(dāng)我們?cè)诳蛻舳苏{(diào)用validator的方法時(shí),轉(zhuǎn)換成調(diào)用DWRValidator實(shí)例的方法。
          提示:關(guān)于DWR的運(yùn)行原理和使用細(xì)節(jié),請(qǐng)讀者參考筆者所著的《基于J2EE的Ajax寶典》一書(shū)。此處由于篇幅管理,無(wú)法詳述DWR的用法和細(xì)節(jié)。
          實(shí)際上,對(duì)于一個(gè)Struts2的開(kāi)發(fā)者而言,無(wú)需理會(huì)這些實(shí)現(xiàn)細(xì)節(jié),因?yàn)镾truts2已經(jīng)為我們提供了這些封裝,我們只需要在Struts2封裝的基礎(chǔ)上進(jìn)行開(kāi)發(fā)即可。
          值得指出的是,為了讓W(xué)eb應(yīng)用增加DWR支持,顯然還需要將DWR的二進(jìn)制包復(fù)制到Web應(yīng)用中。即使對(duì)于Struts2.0.6正式版,依然不支持DWR的的最新版本(DWR的最新版本是2.0.1),因此只能使用DWR的前一個(gè)正式版1.1.3,將dwr-1.1.3.jar文件復(fù)制到Web應(yīng)用中即可。
          提示:由于Struts2發(fā)行版中并未包含DWR二進(jìn)制文件。因此,dwr-1.1.3.jar文件必須到DWR的官方站點(diǎn)(
          http://getahead.ltd.uk/dwr/)自行下載。

          二. 設(shè)置頁(yè)面的Ajax主題
          正如前面已經(jīng)提到的,實(shí)現(xiàn)Ajax交互必須在頁(yè)面中導(dǎo)入Ajax風(fēng)格的controlheader.ftl,這個(gè)控件負(fù)責(zé)當(dāng)每個(gè)輸入組件失去焦點(diǎn)時(shí),將輸入結(jié)果發(fā)送到服務(wù)器端進(jìn)行校驗(yàn)。
          為了實(shí)現(xiàn)Ajax校驗(yàn),還需要將表單設(shè)置成Ajax主題,并且設(shè)置validate="true"。下面是本示例應(yīng)用中regist.jsp頁(yè)面的代碼:
          <%@ page language="java" contentType="text/html; charset=GBK"%>
          <!-- 導(dǎo)入Struts2標(biāo)簽庫(kù) -->
          <%@taglib prefix="s" uri="/struts-tags"%>
          <html>
          <head>
          <title>請(qǐng)輸入您的注冊(cè)信息</title>
          <!-- 導(dǎo)入Ajax主題的controlheader.ftl -->
          <s:head theme="ajax"/>
          </head>
          <body>
          <H1>請(qǐng)輸入您的注冊(cè)信息</H1>
          <!-- 設(shè)置表單使用Ajax主題,并且設(shè)置validate="true" -->
          <s:form action="regist" theme="ajax" validate="true">
           <s:textfield name="name" label="作者名"/><br>
           <s:textfield name="pass" label="密碼"/>
           <s:textfield name="age" label="年齡"/>
           <s:textfield name="birth" label="生日"/>
           <s:submit value="注冊(cè)"/>
          </s:form>
          </body>
          </html>
          在上面的表單被設(shè)置成Ajax主題(這將意味著該表單是一個(gè)遠(yuǎn)程表單),并且設(shè)置了validate="true"屬性。一旦完成了上面設(shè)置后,當(dāng)某個(gè)輸入組件失去焦點(diǎn)時(shí),系統(tǒng)會(huì)負(fù)責(zé)將輸入內(nèi)容發(fā)送到服務(wù)器端進(jìn)行校驗(yàn)。

          三. 設(shè)置校驗(yàn)規(guī)則
          對(duì)于使用Ajax校驗(yàn)的Action類(lèi),與基本校驗(yàn)的Action類(lèi)并沒(méi)有太大的不同之處。但必須指出:盡量不要重寫(xiě)Action類(lèi)的validate方法,重寫(xiě)該方法來(lái)完成Ajax校驗(yàn)可能出現(xiàn)一些未知異常(這可能是Struts2還需要完善的地方)。
          注意:不同通過(guò)重寫(xiě)validate方法來(lái)完成Ajax校驗(yàn)。
          為了完成輸入校驗(yàn),我們通過(guò)定義自己的校驗(yàn)規(guī)則文件來(lái)完成輸入校驗(yàn),本輸入校驗(yàn)文件使用字段校驗(yàn)器風(fēng)格來(lái)配置校驗(yàn)規(guī)則。下面是校驗(yàn)文件的代碼:
          文件,該文件指定了Action的屬性必須滿足怎樣的規(guī)則,下面是該應(yīng)用中Action的校驗(yàn)文件的代碼。
          <?xml version="1.0" encoding="GBK"?>
          <!-- 指定校驗(yàn)配置文件的DTD信息 -->
          <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
           " <!-- 校驗(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ù)組,且長(zhǎng)度必須在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ù)組,且長(zhǎng)度必須在4到25之間</message>
            </field-validator>
           </field>
           <!-- 指定age屬性必須在指定范圍內(nèi)-->
           <field name="age">
            <field-validator type="int">
             <param name="min">1</param>
             <param name="max">150</param>
             <message>年紀(jì)必須在1到150之間</message>
            </field-validator>
          </field>
           <!-- 指定birth屬性必須在指定范圍內(nèi)-->
           <field name="birth">
            <field-validator type="date">
             <!-- 下面指定日期字符串時(shí),必須使用本Locale的日期格式 -->
             <param name="min">1900-01-01</param>
             <param name="max">2050-02-21</param>
             <message>年紀(jì)必須在${min}到${max}之間</message>
            </field-validator>
           </field>
          </validators>
          實(shí)際上,這份校驗(yàn)文件與之前進(jìn)行基本校驗(yàn)的校驗(yàn)文件并沒(méi)有太大的區(qū)別。這也證明了Struts2框架的簡(jiǎn)單、易用。
          完成上面定義后,如果瀏覽者在輸入頁(yè)面中輸入用戶名,將焦點(diǎn)移到密碼輸入框時(shí),將看到Ajax校驗(yàn)效果。


          Feedback

          # re: Struts2的Ajax輸入校驗(yàn) [未登錄](méi) 2008-05-06 09:35 過(guò)客
          你這是總結(jié)嗎?直接把書(shū)上的內(nèi)容打進(jìn)電腦上了.  回復(fù)  更多評(píng)論
            

          # re: Struts2的Ajax輸入校驗(yàn) 2008-05-27 17:51 小騙子
          校驗(yàn)是校驗(yàn)了,那校驗(yàn)后信息提示信息的位置怎么設(shè)置?
            回復(fù)  更多評(píng)論
            

          # re: Struts2的Ajax輸入校驗(yàn) 2008-09-30 18:03 ffff
          暈了,李剛的書(shū)。一字不差。就是不能用  回復(fù)  更多評(píng)論
            

          # re: Struts2的Ajax輸入校驗(yàn) [未登錄](méi) 2009-01-17 10:07 anson
          試試!那有電子書(shū)阿?
            回復(fù)  更多評(píng)論
            

          # re: Struts2的Ajax輸入校驗(yàn) 2009-02-25 18:19 kao
          這樣有意思嗎?無(wú)聊
          照抄  回復(fù)  更多評(píng)論
            

          # re: Struts2的Ajax輸入校驗(yàn) 2009-02-26 22:22 樓主是個(gè)托
          是李剛的一個(gè)書(shū)托  回復(fù)  更多評(píng)論
            

          # re: Struts2的Ajax輸入校驗(yàn) [未登錄](méi) 2009-04-04 20:19 java
          不看還好,一看就來(lái)氣。這本書(shū)不適合初學(xué)者,該舉例子的時(shí)候一筆帶過(guò)。總是使用前面的例子來(lái)對(duì)后面的進(jìn)行說(shuō)明,沒(méi)有考慮讀者根本不會(huì)將例子記住。所以不得不不斷翻閱前面的內(nèi)容。而且對(duì)路徑問(wèn)題含糊不清,源代碼不全。可能適合有一定基礎(chǔ)的人,但對(duì)初學(xué)者來(lái)說(shuō),只會(huì)耽誤跟多時(shí)間1  回復(fù)  更多評(píng)論
            

          # re: Struts2的Ajax輸入校驗(yàn) 2011-07-22 15:12 阿斯頓發(fā)
          只使用于struts2.0版本,2.1以后的不能用  回復(fù)  更多評(píng)論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 亚东县| 胶南市| 永嘉县| 昌宁县| 崇文区| 讷河市| 临高县| 靖州| 杭锦旗| 柳州市| 中卫市| 周宁县| 宁乡县| 增城市| 息烽县| 泗水县| 怀宁县| 武平县| 邻水| 乐至县| 南安市| 阿拉善右旗| 永登县| 仙桃市| 全南县| 定西市| 临沂市| 甘泉县| 平湖市| 深州市| 易门县| 江门市| 九龙城区| 荣昌县| 股票| 赣榆县| 叙永县| 当雄县| 永善县| 彭山县| 黔江区|