J2EE 第五周作業
一.AJAX技術
Ajax用來描述一組技術,它使瀏覽器可以為用戶提供更為自然的瀏覽體驗。在Ajax之前,Web站點強制用戶進入提交/等待/重新顯示範例,用戶的動作總是與服務器的“思考時間”同步。Ajax提供與服務器異步通信的能力,從而使用戶從請求/響應的循環中解脫出來。借助於Ajax,可以在用戶單擊按鈕時,使用JavaScript和DHTML立即更新UI,並向服務器發出異步請求,以執行更新或查詢數據庫。當請求返回時,就可以使用JavaScript和CSS來相應地更新UI,而不是刷新整個頁面。最重要的是,用戶甚至不知道瀏覽器正在與服務器通信:Web站點看起來是即時響應的。
雖然Ajax所需的基礎架構已經出現了一段時間,但直到最近異步請求的真正威力才得到利用。能夠擁有一個響應極其靈敏的Web站點確實激動人心,因為它最終允許開發人員和設計人員使用標準的HTML/CSS/JavaScript堆棧創建“桌面風格的(desktop-like)”可用性。
通常,在J2EE中,開發人員過於關註服務和持久性層的開發,以至於用戶界面的可用性已經落後。在一個典型的J2EE開發周期中,常常會聽到這樣的話,“我們沒有可投入UI的時間”或“不能用HTML實現”。但是,以下Web站點證明,這些理由再也站不住腳了:
BackPack
Google Suggest
Google Maps
PalmSphere
所有這些Web站點都告訴我們,Web應用程序不必完全依賴於從服務器重新載入頁面來向用戶呈現更改。一切似乎就在瞬間發生。簡而言之,在涉及到用戶界面的響應靈敏度時,基準設得更高了。
定義Ajax
Adaptive Path公司的Jesse James Garrett這樣定義Ajax:
Ajax不是一種技術。實際上,它由幾種蓬勃發展的技術以新的強大方式組合而成。Ajax包含:
基於CSS標準的表示;
使用Document Object Model進行動態顯示和交互;
使用XMLHttpRequest與服務器進行異步通信;
使用JavaScript綁定一切。
這非常好,但為什麽要以Ajax命名呢?其實術語Ajax是由Jesse James Garrett創造的,他說它是“Asynchronous JavaScript + XML的簡寫”。
Ajax的工作原理
Ajax的核心是JavaScript對象XmlHttpRequest。該對象在Internet Explorer 5中首次引入,它是一種支持異步請求的技術。簡而言之,XmlHttpRequest使您可以使用JavaScript向服務器提出請求並處理響應,而不阻塞用戶。
1 AJAX還是AJAH
* AJAX的很多經典應用其實都是利用xmlhttp空間訪問後臺程序,後臺程序返回腳本用eval回調或者返回簡單數據的方式來開發。這樣的開發模式的好處是設計簡單輕巧,對熟悉dhtml的開發者來說上手會比較塊,跨瀏覽器問題也容易解決,做簡單的應用也夠用。gmail,google suggest都是用這種方式。但是在我看來gmail已經吧AJAH應用到極限了,更復雜的數據結構用簡單數據和回調方式來組織就開始有點力不從心了。
* 前AJAX的一種傳統做法是後臺返回完整的xml文件後用腳本(利用控件)解析xml後操作頁面的dom節點來動態生成頁面的一部分。這樣作的優點是可以充分利用xml的強大表達能力傳輸各種數據結構,缺點是頁面的dom操作效率不高,而且IE在dom操作的API上bug多多。之所以叫“前AJAX”,因為我們在AJAX這個名詞出現前已經這樣做了很多年了。
* AJAX另一種傳統做法是後臺返回完整的xml文件後用腳本(利用控件)解析xml後生成html代碼再灌回頁面的層中。這樣的做法回避了頁面dom操作的一些問題,在生成的內容比較多的時候利用一些字符串計算的優化技巧(主要是數組和正則的應用)可以相當高效的生成頁面。在我看來這是未來的發展趨勢。
我現在的項目主要采用的是第三種方式,結合第二種。我使用的是自己的一個小巧的框架,模擬jsp的語法來生成html代碼,但是依賴於瀏覽器的xml解析API,因此難以跨瀏覽器。google的開源項目ajaxslt提供了一個純js的xslt解決方式,功能更強大,可以在頁面中局部的應用xslt解析xml生成html或者其他形式的數據,但是帶來了xslt這個技術門檻。sf上的ZK似乎也不錯,但是帶來的是xul這個技術門檻,同時後臺被綁定在了J2EE服務器上面。
2 CACHE
如果使用xmlhttp控件,在發起http請求的時候IE會包辦cache策略,很多時候更新了數據卻無法獲得更新後的數據。一開始試圖用傳統方式在URL後面加隨機數來強制更新,但是IE仍然距不發出新的請求。
一個解決方法是在後臺寫expires: 0或者其他的禁止前臺cache的頭,但是這樣在數據沒有更新的時候又會帶來不必要的服務器壓力、響應延遲和帶寬浪費。
一個稍微好一點的解決方法是,前臺在提交數據以後,需要強制更新數據的時候:
xmlhttp.setRequestHeader("If-Modified-Since","0");
3 系統錯誤: -1072896748。
用xmlhttp接收到數據的時候經常是用xmldom.loadXML(xmlhttp.responseXML.xml)來判斷返回的數據的正確性,但是如果後臺送過來不正確的xml的時候有時回觸發-1072896748系統錯誤。這是因為xmlhttp.responseXML已經沒有解析到東西了,我們還試圖訪問它的xml屬性而觸發的。
解決的方法是在使用responseXML.xml 或者 responseText的時候要做try/catch:
try{var tmp = xmlhttp.responseXML.xml}catch(ex){err=true;}
有些人喜歡catch的時候判斷 exception.description=="系統錯誤: -1072896748。" , 如果客戶端不是簡體中文版的系統的時候就判斷不到了。其實這個地方只要有異常,都必須走異常處理流程了,不用區分的那麽仔細。
二.Applet程序組件
1.1.定義:
Applet是采用Java編程語言編寫的小應用程序,該程序可以包含在HTML(標準通用標記語言的一個應用)頁中,與在頁中包含圖像的方式大致相同。含有Applet的網頁的HTML文件代碼中部帶有<applet> 和</applet>這樣一對標記,當支持Java的網絡瀏覽器遇到這對標記時,就將下載相應的小應用程序代碼並在本地計算機上執行該Applet。
1.2.工作原理及優勢:
1.2.1 Java Applet 可以大大提高Web頁面的交互能力和動態執行能力。 Applet以代碼的形式嵌入Web頁面中,用標簽<applet></applet>標明,當支持Java的網絡瀏覽器遇到這對標記時,就下載相應的應用程序代碼,並在本地計算機上執行Applet。Applet是一種Java的小 程序,它通過使用該Applet的HTML文件,由支持Java的網絡瀏覽器下載運行。也可以通過java開發工具的appletviewer來運行。Applet 程序離不開使用它的HTML文件。
1.2.2 Applet可以提高Web頁面的交互能力和動態執行能力。
1.3.開發步驟:
Applet程序開發主要步驟如下: 1.3.1 選用EDIT或Windows Notepad等工具作為編輯器建立Java Applet源程序。 1.3.2 把Applet的源程序轉換為字節碼文件。 1.3.3 編制使用class 的HTML文件。在HTML文件內放入必要的<OBJECT>語句。1.4.安全性限制:
為了防止這樣的問題出現,在缺省的情況下,大多數瀏覽器在Applet安全方面受到諸多的限制,幾乎不能對系統進行任何“讀”或“寫”的操作: 1.4.1 不允許Applet訪問本地文件系統 1.4.2 Applet不能執行任何本地計算機上的程序 1.4.3 不允許Applet嘗試打開除提供Applet的服務器之外的任何系統的Socket 1.4.4 不允許Applet訪問用戶名、電子郵件地址等與本地系統有關的信息 1.4.5 對於Applet而言,Java環境中的某些標準系統屬性是只讀的 1.4.6 Applet不能創建或裝載Applet的機器的網絡連接 1.4.7 Applet不能充當網絡服務器,監聽或接收來自遠程系統的連接請求 1.4.8 不允許Applet裝載動態庫或定義本地方法調用 1.4.9 Applet不能操縱不在自己線程組中的任何線程 1.4.10 Applet不能關閉JVM。J2EE 第五周作業