Sun為什么會(huì)搞出一個(gè)JSF,JSF為什么會(huì)是現(xiàn)在這個(gè)樣子,我想原因是這樣的:首先,基于組件的Web開發(fā)將來(lái)會(huì)是一個(gè)趨勢(shì)。自包含的組件便于IDE的處理,可以提高開發(fā)效率。
就是說(shuō)JSF優(yōu)于Struts/WebWork這類MVC框架的優(yōu)勢(shì),在于它可以與IDE結(jié)合來(lái)自動(dòng)生成代碼。而傳統(tǒng)的純手工編寫的MVC框架,影響了開發(fā)效率。因?yàn)镴ava技術(shù)在客戶端并沒(méi)有明顯的優(yōu)勢(shì)。Applet已經(jīng)被拋棄掉,Java的強(qiáng)項(xiàng)在服務(wù)器端。Sun不可能跑去使用JavaScript,因?yàn)樵趥鹘y(tǒng)開發(fā)者眼里,JS只配做一點(diǎn)很瑣碎的任務(wù)。
于是在他們?cè)O(shè)計(jì)的這個(gè)架構(gòu)中,所有的用戶事件都放在了服務(wù)器端來(lái)處理,這個(gè)決策造成了JSF致命的缺點(diǎn)。它把事件處理模型綁死在服務(wù)器上,限制了響應(yīng)性更加靈敏的交互設(shè)計(jì)。隨之而來(lái)的網(wǎng)絡(luò)延遲會(huì)毀掉軟件的可用性。這也是Ajax在JSF的架構(gòu)中無(wú)法充分發(fā)揮作用的原因。
JSF的設(shè)計(jì)思路有點(diǎn)模仿VB,組件化的開發(fā)這個(gè)方向是沒(méi)錯(cuò)的,Ajax開發(fā)將來(lái)也會(huì)走這條路。但是JSF與VB最大的差別是VB的事件模型都是位于本地來(lái)處理的。這是一種本質(zhì)上的差別,所以如果JSF確實(shí)想模仿VB,那也是東施效顰。而且在JSF的設(shè)計(jì)階段,同步的請(qǐng)求/響應(yīng)是主流,他們的思路仍然牢牢束縛在基于頁(yè)面的開發(fā)方式上。根本就沒(méi)有思考過(guò)其他的可能。
異步請(qǐng)求/響應(yīng)是Ajax與傳統(tǒng)開發(fā)方式最大的差別,異步帶來(lái)了更好的交互設(shè)計(jì)。
在AjaxinAction第1章中作者舉了一個(gè)令人信服的例子。GoogleMaps中當(dāng)用戶滾動(dòng)地圖時(shí),獲取新的地圖圖片,由于是異步請(qǐng)求的,因此不會(huì)打斷用戶的操作流程。而在傳統(tǒng)的地圖服務(wù),每次滾動(dòng)可能都需要刷新頁(yè)面。用一下微軟的那個(gè)地圖服務(wù)就可以感覺(jué)到明顯的差距,它甚至根本就不允許用戶滾動(dòng)地圖。
以前我說(shuō)GoogleMaps不是Ajax,因?yàn)闆](méi)有使用XMLHttpRequest,這樣說(shuō)看來(lái)理解有些狹隘。GoogleMaps請(qǐng)求地圖的圖片,采用的是修改動(dòng)態(tài)創(chuàng)建的img元素的src屬性的方式,這樣的請(qǐng)求不會(huì)打斷用戶的操作,因此就是異步的。我們?cè)贏jaxinAction中看到作者將GoogleMaps當(dāng)作Ajax應(yīng)用,而在PragmaticAjax中作者說(shuō)GoogleMaps不是嚴(yán)格意義上的Ajax,兩種說(shuō)法都有道理。
JSF其實(shí)如果和Applet結(jié)合,可能更好些。Applet是多線程的,可以捕獲用戶的操作事件,采用異步方式發(fā)送到服務(wù)器。這樣就不會(huì)打斷用戶的操作了。但是這樣一來(lái)設(shè)計(jì)的這個(gè)架構(gòu)就復(fù)雜了。而且Applet是已經(jīng)決定拋棄的東西。JSF和JavaWebStart結(jié)合也可以,不過(guò)JWS設(shè)計(jì)用來(lái)建造一類完全不同的Web應(yīng)用,即RichClient,而不是設(shè)計(jì)用來(lái)建造運(yùn)行于瀏覽器之內(nèi)的RIA應(yīng)用。所以JSF最多只是一種過(guò)渡方案,在Ajax/Flash的競(jìng)爭(zhēng)下早已風(fēng)光不在。
未來(lái)基于瀏覽器的RIA開發(fā),Ajax、Flash是兩種最有前途的技術(shù)。
按照澤欣的判斷可能是三分天下,Ajax、Flash/Flex/Laszlo、還有M$的Atlas。Atlas是M$開發(fā)的類似于Flash的一種技術(shù),目前還只是一個(gè)vaporware,沒(méi)有看到其廬山真面目。JavaWebStart相比之下只能局限于一些內(nèi)部應(yīng)用。
將來(lái)位于客戶端的表現(xiàn)層開發(fā)可能會(huì)完全沒(méi)有Java的位置,這是Sun不愿意看到的,但是Sun在這場(chǎng)角逐中只不過(guò)是一個(gè)小角色?!?
{{item.content}}