自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JSF和AJAX企業(yè)級(jí)開(kāi)發(fā)之路(二)

開(kāi)發(fā) 后端
本文介紹JSF和AJAX企業(yè)級(jí)開(kāi)發(fā)之路,以及為什么從設(shè)計(jì)的角度就要將JSF和AJAX整合在一起。

現(xiàn)在,更高級(jí)別的JSF和AJAX整合方式到來(lái)了。確切的說(shuō),這種更加容易使用的解決方案就是在使用JSF基礎(chǔ)上再加上AJAX擴(kuò)展。我上面已經(jīng)提到了,現(xiàn)在有很多的解決方案了,今天我要談?wù)摰氖瞧渲兄坏腜roject Dynamic Faces。當(dāng)你在使用這些解決方案時(shí),通常是不需要去了解任何JavaScript知識(shí)的,因?yàn)樗呀?jīng)為你封裝好JavaScript的編程實(shí)現(xiàn),你只需要正常使用JSF的API去編程,就能達(dá)到AJAX的效果。當(dāng)然,你如果需要的話(huà),Dynamic Faces也是允許你去手工編寫(xiě)JavaScript的,(通過(guò)自己編寫(xiě)的JavaScript)你可以實(shí)現(xiàn)更強(qiáng)大復(fù)雜的操作。據(jù)我所之Dynamic Faces是目前為止唯一一個(gè)可以正確處理JSF上下文敏感(context sensitive)的AJAX交互組件,原因是它充分利用了JSF1.2的優(yōu)勢(shì)(注:雖然專(zhuān)家組們?cè)谟懻揓SF2.0規(guī)范,但現(xiàn)在實(shí)際使用的JSF最新版本是1.2)?,F(xiàn)在我們來(lái)看一個(gè)demo,假設(shè)說(shuō)你有一個(gè)數(shù)據(jù)列表,當(dāng)你隨便碰到某個(gè)單元格時(shí)(注:類(lèi)似于操作Excel.當(dāng)我們?cè)谑褂肊xcel的時(shí)候,光標(biāo)所移動(dòng)到的任何單元?jiǎng)t都是可以隨便操作,并保存的),你想通過(guò)AJAX去處理你所指定的那個(gè)單元格時(shí),所有的單元格的在頁(yè)面渲染完后狀態(tài)都是可隨時(shí)存儲(chǔ)的,便于隨時(shí)修改,此時(shí)顯示在頁(yè)面的data table(數(shù)據(jù)表格)就是dataset所持有的數(shù)據(jù)呈現(xiàn)給外部的一個(gè)窗口;當(dāng)你在修改完data table的某行記錄或某行記錄中的某列后,想postback一下(注:postback指的是用戶(hù)返回到以前訪(fǎng)問(wèn)過(guò)的一個(gè)頁(yè)面,與頁(yè)面對(duì)應(yīng)的視圖已經(jīng)存在,所以只需恢復(fù)它。在這種情況下,JSF 使用現(xiàn)有視圖的狀態(tài)信息重新構(gòu)造它的狀態(tài)。)這時(shí)你需要將data table設(shè)置成自身,從而可以感知到改動(dòng)的數(shù)據(jù).JSF1.2已經(jīng)添加了一些新特性來(lái)支持這樣的應(yīng)用場(chǎng)合.這還得多虧我們的專(zhuān)家組成員Jacob Hookom,同時(shí)他也是Facelets的作者.(注:Facelets是用來(lái)建立JSF應(yīng)用程序時(shí)的一個(gè)可供選擇的表現(xiàn)層技術(shù))
  
我之所以為Dynamic Faces亮起紅燈(表示警告),是因?yàn)镴SF1.2有這個(gè)特性,它才能實(shí)現(xiàn)這個(gè)功能,而且還不是很成熟。雖然它現(xiàn)在當(dāng)已經(jīng)加入到Sun Web Developer Pack中去了,不過(guò)仍然處于0.1版本,與其它你可能聽(tīng)說(shuō)過(guò)的AJAX解決方案相比,缺乏大量的測(cè)試。
  
