在過去的幾年中,java 平臺技術取得了一些驚人進展。但這項技術在某些方面的廣泛應用和它最初的設計目標完全不同。Java 平臺技術最初是希望通過客戶端運行 Applet 和 application,來給網頁增加交互性。而現在該技術最常見的用途卻是基于服務器的 J2EE 系統。為了讓 Java 平臺在客戶端發揮它的最大潛力,人們開發了許多新技術。由于企業系統逐漸被互聯網應用程序所取代,把握這些新技術也就非常必要。在這篇文章中,你可以看到如何利用新舊技術來達到此目的。
Applet 碰到什么問題?
當 Java 平臺首次發布的時候,就預示著一種新方法,能夠將互聯網從靜態的簡單網頁集合,提升到具有交互性的高級層次。Java 創始者的最初目的是為開發者們提供一些方法,創建可以在任何客戶端機器上運行的小程序。這些程序還能夠將客戶端進程與服務端數據相結合,給客戶提供高度的交互體驗。
然而在某些地方,Java 為客戶端所承諾的許多特性得不到實現。導致這個不幸的可能原因包括以下幾種:
公司防火墻通常阻止 Java Applet 的通過。
許多客戶端沒有提供完全兼容的 Java 虛擬機。
安全設置不答應使用 Applet 來執行很多有用的規則。
瀏覽頁面時,下載一個完整用戶界面所需的開銷,經常令許多用戶對 Java Applet 望而卻步。
必須為不同系統以及不同的平臺,重新實現許多用戶界面函數(打印,文件治理和其他一些類似任務)。這也是許多開發人員避免使用 Java Applet 的原因。
隨著互聯網上電子商務的成長,終端用戶的處理能力有所增加,對通訊帶寬的需求更是迅猛增長。在客戶端組件中使用 Java 技術再度成為一件很有誘惑力的事情。然而,我們需要研究一種新方法,既能夠利用客戶端的程序,又不必碰到類似于使用 Java Applet 制作 ad-ware 和滾動新聞欄時所面臨的障礙。通過新舊技術的結合使用,甚至融合某些幾乎被快速奔跑的“互聯網時代”所淡忘的舊技術,就能夠減輕這些問題。
人們為什么稱之為javascript
在客戶端使用 Java 技術時,最為忽略的一點便是 Java Applet 和 Javascript 之間的結合。JavaScript 標準早就為腳本提供了調用 Applet 類的方法,而 Applet 也能夠調用腳本的函數。這種結合讓我們能夠發揮這兩種技術的最大優點。我們開發并保持所需要的功能性,而將用戶界面的設計交給網頁開發人員來處理。此外,利用這種結合,還能夠增加用戶與服務器的交互程度卻留下很少客戶端參與的痕跡。
JavaScript 標準中的 LiveConnect 技術(參看資料部分),答應在網頁中使用腳本來調用 Applet 方法。只要簡單地創建所需要的 Java 類,并答應 JavaScript 腳本的開發者訪問這個類中的方法便可。而 com.netscape.JSObject 類則使我們能夠訪問 JavaScript 函數和對象。這就提供了一種在 Java 代碼中調用 JavaScript 函數的方式,直接令網頁發生相當有趣和重要的變化。有了 JavaScript 和 Java Applet 之間的聯系,那些 JavaScript 或 Java Applet 無法單獨執行,但結合這二種方法卻能完成的任務就能夠被解決。而且,此二者的結合通常還能夠減少網頁提交到服務器的時間,從而減少了用戶等待時間,服務器處理時間以及服務端的會話狀態維護開銷。考慮下列例子:
在用戶填表的同時,后臺線程使用 Java Applet 來在服務端數據庫中尋找地址或電話號碼信息。
當 SSL 不適合使用時,利用 PKI 技術來為系統間的通訊加密。
使用 DSA 標準來對請求簽名,為消息內容和發送者提供強大的確認功能。
使用 Java Applet 向服務器數據庫提交日程改變,并在客戶端的背景上更新本地日程顯示。不需要不斷對所有日程做更新,并且最大程度地縮短這個改動生效所需的時間。
結合使用 Java Applet 和 JavaScript 代碼進行動態顯示,不斷更新瀏覽器文檔中的內容;這種結合答應我們不必為每個所想象得到的客戶端平臺都寫一段打印例程,也能夠將內容打印出來。
清單 1 闡述如何使用 JSObject 和 LiveConnect 來驗證一個電話號碼,同時將該號碼轉化成標準格式。注重到這只是一個例子代碼,所以我在服務器連接方法中略去若干必須的函數調用,以便簡化這個清單。這個例子是當電話號碼輸入框內容發生變化時,在 JavaScript 中調用 Java Applet 函數。于是 Java Applet 就訪問服務器,獲得這個電話號碼的標準格式字符串,并將該字符串返回到隱藏框(hidden field)里。真正實現此任務的代碼,應該用后臺線程來實現服務器連接和電話號碼驗證,以便讓驗證過程對用戶而言是透明的。這個例子還使用了另一項使客戶端 Java 編程更為有趣的技術:HTTP 連接以及與服務器代碼(非凡是 servlet 和 jsp 網頁)的結合。
基于服務器的資源
那些必須存放在服務器上的資源會怎樣呢?這類基于服務器的資源包括地址驗證,運輸費用計算,以及信用卡驗證等。支持數據以及要求高安全度的處理必須放在服務端,但大部分的驗證處理,數據轉換以及費用計算過程可以遷移到客戶端系統上。支持這一想法的幾個 Java 語言特點包括:
Java 語言通過 HttpURLConnection 對象來為 HTTP 連接提供內在支持。同時利用 java.net 包的其他部分,為服務端代碼與客戶端代碼之間的通訊提供一種方法,簡單有效地生成數據或打包數據。
許多客戶端的 Java Applet 代碼實際上與那些在服務器上運行的代碼是一樣的。
現在我們可以將多種任務分配給服務器和客戶機,從而減少服務器負載,甚至可能減少網絡連接。具體如何分配這些任務將取決于系統的類型以及用戶團體,但幾乎所有的系統都會因為增加一些客戶端處理而受益,例如:
Applet 類能夠將數據從一系列格式轉化到單一的 xml 字符串格式,這使得服務器更輕易處理數據。
Applet 類可以進行數據壓縮,即把那些將要上載到服務器的數據壓縮,同時將這些數據分割成較小的數據包,從而進一步提高了可靠性。
當用戶填寫結帳表單時,Applet 類能夠進行地址和運輸費用的計算(在更大的基于服務器數據庫中這類計算經常需要進行交互)。此方法能夠減少最后結算所需要的時間,同時令用戶在提交定單之前就能夠看到正確的運輸費用以及相應稅金等信息。
為了發揮這個技術的最大優勢,需要一些方法向那些返回指定數據的服務器發送請求。 Java servlet 恰好具有這種能力。許多開發者并未完全意識到 servlet 能夠將任何一種數據作為響應并返回,而不僅僅限于 Html 或是 XML。通過返回一系列連續的對象或一個壓縮的數據包,servlet 能夠執行例如地址確認或運輸費用和稅金計算等任務。同時,進行這些計算的客戶端代碼可以通過后臺線程的運行來掩蓋用戶等待時間。清單 2 中顯示了一個servlet,該 servlet 接收 HTTP 的帶有 Zip 代碼的 GET 請求,并返回運輸費用的計算結果。同樣出于令清單清楚明了的目的,在這里省略了若干非常重要的實際代碼。
注重到我使用 ObjectOutputStream 對象來將整個目標圖表寫入待返回的響應中。content 類型需要設置成某些合適的值,同時將 content 處理句柄分配到客戶端。這種方法能夠返回一個 Java 對象,里面包含顧客運輸、處理費用以及應繳稅金的計算結果。假如這個對象只是與客戶端后臺線程進行通訊,用戶就根本不會意識到他已經和服務器進行了一輪通訊。
節約時間的新技術
上述技術都已實現若干時間了,且大多數正在全世界各種不同的系統上應用著。前面我曾經許諾過要介紹一些新技術,現在是具體闡述它們的時候了。客戶端上最有趣的 Java 新技術當屬 weblet。IBM alphaWorks 的 DirectDOM 就是該技術的一個具體實現(參看資料部分)。DirectDOM 答應從 Java 代碼中訪問整個瀏覽器 DOM tree (2000年11月13日 W3C 建議為 DOM Level 2)。weblet 沒有用戶界面,必須通過操縱瀏覽器中的活動 DOM 文檔來完成它的工作。許多原先需要復雜 JavaScript 代碼才能實現的技術,通過這種方法都能夠實現。必須注重到盡管 DirectDOM 是一項很有吸引力的技術,它仍處在 alpha 階段,是不完善的,并且需要 Internet EXPlorer 或 Mozilla (M18) 的最新版本才能夠運行。然而,此技術足以使你猜測到不遠的將來將會如何令人激動。一些可能實現的例子如下:
在布滿了大量圖形和視覺刺激的結算網頁上,加入 weblet。那么在用戶處理結算表格的多個步驟時,不需要每步都在表單與網頁間切換,也能夠與服務器通訊交換數據并完成結算。當結算完畢需要確認時,weblet 會將整個包提交到服務器,服務器就可以按照通常的結算處理步驟進行處理。
一個顯示屬性消息的網頁。weblet 通過令頁面空白來標記對應于打印或保存請求的響應,從而防止數據被不加區別地共享。
新聞熱點
疑難解答