現在讓我們想想如何創建一個應用,令其在真實的Web環境中運行,它將把Java的優勢表現得淋漓盡致。這個應用的一部分是在Web服務器上運行的一個Java程序,另一部分則是一個“程序片”或“小應用程序”(Applet),從服務器下載至浏覽器(即“客戶”)。這個程序片從用戶那裡收集信息,並將其傳回Web服務器上運行的應用程序。程序的任務非常簡單:程序片會詢問用戶的E-mail地址,並在驗證這個地址合格後(沒有包含空格,而且有一個@符號),將該E-mail發送給Web服務器。服務器上運行的程序則會捕獲傳回的數據,檢查一個包含了所有E-mail地址的數據文件。如果那個地址已包含在文件裡,則向浏覽器反饋一條消息,說明這一情況。該消息由程序片負責顯示。若是一個新地址,則將其置入列表,並通知程序片已成功添加了電子函件地址。
若采用傳統方式來解決這個問題,我們要創建一個包含了文本字段及一個“提交”(Submit)按鈕的HTML頁。用戶可在文本字段裡鍵入自己喜歡的任何內容,並毫無阻礙地提交給服務器(在客戶端不進行任何檢查)。提交數據的同時,Web頁也會告訴服務器應對數據采取什麼樣的操作——知會“通用網關接口”(CGI)程序,收到這些數據後立即運行服務器。這種CGI程序通常是用Perl或C寫的(有時也用C++,但要求服務器支持),而且必須能控制一切可能出現的情況。它首先會檢查數據,判斷是否采用了正確的格式。若答案是否定的,則CGI程序必須創建一個HTML頁,對遇到的問題進行描述。這個頁會轉交給服務器,再由服務器反饋回用戶。用戶看到出錯提示後,必須再試一遍提交,直到通過為止。若數據正確,CGI程序會打開數據文件,要麼把電子函件地址加入文件,要麼指出該地址已在數據文件裡了。無論哪種情況,都必須格式化一個恰當的HTML頁,以便服務器返回給用戶。
作為Java程序員,上述解決問題的方法顯得非常笨拙。而且很自然地,我們希望一切工作都用Java完成。首先,我們會用一個Java程序片負責客戶端的數據有效性校驗,避免數據在服務器和客戶之間傳來傳去,浪費時間和帶寬,同時減輕服務器額外構建HTML頁的負擔。然後跳過Perl CGI腳本,換成在服務器上運行一個Java應用。事實上,我們在這兒已完全跳過了Web服務器,僅僅需要從程序片到服務器上運行的Java應用之間建立一個連接即可。
正如大家不久就會體驗到的那樣,盡管看起來非常簡單,但實際上有一些意想不到的問題使局面顯得稍微有些復雜。用Java 1.1寫程序片是最理想的,但實際上卻經常行不通。到本書寫作的時候,擁有Java 1.1能力的浏覽器仍為數不多,而且即使這類浏覽器現在非常流行,仍需考慮照顧一下那些升級緩慢的人。所以從安全的角度看,程序片代碼最好只用Java 1.0編寫。基於這一前提,我們不能用JAR文件來合並(壓縮)程序片中的.class文件。所以,我們應盡可能減少.class文件的使用數量,以縮短下載時間。
好了,再來說說我用的Web服務器(寫這個示范程序時用的就是它)。它確實支持Java,但僅限於Java 1.0!所以服務器應用也必須用Java 1.0編寫。