下一級(jí)別的的JSF和AJAX整合方案就是直接使用帶AJAX的JSF組件。用這類(lèi)組件,與使用普通的JSF組件沒(méi)有什么兩樣,實(shí)際上它們已經(jīng)將AJAX所做的事都全部為你封裝好了。這些組件也許會(huì)通過(guò)phase listener,filter或者其它什么配置來(lái)處理AJAX請(qǐng)求,但不需要你親自去處理?,F(xiàn)在已經(jīng)有一些不錯(cuò)的組件可以使用了,而且相當(dāng)一部分還支持JSF1.1。這些組件中,有些是開(kāi)源的,有些要付費(fèi)的,總之這是一個(gè)相當(dāng)大的市場(chǎng),你可以登錄www.jsfcentral.com,這是由另一名專(zhuān)家組成員Kito Mann運(yùn)作的,里面有很多非常優(yōu)秀的組件,并且你還可以從中了解目前JSF組件的市場(chǎng)行情。
 
退一步說(shuō),如果在眾多JSF組件中,仍然沒(méi)有讓你感到滿(mǎn)意的話(huà),你就得親自寫(xiě)代碼了,要不然用DynaFacesr擴(kuò)展也是可以的。
  
好了,到這里,當(dāng)我在考慮JSF整合AJAX這部分的時(shí)候,一個(gè)大難題浮現(xiàn)在我腦中:是應(yīng)該支持各種途徑去使用AJAX(比如說(shuō)允許自己編寫(xiě)客戶(hù)端代碼)呢,還是像通常的web應(yīng)用程序那樣,只采用UI標(biāo)簽方式呢?我的觀(guān)點(diǎn)是,不支持,沒(méi)有必要。關(guān)于這個(gè)點(diǎn)會(huì)在小組討論中談到。如果采用Dojo方式的話(huà),你的大量ViewLogic(頁(yè)面邏輯)綁定在客戶(hù)端上,這樣做也許只是將服務(wù)器變得負(fù)擔(dān)輕一些;而使用GWT的話(huà),你得將Java編譯成JavaScript代碼,但此時(shí)的JavaScript仍然運(yùn)行在客戶(hù)端,然后使用一個(gè)類(lèi)似于RMI的機(jī)制通過(guò)服務(wù)器端來(lái)來(lái)回回不停的調(diào)用。但以上這些只是考慮了客戶(hù)端這個(gè)方面!另一方面,你仍然可以使用基于服務(wù)端開(kāi)發(fā)工具,去開(kāi)發(fā)你的組件,然后markup(標(biāo)記)在服務(wù)端上,這樣就可以通過(guò)服務(wù)端呈現(xiàn)給客戶(hù)端,這一類(lèi)的解決方案的思想就是將UI組件的狀態(tài)保存在服務(wù)端.我也覺(jué)得無(wú)論從成熟度,相應(yīng)工具的支持程度還是可維護(hù)性上來(lái)說(shuō),這樣做都有很大的優(yōu)勢(shì).按照我的話(huà)來(lái)說(shuō),將大量的UI組件邏輯保存在服務(wù)器上,你會(huì)發(fā)現(xiàn)更加易去維護(hù).
 

因此,對(duì)于上述問(wèn)題的一種解決辦法是,把JSF當(dāng)作web應(yīng)用程序開(kāi)發(fā)的基礎(chǔ),并且你只需要在此基礎(chǔ)上略施小計(jì)就可以得到AJAX支持.JSF的AJAX擴(kuò)展就是這么實(shí)現(xiàn)的,我現(xiàn)在將一些熟悉的擴(kuò)展列出來(lái):Dynamic Faces,ICEfaces,AJAX for JSF(現(xiàn)在和JBoss搭上了伙,成為了RichFaces),BackBase還JackBe..總之,在www.jsfmatrix.net站點(diǎn)可以看到這些解決方案之間的比較.另一個(gè)不錯(cuò)的解決辦法來(lái)自于JCP,我們會(huì)將現(xiàn)在上面列出的那些擴(kuò)展中先進(jìn)的思想提交給JSF專(zhuān)家組,并且我們正準(zhǔn)做出更多的努力,但現(xiàn)在無(wú)法透露太多。(看來(lái)JCP的專(zhuān)家組們還是沒(méi)有改變辦事過(guò)于拖拉的毛病,因此估計(jì)官方的JSF和AJAX方案一時(shí)半會(huì)是出不來(lái)了。)
 

