国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
JavaEE 不再需要 Ajax? 扯淡還是有理? - [Matrix - 與 Java ...
chris 發(fā)表于 2007-03-20 00:39:08 作者:袁紅崗     來源:袁紅崗
評(píng)論數(shù):23     點(diǎn)擊數(shù):1,097

摘要:

即使Ajax的狂熱Fans也不得不承認(rèn)的是,從技術(shù)層面上來說,Ajax并沒有帶來什么新鮮的東西。它本質(zhì)上是一種新瓶裝舊酒的技術(shù),好處是通過Java Script與DHTML提供了一種異步編程模型,從而使Web應(yīng)用給客戶帶來了更好的人機(jī)體驗(yàn)。
3年前,“Spring之父”Rod.Johnson寫了一本在Java界引起轟動(dòng)的書:《Expert One-on-One J2EE Development Without EJB》。這本書闡述了EJB作為J2EE核心技術(shù)所帶來的意義與價(jià)值,但作者用了更大篇幅介紹EJB的一些缺陷與不足,并提出了Without EJB的解決方案。正是由于“J2EE Without EJB”這個(gè)激動(dòng)人心的口號(hào)及這本書奠定的基礎(chǔ),導(dǎo)致了Spring Framework這個(gè)經(jīng)典輕量級(jí)框架的誕生。

2年前,Ajax開始進(jìn)入人們的視野。時(shí)至今日,Ajax已經(jīng)成為一個(gè)紅得發(fā)紫的技術(shù)。但是今天,我想說一句:JavaEE without Ajax。


Ajax的“原罪”

Ajax為什么這樣紅?有人說,是因?yàn)槠鹆藗€(gè)好聽易記的名字(比如荷蘭著名的Ajax球隊(duì),即阿賈克斯);也有人說,是因?yàn)镚oogle全新的Ajax應(yīng)用產(chǎn)品給人們帶來的超酷體驗(yàn)(比如偉大的Google Maps、GMail等)。確實(shí)如此,Ajax能夠如此流行的最主要原因就是它帶來了更好的用戶體驗(yàn),改變了人們對(duì)傳統(tǒng)Web應(yīng)用的不佳印象。

然而,即使Ajax的狂熱Fans也不得不承認(rèn)的是,從技術(shù)層面上來說,Ajax并沒有帶來什么新鮮的東西。它本質(zhì)上是一種新瓶裝舊酒的技術(shù),好處是通過Java Script與DHTML提供了一種異步編程模型,從而使Web應(yīng)用給客戶帶來了更好的人機(jī)體驗(yàn)。正如我在去年引起大家爭(zhēng)論的拙文《Ajax,只是一種過渡技術(shù)》中表述的:Ajax解決問題的層面較低?;蛘哒f,它解決問題的方法與手段,很難形成一種可高度抽象的框架級(jí)解決方案。并且,正是因?yàn)锳jax基于Java Script,因此不可避免地帶來了Java Script的諸多缺點(diǎn),譬如:

跨瀏覽器是一場(chǎng)噩夢(mèng)

對(duì)搜索引擎的支持不好

干掉了Back、History等按鈕(盡管我并不認(rèn)為Back、History是什么好東西)

開發(fā)與維護(hù)成本過高

要Java, 不要Java Script

We Love Java, Not Java Script。套用毛澤東的慣用句式就是:“要Java, 不要Java Script”。相信很多讀者看完這個(gè)標(biāo)題也許會(huì)不以為然,但這句話卻代表了許多J2EE開發(fā)人員的心聲。

眾多Java工程師都對(duì)Java有一種近乎偏執(zhí)的喜愛,他們熱愛Java的簡(jiǎn)潔與優(yōu)雅。但一旦讓他們?nèi)ミM(jìn)行Java Script的開發(fā),卻往往會(huì)不知所措:過度靈活的語(yǔ)法,無(wú)法通過編譯器進(jìn)行語(yǔ)法校驗(yàn),缺乏良好的調(diào)試工具等等這些,都會(huì)讓人們對(duì)Java Script畏手畏腳,更遑論Ajax的開發(fā)。

一句話,Java社區(qū)需要Ajax,需要它來提升基于JavaEE的Web應(yīng)用的人機(jī)體驗(yàn);但是,人們并不喜歡Ajax目前的開發(fā)模式。無(wú)疑,我們需要一種新的解決方案。



誰(shuí)來拯救JavaEE的Ajax?

我給出的答案是JSF。目前,關(guān)于JSF的一種流行說法是“悲劇人生:Sun讓JSF光著身子降臨到Java Web世界”。然而,我的看法卻是:作為一種革命性的服務(wù)器端組件技術(shù),JSF猶如早晨八九點(diǎn)鐘的太陽(yáng),前途不可限量。

