基於AJAX和JSF打造豐富的互連網組件之Mabon篇(1)

來源:互聯網
上載者:User

在上一篇文章中,我們討論了JSF組件創作者如何利用新的Webletshttp://weblets.dev.java.net)開源工程來提供資源服務—這些資源套件括直接來自於JAR中的JavaScript庫,表徵圖和CSS檔案—而不影響應用程式開發人員。

在本文中,我們將使用AJAX和JSF組件實現取回資料。使用AJAX取回資料最普通的情形是填充下拉式清單方塊並且為文本域添加輸入探測type-ahead)功能。與使用AJAX回寄機制操作事件相反,取資料不應該影響頁面中的周圍的其它組件。並且如果取資料不影響DOM樹的另外部分的話,那麼你不必僅為取得該資料而遍曆完整的JSF生命週期。

本文中將引入一種新的開源工程Mabonhttp://mabon.dev.java.net)。Mabon,代表託管Bean對象標誌,其目標是,通過使用一種JSON文法通訊通道,使得基於AJAX技術的JSF組件開發人員能夠從標準JSF生命週期之外來訪問JSF託管bean。

實質上,通過使用JSF規範所提供的託管bean工具,Mabon嚮應用程式開發人員提供了一種標準的容易的方式來為基於AJAX技術的JSF組件提供資料。

一、用AJAX技術取資料

常規的取資料方式與使用AJAX技術遵循相同的基本概念,而且不應該影響周圍其它組件的狀態。
圖1展示了一個使用HTTP GET方法的AJAX順序圖表。W3C推薦你使用HTTP GET方法來取資料;這時不會產生使用者請求所帶來的其它影響(例如,Google Suggest)。

 
圖1.一個使用HTTP GET方法的XMLHttpRequest的順序圖表

二、不同的JSF AJAX方法

如果你不想使用其它附加功能,那麼不必改變JSF組件層次,因此也不需要經曆整個JSF生命週期。但是,如果你想重用一個託管bean方法,那麼最容易的方式就是使用JSF MethodBinding工具。為此,存在三種方案:把功能添加到Renderer,使用一個PhaseListener以及提供一種新的JSF生命週期。

三、Renderer方法

Renderer方法把功能添加到螢幕產生器以檢測AJAX請求。JSF預設的生命週期首先在“Restore View”階段恢複組件層次,而在“Apply Request Values”階段Renderer獲得控制。在處理完AJAX請求後,Renderer調用FacesContext的responseComplete()方法來終止處理生命週期的剩下階段。從表面上來看,這似乎是一種更好的方法,但是它實際上存在一些嚴重的不足。

首先,這種方法要求有一個組件層次,這可能導致在每個請求中帶來其它額外開銷,特別是當使用用戶端狀態儲存功能時。僅當這一階段處理完之後,調用response-Complete()方法才起作用。這個“Apply Request Values”階段調用視圖中所有螢幕產生器上的decode()方法,這有可能導致不期望的超出控制的“副作用”,例如由應用程式開發人員把一個設定為immediate="true"。這將導致在“Apply Request Values”階段完成之前調用應用程式邏輯。

另外,這種方法通常需要使用HTTP POST來把狀態字串發送回伺服器端。

四、PhaseListener方法

這個PhaseListener方法添加一個PhaseListenerPhaseId.RESTORE_VIEW)—它“短路”生命週期並且完成在PhaseListener本身中的所有處理工作。此後,它要調用FacesContext的responseComplete()方法。

為使這種方法能夠工作,它必鬚生成一個包含在初始請求中有關使用託管bean資訊的引用。PhaseListener在回寄期間使用這個資訊以建立一個MethodBinding—然後,它被用於調用託管bean上的一個方法並且把資料返回到用戶端。既然沒有建立組件層次而且沒有螢幕產生器,那麼把immediate設定為true的命令組件就不會導致任何副作用。

但是,這種方法存在一個問題:無法防止應用程式開發人員在同一階段依附其它的PhaseListeners,這樣可能導致不希望的副作用。而且,你也無法知道這些PhaseListeners將以怎樣的順序執行。

五、生命週期方法

這個生命週期方法添加一個被映射到一個AJAX請求的新的生命週期並且僅包含需要處理請求的生命週期階段,調用由MethodBinding所定義的應用程式邏輯,並產生響應。這消除了建立和恢複組件樹的麻煩,因此不需要螢幕產生器。如果把immediate設定為true,你也不會遇到任何問題。

使用一種定製的生命週期的另一項優點是,由應用程式開發人員添加的任何PhaseListener對這種方案都將毫無影響;應用程式開發人員甚至能把PhaseListeners添加到這個定製的生命週期。然而,如果使用一個定製PhaseListener把其它託管beans加入到該請求上,那麼你可能遇到一些問題,除非它們也為此定製的生命週期進行了註冊。

六、選擇一種JSF AJAX方法

這裡,我們使用生命週期方法—既然它不會帶來應用程式邏輯副作用和其它開銷。在此,開源工程Mabon能夠協助你集中於你的支援AJAX技術的組件的設計。
讓我們解釋一下什麼是Mabon以及它為對AJAX資料回取感興趣的組件開發人員提供怎樣的支援圖2)。

 
圖2.Mabon類圖

七、什麼是Mabon?

Mabon提供了一種方便的方式來“鉤住”hook in)一種特別設計的生命週期—這特別適合於支援AJAX技術的組件—它必須從一個支援bean中直接取資料,而不需要浪費一個完整的JSF生命週期。它還提供了一種Mabon協議mabon:/)—用於引用支援bean和一個用於發送目標URL和任何需要的參數的JavaScript工具函數,然後非同步地從託管bean取回資料。

八、Mabon和JSON

正如你所知,XMLHttpRequest提供了兩種響應類型—responseText和responseXML—它們可以用於取回資料。你可能會問:我何時該使用哪一個?對這個問題的回答要依賴於是否你想自己控制響應的文法。
responseXML類型返回一個完整的DOM對象它為你提供很多種方式來遍曆DOM樹),這可以讓你尋找你所需要的資訊並且把變化應用到當前文檔中。當你的組件將響應周圍的元素並且你不想控制響應時例如,當你與一個Web服務進行通訊時),這是非常有用的。

九、MabonLifecycle類

MabonLifecycle由三部分組成:
ApplyRequestValuesPhase,InvokeApplicationPhase和RenderResponsePhase。MabonLifecycle負責執行這三個階段,它還負責處理任何依附到該MabonLifecycle上的PhaseListeners。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.