那么為什么從設(shè)計(jì)的角度就要將JSF和AJAX整合在一起呢?因?yàn)镴SF天生有著Swing的特性,如果你喜歡采用基于組件的面向?qū)ο蠓绞竭M(jìn)行編程,你會(huì)發(fā)現(xiàn)JSF的設(shè)計(jì)就是為AJAX而準(zhǔn)備的.一些JSF的特性使得AJAX變得更加友好并進(jìn)一步擴(kuò)展了JSF UI組件模型;一個(gè)建立在servlet之上,定義良好的請(qǐng)求處理生存周期(request processing life cycle)管理著WebRequest各種狀態(tài)(phase)下不同的生存周期,比起單純的request, response要豐富的多,甚至我感覺(jué)這一點(diǎn)在脫離JSF仍然十分有用.那就是我們打算讓JSF2.0應(yīng)用程序以更加偏重于client-centric方式,來(lái)貫穿整個(gè)JSF生存周期,甚至到時(shí)候要不要JSF組件都說(shuō)不定了,但驗(yàn)證和類(lèi)型轉(zhuǎn)換等這類(lèi)東西還是需要的.
  
另一個(gè)特性就是靈活和可擴(kuò)展的組件呈現(xiàn)模型(Rendering Model).Rendering的概念源于組件,你可以用render kits(套件)去豐富基于JavaScript的應(yīng)用程序,與HTML4.01相比,它的內(nèi)容更加豐富。各種各樣的render kits為你隱藏了復(fù)雜的底層細(xì)節(jié),幫助你實(shí)現(xiàn)網(wǎng)站的多種版本。這里還有一個(gè)關(guān)于封裝的概念:JavaScript的封裝不應(yīng)該交給頁(yè)面的編寫(xiě)人員,應(yīng)該交給組件開(kāi)發(fā)人員,最終所有的JSF組件統(tǒng)一管理在一起,更加方便透明的保持客戶(hù)端與服務(wù)器之間的同步。

現(xiàn)在我們來(lái)看一些典型的AJAX問(wèn)題與解答:

1.跨瀏覽器問(wèn)題,通過(guò)封裝好的JavaScript框架已經(jīng)很可做到這一點(diǎn)了

2.本地化和國(guó)際化問(wèn)題,用JSF就可以搞定了,AJAX根本不需要參與

3.Shell remoting的機(jī)制就是專(zhuān)門(mén)用來(lái)管理腳本,它用一種安全的方式為你的組件提供存放在class path外面的JavaScript腳本.

4.如果你覺(jué)得你寫(xiě)了太多的XMLHttpRequest來(lái)來(lái)回回與服務(wù)器進(jìn)行交互的話(huà),你可以使用Dynamic Faces的批處理事件(或找一個(gè)具備批處理事件的類(lèi)似替換物),一次性將所有的事件發(fā)送完成.

5.使用XML作為(AJAX與服務(wù)器交互后的返回的)傳輸數(shù)據(jù)的話(huà),要求對(duì)于某些HTML元素做一些額外的優(yōu)化工作.比如說(shuō),  是HTML的一個(gè)實(shí)體,但它在XML中卻什么都不是.當(dāng)XMLHttpRequest的responseXML包含 的話(huà),Mozilla瀏覽器將無(wú)法正常解析XML,它會(huì)認(rèn)為這是一個(gè)無(wú)效的實(shí)體,因此,我不知道你們是不是也覺(jué)得這算是Mozilla的一個(gè)Bug呢?此時(shí)你必要按照某種方式去定義那些東西,并且確保這類(lèi)問(wèn)題通過(guò)JSF和AJAX的方案來(lái)解決.