讓事實(shí)說話,我們先來看看JSF請(qǐng)求/響應(yīng)過程的標(biāo)準(zhǔn)生命周期


圖1:JSF的生命周期



通過上圖可以觀察到,任何一個(gè)JSF“Faces Request” 請(qǐng)求,經(jīng)過Restore View、Apply Request Values、Process Validations、Update Models、Invoke Application等階段以后,產(chǎn)生了一個(gè) “Render Response” 返回給客戶端。那么,常規(guī)JSF引擎是如何實(shí)現(xiàn)上述過程的呢?


圖2:常規(guī)JSF引擎的請(qǐng)求與響應(yīng)過程



回顧一下常規(guī)JSF引擎針對(duì)請(qǐng)求與響應(yīng)的過程:首先,客戶端請(qǐng)求某個(gè)資源,產(chǎn)生一個(gè)Faces Request;服務(wù)器端接收到此請(qǐng)求以后,經(jīng)過一系列后臺(tái)處理,產(chǎn)生一個(gè)Faces Response。我們注意到:響應(yīng)的Content-Type是text/html,而產(chǎn)生的內(nèi)容主體是一段HTML文本;瀏覽器在接收到HTML文本以后,進(jìn)行整個(gè)頁(yè)面的渲染與刷新。


無(wú)需寫Ajax代碼的Ajax Enabled應(yīng)用

我用自己開發(fā)的JSF引擎,這樣處理上述過程(詳見參考資料www.OperaMasks.org ),如下圖所示:


圖3:OperaMasks JSF實(shí)現(xiàn)的請(qǐng)求與響應(yīng)過程


首先可以觀察到,F(xiàn)aces Request的發(fā)出是基于“x-requested-by: XML Http Request”,也就是說,這是一個(gè)Ajax請(qǐng)求,而該請(qǐng)求在到達(dá)服務(wù)器端以后,服務(wù)器端所產(chǎn)生的Faces Response同常規(guī)Faces Response相比也發(fā)生了變化:Content-Type不再是text/html,變成了text/javascript;并且,響應(yīng)的主體也不再是html文本,而是一堆script腳本。瀏覽器在接收到響應(yīng)以后,再也不需要進(jìn)行整個(gè)頁(yè)面的渲染與刷新,而只僅僅需要執(zhí)行這段腳本內(nèi)容,將頁(yè)面的控件進(jìn)行更新即可。

顯而易見,通過上述JSF技術(shù),我們獲得了:

基于Ajax的請(qǐng)求、應(yīng)答、及頁(yè)面控件的更新

數(shù)據(jù)傳輸量明顯減少

避免整個(gè)頁(yè)面的刷新,更好的用戶體驗(yàn)

系統(tǒng)保持敏捷、高效



換言之:任何標(biāo)準(zhǔn)JSF應(yīng)用,只需將其在OperaMasks JSF引擎上運(yùn)行,就可以達(dá)到這樣的效果。我們并沒有寫任何一行Ajax的代碼,但是,我們的應(yīng)用卻是自然而然的Ajax Enabled的應(yīng)用。大道至簡(jiǎn),大象無(wú)形。



奧妙所在:JSF的Render機(jī)制

為什么可以這樣?

JSF組件只是特定狀態(tài)和行為的載體,而組件以什么形式去和用戶交互,是完全可定制的、獨(dú)立于該特定的表現(xiàn)語(yǔ)言,可以是HTML、WML或者其他形式;具體是什么,可以通過指定JSF組件的Render Kit來實(shí)現(xiàn),而每一種Render Kit,對(duì)應(yīng)于組件作者寫的同一風(fēng)格和形式的一系列Render。

比如,如果想在網(wǎng)頁(yè)中實(shí)現(xiàn)圖表功能(Chart),MSIE有VML,Gecko和Opera有SVG;而在服務(wù)器端只需要簡(jiǎn)單地判斷一下瀏覽器類型,就可以選擇一個(gè)Render Kit,生成不同的客戶端表現(xiàn)來完成相同功能――這是用常規(guī)JSP技術(shù)很難完成的任務(wù)。

通俗的說,JSF組件可以翻譯成任何你想要的形式。So,JSF框架比現(xiàn)有其它開源框架具有更強(qiáng)的生命力。上文所述的OperaMasks JSF,其容器級(jí)別Ajax實(shí)現(xiàn),正是靈活應(yīng)用Render Kit的具體案例。



從容器級(jí)別對(duì)Ajax予以支持的JSF引擎

