Applet的安全約束
Applet代碼來自於web主機並在最終用戶的機器的浏覽器中運行。有害的含有病毒的 Applet可能會造成破壞性的效果,為了防止這樣的Applet,Applet受到安全方面的約束,那就是Applet只可以與提供這個Applet的主機進行通信,而且Applet不能操作最終用戶的機器。它們不能讀寫該用戶的文件系統,不能執行上面的程序,也不能檢查一些敏感的環境參數。事實上,我們有一種方法可以回避這種限制,那就是開發者可以利用數字簽名的技術對Applet進行標志,這將會詢問用戶是否可以給予Applet某種特殊的待遇。但是這已經超出我們這篇文章中所討論的范圍了。)此外,Applet不能建立或接受外來的socket連接。所謂外來的是指這個連接超出了提供這個 Applet類文件的主機不是提供引用這個Applet的HTML所在的主機)。
因為這個安全性的限制,我們與Applet的通信必須采用一種特殊的策略。通信的唯一的途徑就是在提供Applet的主機和提供相應的HTML的主機之前的網絡連接。
Servlets
Java Servlet是服務器端的組件,它和CGI有很多相似。它可以處理web請求,並返回數據或HTML。Servlet可以訪問數據庫,進行計算,並和Enterprise JavaBean這樣的組件進行通信。與CGI程序不同的是,Servlet是持久有效的,也就是說,它只要被示例一次就可以不斷地處理請求這些請求很可能是同時發生的)。因此,Servlet比CGI來得更高效。
Servlet運行在一個Servlet引擎中,通常是在一個web服務器或應用程序服務器上。Netscape Enterprise Server 4.0和Netscape Application Server都支持最新版本的Java Servlet規范。和Applet不同,Servlet不受安全約束的限制。因為Servlet是完全在服務器上運行的,它具有所有操作系統所允許的性能。
Servlet可以用來很方便地建立在Applet和Web浏覽器這樣的客戶端和企業應用程序的核心之間的連接。對於客戶端來說,向Servlet發出的請求與其他web請求並沒有任何不同。客戶端通過一個URL來接受返回的信息,正如我們看到的那樣,返回的信息並不一定只能是HTML,實際上我們可以通過HTML協議發送和接受任何類型的數據。
構造方法
一個企業級的應用程序可以有幾種方法來構造Applet和Servlet的使用。我將向大家介紹三種不同的構造方法,並對它們的優缺點進行比較。
第一種方法實際上只使用了Applet而沒有使用Servlet,盡管Applet受到它們的安全模式的限制,但是Applet還是可以使用象JDBC、RMI這樣的協議來訪問象數據庫、LDAP目錄和Enterprise JavaBeans組件這樣的後端信息。這種構造方法如圖1所示。這種方法雖然看上去很簡單,但是這並不是一個好的方法,它會帶來很多的問題。首先,這種安排要求你將所有的訪問信息直接嵌入到你的Applet代碼中。數據庫用戶名、口令、服務器標識,所有的這一切都必須包含在你的Applet代碼中,這樣最終用戶就有可能從類文件中搜集到這些信息。此外,數據庫或任何其他你訪問的系統都必須在提供Applet的同一台服務器上。這意味著你的服務器將不得不承擔雙重的負擔,它既是一個web服務器,也是一個數據庫服務器。典型的情況是,你的後端資源可能受到防火牆的保護,但是在這種情況下,這是不可能的,因為運行在客戶端上的Applet必須直接訪問你的機器。最後,使用這種方法,你想使用web服務器群集,如果不是不可能的,至少也是很困難的。
一個雙層結構的應用程序構造
好一點的方法是將與後端資源通信的事務封裝到Servlet中,而Applet僅僅用來處理前端的工作。在這種構造方法中,正如我們在圖2中所示的那樣,Servlet克服了Applet固有的安全約束,並用來控制Applet訪問企業信息系統和事務邏輯。當Servlet接受到一個請求時,它會在後端數據庫中查詢信息、執行計算、處理對代表Applet的信息的獲取並作用於來自Applet的信息。這種方法的一大進步是Applet和Servlet對可以分布在一個後端web服務器的群集上,所有與某一共享的數據庫的通信都存在於後端。此外,使用Servlet的設計有助於設計的模塊化、抽象應用程序的後端處理商業邏輯並提高設計的靈活性。
一個三層結構的應用程序構造
如果你是圍繞Enterprise JavaBeans構建你的應用程序,Servlet就成了中間件。EJB組件可以更加有助於將商業邏輯從Servlet中分離出來,並將其更加抽象。在這種情況下,一個Applet和Servlet通信,Servlet再與EJB組件通信。就象我們在圖3中所示的那樣。在應用程序構建中引入由EJB組件、Servlet和前端的applet/HTML這樣的層次結構,可以給我們提供最大限度的彈性和性能。盡管這樣做你必須附出復雜化和費用的代價。
一個多層結構的應用程序構造
通信策略
如果你使用了這樣的構造:在前端使用Applet,在後端使用Servlet,那麼你將需要執行Applet和Servlet的通信。因為Applet受浏覽器的安全模式的限制,我們在對一個Applet存取數據和信息時並沒有太多的選擇。正如我們在前面提到的,我們不能讀取客戶端的文件系統、不能運行客戶端的程序,由於Applet不是在服務器上運行的,我們也不能訪問服務器上的文件系統。我們只能建立到運行在我們的主機上的服務的網絡連接。另外,不要忘記應用程序是在一個公開的Internet上發布的,防火牆可能會限制通過HTTP到Servlet或其它web-server模塊的會話。事實上,因為Applet本身就是在網絡上通過HTTP發布的,所以我們必須准確把握通信的策略。
假定在客戶端的Applet和服務器端的Servlet之間的網絡連接是我們可以使用的唯一的通信路徑,我們可以有幾種方法交換信息。正如你知道的,文字流可以由服務器通過HTTP發放。但是你可能不知道Java對象出可以用這種方式發放。我們將詳細地介紹HTTP文字流和HTTP 對象流的使用。另外,我們將簡單地介紹通過Socket進行通信的方法,當一個應用程序枰虻摹⒊中牧郵保飧龇椒ɑ崽乇鹩杏謾?br>HTTP文字流
Applet和Servlet交換信息的最簡單地方法就是通過HTTP文字流。Java的URL和URLConnection類型使得從一個URL讀取數據變得很容易,你可以不用擔心 Socket和其它有關網絡工作的通常的復雜問題。我們所需要的只是一個服務器端的組件,這個組件應該可以通過URL發放信息。這就是我們在這兒使用Servlet的原因。