為現(xiàn)有的或即將立項(xiàng)的JSF應(yīng)用程序插上AJAX翅膀,我個(gè)人覺(jué)得對(duì)于應(yīng)用程序來(lái)說(shuō)非常棒.我想我們應(yīng)該可以做到讓一個(gè)已經(jīng)完成的項(xiàng)目AJAX化(AJAXify),并且如果是新的項(xiàng)目的話(huà),保證還能從中得到更多的好處.這一切還得再次得歸功Jacob Hookom天才的理念。我覺(jué)得他的Project Dynamic Faces為開(kāi)發(fā)人員朝著AJAX方向前進(jìn)了一小步.真的?。?!就兩個(gè)JSP Tag和兩個(gè)JavaScript Function需要你掌握,但就是這小小的一步,你也已經(jīng)可以從中得到很多AJAX特性了.
 
因此,這里有一個(gè)基本的概念.將JSF的生存周期通過(guò)AJAX暴露給瀏覽器,并且你想通過(guò)AJAX來(lái)操作整個(gè)View或其中的某個(gè)部分,從而達(dá)到更新一塊單獨(dú)的View區(qū)域或某個(gè)組件的目的,或者干脆越過(guò)AJAX來(lái)刷新整個(gè)頁(yè)面也能實(shí)現(xiàn)。有時(shí)候,你希望通過(guò)使用AJAX可以越過(guò)JSF的生存周期,來(lái)取得一些控制級(jí)別并且你還可以讓服務(wù)器(在不刷新頁(yè)面的情況下)來(lái)改變當(dāng)前頁(yè)面的外觀(guān)或行為.通常這對(duì)于Swing或其它native UI Tookit開(kāi)人員來(lái)說(shuō),很好理解:當(dāng)前窗體的部分外觀(guān)或行為被更新過(guò)了,服務(wù)器當(dāng)然只會(huì)去對(duì)那部分作一下修改,犯不著整個(gè)窗體都重新更新一遍?,F(xiàn)在將這個(gè)觀(guān)念帶回到Web開(kāi)發(fā)中來(lái),頁(yè)面的部分內(nèi)容或行為改變了,你重繪(repaint)一下不就得了。

【編輯推薦】

  1. JSF和Spring的集成
  2. JSF中使用自定義Navigation
  3. 簡(jiǎn)單介紹JSF應(yīng)用
  4. JSF動(dòng)態(tài)生成固定表頭和行標(biāo)的DataTable
  5. JSF和JSP是一對(duì)新的搭檔
責(zé)任編輯:佚名 來(lái)源: theserverside
相關(guān)推薦

2009-06-23 14:55:43

AJAX和JSF

2013-09-02 10:28:09

NoSQL

2010-08-04 15:20:15

Flex企業(yè)級(jí)開(kāi)發(fā)

2009-03-30 09:42:28

OSGiJavaJCP

2010-04-07 08:55:00

OSGiSpring

2011-12-06 14:02:27

企業(yè)級(jí)移動(dòng)開(kāi)發(fā)

2012-06-21 09:51:42

虛擬化

2009-12-14 20:13:57

IBM

2012-05-15 15:21:29

企業(yè)級(jí)

2015-08-21 09:06:53

SaaS

2013-12-08 21:16:21

BaaS企業(yè)級(jí)移動(dòng)移動(dòng)信息化

2017-03-21 10:22:09

移動(dòng)開(kāi)發(fā)

2011-07-05 14:07:36

2024-03-11 09:50:09

模型開(kāi)發(fā)

2009-06-23 10:17:09

Ajax事件和錯(cuò)誤JSF2

2011-06-30 10:49:27

2013-08-01 00:00:00

開(kāi)發(fā)企業(yè)級(jí)App出路

2013-11-01 09:25:19

大數(shù)據(jù)HadoopSpark

2009-06-25 14:05:08

Ajax JSF

2020-07-06 07:50:13

Redis開(kāi)發(fā)運(yùn)維
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)