我們提出的JSF是直接由JSF容器來處理Ajax請(qǐng)求的,它會(huì)根據(jù)請(qǐng)求類型來判斷這是一個(gè)正常HTTP請(qǐng)求還是一個(gè) Ajax請(qǐng)求:如果是常規(guī)HTTP請(qǐng)求就運(yùn)行JSP頁(yè)面,生成頁(yè)面文檔(特定的,對(duì)于Ajax Render kit,要加入一些Ajax基礎(chǔ)JavaScript代碼);如果是Ajax請(qǐng)求,服務(wù)器對(duì)請(qǐng)求參數(shù)正常解碼,并執(zhí)行JSF中除頁(yè)面輸出階段以外的所有其他階段,生成一個(gè)JSF組件樹。

一直到這一步為止,處理方式與對(duì)普通HTTP請(qǐng)求的處理完全一致,唯一不同的是:在隨后Render Response階段,容器除了調(diào)用組件作者寫的Ajax功能 Renderer以外,更重要的是在生成響應(yīng)頁(yè)面時(shí),會(huì)過濾掉一切不會(huì)變化的靜態(tài)內(nèi)容――也就是說,靜態(tài)內(nèi)容不會(huì)生成到響應(yīng)頁(yè)面中去,而對(duì)每一個(gè)動(dòng)態(tài)內(nèi)容則會(huì)生成一個(gè)相應(yīng)JavaScript代碼(可以更進(jìn)一步優(yōu)化為只有變化了的動(dòng)態(tài)內(nèi)容才處理)。這樣,傳給客戶的Ajax應(yīng)答實(shí)際上是由這樣一些JavaScript語(yǔ)句構(gòu)成。在Ajax響應(yīng)返回到客戶端時(shí),就可以自動(dòng)由Ajax回調(diào)函數(shù)執(zhí)行這些JavaScript語(yǔ)句,完成對(duì)頁(yè)面即時(shí)的、局部的更改,而不需要刷新整個(gè)頁(yè)面。依賴JSF組件的具體功能,甚至可以改變頁(yè)面的外觀。而整個(gè)Ajax機(jī)制由JSF引擎提供,對(duì)用戶完全透明。

實(shí)際上,在JSF規(guī)范中JSF頁(yè)面輸出階段所采用的Render Kit是可替換的,默認(rèn)的HTML_BASIC Render Kit輸出的是標(biāo)準(zhǔn)HTML語(yǔ)法,不包含任何Java Script代碼。我們提出的JSF引擎實(shí)現(xiàn)了一個(gè) Ajax Render Kit,可以在HTML文檔中嵌入Java Script代碼來實(shí)現(xiàn)Ajax特性,而替換Render Kit只需要修改配置文件即可。

簡(jiǎn)單地說,這種JSF引擎為每個(gè)標(biāo)準(zhǔn)組件都實(shí)現(xiàn)了相應(yīng)的Ajax Render, 比如對(duì)UICommand組件,其Ajax Render會(huì)在onclick事件中加入JavaScript的Ajax提交代碼,向服務(wù)器提交Ajax請(qǐng)求。通過這種方式,任何一個(gè)包含標(biāo)準(zhǔn)JSF組件的Web應(yīng)用,都可以通過只更改Render Kit配置為Ajax來實(shí)現(xiàn)Web應(yīng)用Ajax化。而對(duì)于第三方的組件,可能本身并不支持 Ajax,但使用一個(gè)名為<Ajax:renderGroup>的標(biāo)簽,就可以立即將這個(gè)第三方組件轉(zhuǎn)換成Ajax Enabled。

例如,Apache myfaces的Tomahawk項(xiàng)目提供了一個(gè)Tree組件,這個(gè)組件本身并不支持Ajax,每當(dāng)按下一個(gè)Tree結(jié)點(diǎn)都將重新刷新整個(gè)頁(yè)面。使用<Ajax:renderGroup>標(biāo)簽后,則只刷新Tree部分,而不刷新頁(yè)面的其他部分。當(dāng)然更好的方式是,提供一個(gè)本身就支持Ajax的Tree組件,以減少冗余數(shù)據(jù)的傳遞。關(guān)于<Ajax:renderGroup>標(biāo)簽的原理,有興趣的讀者可以參考OperaMasks JSF的源碼(詳見參考資料),這里就不再一一贅述了。

綜上,JavaEE 需要Ajax,但并不需要傳統(tǒng)的Ajax開發(fā)模式。通過我們提出的OperaMasks JSF技術(shù),我們不再需要知道什么是Ajax,而我們的應(yīng)用卻是自然而然的Ajax Enabled應(yīng)用。

因此,我們認(rèn)為:JavaEE Without Ajax!
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JavaEE到底忽略了什么?
自定義開發(fā)具有Ajax功能的JSF組件
從程序員到CTO的Java技術(shù)路線圖
JAVAEE5 VS JAVAEE6
Web開發(fā)技術(shù)的演變
王建碩: ajax
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服