當(dāng)柳上原的風(fēng)吹向天際的時(shí)候...

          真正的快樂(lè)來(lái)源于創(chuàng)造

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

           

           

           

           

           

           

          TeamBiz中Ajax的基本運(yùn)用

           

           

           

           

           

           

           

          作者:何楊

          撰寫(xiě)日期:2012年2月23日

          版本:1.03

          更新日期:2012年2月28日

           

           

          第一部分:功能說(shuō)明

          提供前臺(tái)頁(yè)面到后臺(tái)程序的異步請(qǐng)求響應(yīng)通道。

          第二部分:核心組件

          名稱

          路徑

          說(shuō)明

          Prototype1.6.0.3

          teambiz\WebRoot\page\js\prototype-1.6.0.3.js

          Prototype是一個(gè)有歷史的JS類庫(kù),TeamBiz中主要使用了它的Ajax部分及$函數(shù)。

          注意,Teambiz并非對(duì)Prototype產(chǎn)生依賴,Prototype為Teambiz提供的僅是Ajax.Rquest對(duì)象及$函數(shù)而已,因?yàn)閠eambiz已經(jīng)包含了普適版本的$函數(shù),因此換用別的JS框架并不困難。

          AjaxAction

          teambiz\src\com\ibm\heyang\action\base\AjaxAction.java

          AjaxAction是所有響應(yīng)Ajax異步請(qǐng)求的Action的基類,它主要提供以下四項(xiàng)功能:

          1.設(shè)置Response;

          2.將url中的請(qǐng)求參數(shù)解碼后放入RequestParamMap對(duì)象中;

          3.強(qiáng)制子類實(shí)現(xiàn)函數(shù)process;

          4.當(dāng)子類的process函數(shù)中出現(xiàn)異常時(shí),接受異常并包裝成XML傳給前臺(tái)頁(yè)面。

          RequestParamMap

          teambiz\src\com\ibm\heyang\action\base\RequestParamMap.java

          RequestParamMap內(nèi)部包含一個(gè)哈希表,以鍵值對(duì)的方式存儲(chǔ)前臺(tái)URL中的參數(shù)及其值。

          RequestParamMap對(duì)象的生成在于AjaxAction的getRequestParamMap函數(shù)中。

          它主要提供以下功能:

          1.將參數(shù)集約化,此舉能簡(jiǎn)化后臺(tái)函數(shù)的編寫(xiě)。

          2.當(dāng)后臺(tái)函數(shù)使用其內(nèi)部不存在的參數(shù)時(shí),它能自主拋出一個(gè)異常,通過(guò)AjaxAction的包裝傳給前臺(tái),使得編寫(xiě)函數(shù)的程序員能快速進(jìn)行錯(cuò)誤定位。

          3.對(duì)前臺(tái)編寫(xiě)的參數(shù)進(jìn)行UTF-8解碼,此舉與前臺(tái)對(duì)URL進(jìn)行兩次UTF8編碼配合,統(tǒng)一解決了非ASC碼字符傳送產(chǎn)生亂碼的問(wèn)題。

          Ajax.Request

          定義于prototype-1.6.0.3.js中

          Prototype中定義的Ajax請(qǐng)求對(duì)象,其參數(shù)有四個(gè),URL,請(qǐng)求方法,成功函數(shù)和失敗函數(shù)。相對(duì)于傳統(tǒng)方式,它的可控性更高。

           

          第三部分:前臺(tái)和后臺(tái)的約定

          考慮到代碼解讀和人工解讀的雙重便利性,TeamBiz采用XML而不是JSON作為前后臺(tái)數(shù)據(jù)的載體,此XML采用了一些約定以規(guī)范化編碼。

          Ajax異步調(diào)用過(guò)程中,后臺(tái)需要兩組數(shù)據(jù)來(lái)說(shuō)明響應(yīng)細(xì)節(jié),一個(gè)是狀態(tài),如果它的值是OK的話,說(shuō)明已經(jīng)取得了請(qǐng)求想要的數(shù)據(jù),此時(shí)向前臺(tái)傳出的XML會(huì)類似如下格式:

          <response>

          <status>ok</status>

          <node>

          <a>a</a>

          <b>b</b>

          </node>

          </response>

          如果它的值是NG的話,說(shuō)明后臺(tái)能響應(yīng),但由于某種原因(用戶未登錄,用戶缺乏權(quán)限,參數(shù)缺失,后臺(tái)組件尚未就緒,異常拋出等,前二者需要程序員編碼,后兩者框架已經(jīng)代為實(shí)現(xiàn)),不能傳回請(qǐng)求想要的數(shù)據(jù),此時(shí)向前臺(tái)傳出的XML會(huì)類似如下格式:

           

          <response>

          <status>ng</status>

          <text>請(qǐng)登錄后再來(lái)執(zhí)行此操作</text>

          </response>

           

          后臺(tái)進(jìn)行如上約定后,前臺(tái)就可以采用如下統(tǒng)一的格式來(lái)處理XHR響應(yīng):

          new Ajax.Request(url,{    

                     method:'get',    

                     onSuccess: function(ajaxObj){   

                                  // alert(ajaxObj.responseText);   // 這里不要隨意刪去,有時(shí)需要打開(kāi)屏蔽以觀察后臺(tái)傳來(lái)的XML文本                   

                          var status=ajaxObj.responseXML.getElementsByTagName("status")[0].firstChild.data;

                                                                                                         

                                                          if(status=="ok"){

                                                                      ....// 狀態(tài)為ok時(shí)的處理

                                                          }

                                                          else{

                                                                      ....// 狀態(tài)為ng時(shí)的處理

                                                          }

                     },    

                     onFailure: function(){

                                                          ....// 后臺(tái)沒(méi)有響應(yīng)時(shí)的處理

                     }  

                  }

          );

           

          第四部分:使用步驟

          步驟

          說(shuō)明

          參照

          在前臺(tái)編寫(xiě)向后臺(tái)發(fā)出請(qǐng)求的JS函數(shù)。

          在此函數(shù)需要進(jìn)行三件事:

          1.編寫(xiě)URL。

          2.對(duì)URL進(jìn)行UTF8編碼。

          3.會(huì)使用一個(gè)Ajax.Request對(duì)象向后臺(tái)發(fā)出請(qǐng)求。

          teambiz\WebRoot\page\js\common.js中fetchMenuFromBg函數(shù)。

          在后臺(tái)編寫(xiě)響應(yīng)前端請(qǐng)求的Action

          Action需要繼承自AjaxAction。在其process函數(shù)中主要進(jìn)行以下三件事:

          1.權(quán)限驗(yàn)證。

          2.使用后端組件取得前端想要的數(shù)據(jù)。

          3.以XML方式將數(shù)據(jù)傳回。

          teambiz\src\com\ibm\heyang\action\menu\FetchMenuAction.java

          struts-config.xml注冊(cè)Action

          由于完全不需要靜態(tài)或動(dòng)態(tài)的form,此Action格式很簡(jiǎn)單,僅包含path,type和scope三部分。

          teambiz\WebRoot\WEB-INF\struts-config.xml中的

          <action path="/FetchMenu" type="com.ibm.heyang.action.menu.FetchMenuAction" scope="request" >

          </action>

           

          第五部分:小結(jié)

          TeamBiz中全部向后臺(tái)的請(qǐng)求都是通過(guò)Ajax異步方式實(shí)現(xiàn)的,相對(duì)于傳統(tǒng)方式,它有以下優(yōu)勢(shì):

          1.由于只需要提取必要的資源,因此占用資源少。

          2.有多種狀態(tài),多個(gè)函數(shù)用來(lái)處理后臺(tái)的響應(yīng),這使得控制更加多樣化。

          3.由于前臺(tái)在請(qǐng)求時(shí)處于靜止?fàn)顟B(tài),因此無(wú)需刻意保存前臺(tái)頁(yè)面數(shù)據(jù)。

          4.由于不需要編寫(xiě)form,forward等元素,使得控制文件編寫(xiě)簡(jiǎn)單方便。

          posted on 2012-02-29 10:31 何楊 閱讀(228) 評(píng)論(0)  編輯  收藏 所屬分類: Teambiz
          主站蜘蛛池模板: 肥西县| 沁源县| 塔城市| 龙南县| 罗定市| 平湖市| 临猗县| 那坡县| 黄浦区| 山阳县| 隆林| 龙胜| 商都县| 曲周县| 民乐县| 墨竹工卡县| 满城县| 岳普湖县| 买车| 台湾省| 论坛| 龙山县| 武冈市| 台安县| 永宁县| 英德市| 云霄县| 麻阳| 兰溪市| 包头市| 福建省| 馆陶县| 湖北省| 堆龙德庆县| 浏阳市| 连平县| 香格里拉县| 左云县| 河曲县| 张家口市| 郁南县|