【正文】
隨著每個(gè)新版本的發(fā)布,它變得越來越可愛,能充分解決的問題也變得越來越多。和任何語言一樣, Java 本身也存在一些限制,使得它不十分適合解決某些特殊的編程問題。 但要注意任何東西都不是十全十美的,我們?yōu)榇艘惨冻鲆恍┐鷥r(jià)。在這兒, Java 的特色并不僅僅反應(yīng)在它的移植能力,也反映在編程本身上。如果將視線從程序片身上轉(zhuǎn)開(同時(shí)放寬一些限制,比如禁止寫盤等),就進(jìn)入了常規(guī)用途的應(yīng)用程序的廣闊領(lǐng)域。 Java 實(shí)際是一種常規(guī)用途的程序設(shè)計(jì)語言,可解決任何類型的問題,至少理論上如此。其中包括基于Java 的 Web 服務(wù)器,它允許我們用 Java 進(jìn)行所有服務(wù)器端編程,寫出的程序就叫 做 “小服務(wù)程序 ”(Servlet)。這類服務(wù)器請求必須通過服務(wù)器端的一些代碼進(jìn)行,我們稱其為 “服務(wù)器端的編程 ”。其中最常見的就是發(fā)出一個(gè)數(shù)據(jù)庫檢索命令,得到結(jié)果后,服務(wù)器會把它格式化成 HTML頁,并作為結(jié)果傳回來 (當(dāng)然,假如客戶通過 Java 或者某種腳本語言具有了更高的 智能,那么原始數(shù)據(jù)就能在客戶端發(fā)送和格式化;這樣做速度可以更快,也能減輕服務(wù)器的負(fù)擔(dān) )。瀏覽器隨后會按適當(dāng)?shù)男问浇忉屵@個(gè)文件:作為 HTML頁、一幅圖、一個(gè)Java 程序片、一個(gè)腳本程序等等。 8服務(wù)器端編程 我們的整個(gè)討論都忽略了服務(wù)器端編程的問題。由于客戶端程序設(shè)計(jì)仍然要編程,所以無論如何都該針對自己的特定情況采取最好的開發(fā)途徑。 面臨客戶端編程問題令人困惑的一系列解決方案時(shí),最好的方案是先做一次投資/回報(bào)分析。使用了瀏覽器后,升級就變得易如反掌,而且整個(gè)過程是透明和自動(dòng)進(jìn)行的。但在進(jìn)行升級時(shí),每次都要物 理性地安裝一道客戶程序。而且一旦發(fā)現(xiàn)錯(cuò)誤,就可以馬上改正。全部機(jī)器均為 Intel/Windows 平臺是件很平常的事情。需作一些跨平臺處理,以及適當(dāng)?shù)陌踩婪?,比如采用某種腳本語言或者 Java。 安全問題將我們引入客戶端編程 領(lǐng)域一個(gè)似乎是自動(dòng)形成的分支。內(nèi)聯(lián)網(wǎng)提供了比因特網(wǎng)更 高 的安全級別,因?yàn)榭梢晕锢硇缘乜刂茖緝?nèi)部服務(wù)器的使用。但通過 Web 瀏覽器和客戶端編程,這兩類問題都可得到很好的解決。發(fā)現(xiàn)了之后,又如何追蹤當(dāng)初肇事的程序呢(以及它當(dāng)時(shí)的責(zé)任有多大)? 7. 因特網(wǎng)和內(nèi)聯(lián)網(wǎng) Web 是解決客戶機(jī)/服務(wù)器問題的一種常用方案,所以最好能用相同的技術(shù)解決此類問題的一些 “子集 ”,特別是公司內(nèi)部的傳統(tǒng)客戶機(jī)/服務(wù)器問題。 數(shù)字簽名遺漏了一個(gè)重要的問題,那就是人們在因特網(wǎng)上移動(dòng)的速度。但從理論上說,既然現(xiàn)在能夠找到創(chuàng)建人 “算帳 ”,他們一般不會干這種蠢事。解決的方案是 “簽了名的程序片 ”,它用公共密鑰加密算法驗(yàn)證程序片確實(shí)來自它所聲稱的地方。比如,我們有時(shí)需要構(gòu)建一個(gè)本地?cái)?shù)據(jù)庫,或?qū)?shù)據(jù)保存下來,以便日后離線使用。而且由于安全對于營建一套可靠的客戶機(jī)/服務(wù)器系統(tǒng)至關(guān)重要,所以會給病毒留下漏洞的所有錯(cuò)誤都能很快得到修復(fù)(瀏覽器軟件實(shí)際需要強(qiáng)行遵守這些安全規(guī)則;而有些瀏覽器則允許我們選擇不同的安全級別,防止對系統(tǒng)不同程度的訪問)。特別地,程序片根本沒有權(quán)力將文件寫進(jìn)磁盤,或者刪除文件(這是病毒最喜歡做的事情之一)。 Java 通過 “沙箱 ”來防止這些問題的發(fā)生。這似乎是一個(gè)很好的主意,因?yàn)樗钩绦蝻@得更加正規(guī)。這一機(jī)制的基礎(chǔ)是認(rèn)為病毒之所以會傳播,是由于它的編制者匿名的緣故。從 BBS 下載回來的病毒一直是個(gè)大問題,但因特網(wǎng)的速度使得這個(gè)問題變得更加復(fù)雜。下載回一個(gè) ActiveX 組件后,它完全可能對我們磁盤上的文件造成破壞。 ActiveX 是所有這些里面最讓人擔(dān)心的。有些是無害的; GIF文件不會對我們造成任何危害,而腳本編制語言通常在自己可做的事情上有著很大的限制。在客戶端的編程中, ActiveX帶來了最讓人頭痛的安全問題。事實(shí)上, ActiveX 是在我們的 Web 頁中使用 “歷史遺留 ”代碼的最佳途徑。所以, ActiveX 并沒有限制我們使用一種特定的語言。經(jīng)過一家獨(dú)立的專業(yè)協(xié)會的努力, ActiveX 現(xiàn)在已具備了跨平臺使用的能力。 5. ActiveX 在某種程度上, Java 的一個(gè)有力競爭對手應(yīng)該是微軟的 ActiveX,盡管它采用的是完全不同的一套實(shí)現(xiàn)機(jī)制。由于 VBScript 可以解決大多數(shù)典型的客戶機(jī)/服務(wù)器問題,所以一旦上手,就很難下定決心再去學(xué)習(xí) Java。不管你平時(shí)聽別人怎么說, Java 都不是一種十分容易便可學(xué)會的語言。這種程序一般都非常小,可有效減少對服務(wù)器的點(diǎn)擊數(shù)。正如本書以前會講到的那樣,編譯好的 Java 程序片可能包含了許多模塊,所以要多次 “命中 ”(訪問)服務(wù)器以便下載(在 Java 中,這個(gè)問題得到了有效的改善 ——利用 Java 壓縮檔 ,即 JAR 文件 ——它允許設(shè)計(jì)者將所有必要的模塊都封裝到一起,供用戶統(tǒng)一下載)。當(dāng)然在另一方面,反編譯 Java 程序片也并不是件難事,而且代碼的隱藏一般并不是個(gè)重要的問題。這樣一 來,不僅速度和響應(yīng)的靈敏度得到了極大的提高,對網(wǎng)絡(luò)和服務(wù)器造成的負(fù)擔(dān)也可以明顯減輕,這對保障因特網(wǎng)的暢通是至關(guān)重要的。例如,再也不必通過因特網(wǎng)傳送一個(gè)請求表單,再由服務(wù)器確定其中是否存在一個(gè)拼寫或者其他參數(shù)錯(cuò)誤。由于 Java 的設(shè)計(jì)原理,程序員只需要?jiǎng)?chuàng)建程序的一個(gè)版本,那個(gè)程序能在幾乎所有計(jì)算機(jī)以及安裝了 Java 解釋器的瀏覽器中運(yùn)行。程序片的一個(gè)優(yōu)點(diǎn)體現(xiàn)在:通過程序片,一旦用戶需要客 戶軟件,軟件就可從服務(wù)器自動(dòng)下載回來。作為 Web 頁的一部分,程序片代碼會自動(dòng)下載回來(這和網(wǎng)頁中的圖片差不多)。 Java 通過 “程序片 ”( Applet)巧妙地解決了客戶端編程的問題。它不僅是一種功能強(qiáng)大、高度安全、可以 跨平臺使用以及國際通用的程序設(shè)計(jì)語言,也是一種具有旺盛生命力的語言。當(dāng)然,如果你已經(jīng)有 Visual Basic 或者 Tcl/Tk 的深厚功底,當(dāng)然用它們要簡單得多,起碼可以避免學(xué)習(xí)新語言的煩惱(解決 Web 方面的問題就已經(jīng)夠讓人頭痛了)。除此以外,市面上講述 JavaScript 的書籍也要比講述其他語言的書多得多。 JavaScript 也許是 日 常 用 的 , 它 得 到 的 支 持 也 最 全 面 。 目前討論得最多的腳本編制語言包括 JavaScript(它與 Java 沒有任何關(guān)系;之所以叫那個(gè)名字,完全是一種市場策略)、 VBScript(同 Visual Basic 很相似)以及 Tcl/Tk(來源于流行的跨平臺 GUI 構(gòu)造語言)。你碰到的問題可能完全就在那 80%里面。 腳本語言真正面向的是特定類型問題的解決,其中主要涉及如何創(chuàng)建更豐富、更具有互動(dòng)能力的圖形用戶界面( GUI)。缺點(diǎn)是我們的代碼全部暴露在人們面前。腳本語言一般都傾向于盡量簡化,易于理 解。 3. 腳本編制語言 插件造成了腳本編制語言的爆炸性增長。對客戶端程序設(shè)計(jì)來說,插件的價(jià)值在于它允許專業(yè)程序員設(shè)計(jì)出一種新的語言,并將那種語言添加到瀏覽器,同時(shí)不必經(jīng)過瀏覽器原創(chuàng)者的許可。但插件的編寫并不是一件簡單的任務(wù)。這些代碼的作用是告訴瀏覽器 “從現(xiàn)在開始,你可以進(jìn)行這些新活動(dòng)了 ”(僅需下載這些插入一次)。 2. 插件 朝客戶端編程邁進(jìn)的時(shí)候,最重要的一個(gè)問題就是插件的設(shè)計(jì)。大多數(shù)語言都可用來編 制這些程序,但其中最常見的是 Perl。最常見的行動(dòng)是運(yùn)行位于服務(wù)器的一個(gè)程序。用戶提交的信息通過所有 Web 服務(wù)器均能支持的 “ 通用網(wǎng)關(guān)接口 ”( CGI)回傳到服務(wù)器。服務(wù)器一般為 客戶瀏覽器產(chǎn)生靜態(tài)網(wǎng)頁,由后者簡單地解釋并 顯示出來。 Java 除了可解決傳統(tǒng)的程序設(shè)計(jì)問題以外,還能解決 World Wide Web(萬維網(wǎng) )上的編程問題。 it’s named that way just to grab some of Java’s marketing momentum), VBScript (which looks like Visual Basic), and Tcl/Tk, which es from the popular crossplatform GUIbuilding language. There are others out there, and no doubt more in development. JavaScript is probably the most monly supported. It es built into both Netscape Navigator and the Microsoft Inter Explorer (IE). In addition, there are probably more JavaScript books available than there are for the other browser languages, and some tools automatically create pages using JavaScript. However, if you’re already fluent in Visual Basic or Tcl/Tk, you’ll be more productive using those scripting languages rather than learning a new one. (You’ll have your hands full dealing with the Web issues already.) If a scripting language can solve 80 percent of the clientside programming problems, what about the other 20 percent—the “really hard stuff?” The most popular solution today is Java. Not only is it a powerful programming language built to be secure, crossplatform, and international, but Java is being continually extended to provide language features and libraries that elegantly handle problems that are difficult in traditional programming languages, such as multithreading, database access, work programming, and distributed puting. Java allows clientside programming via the applet. An applet is a miniprogram that will run only under a Web browser. The applet is downloaded automatically as part of a Web page (just as, for example, a graphic is automatically downloaded). When the applet is activated it executes a program. This is part of its beauty—it provides you with a way to automatically distribute the client software from the server at the time the user needs the client software, and no sooner. The user gets the latest version of the client software without fail and without difficult reinstallation. Because of the way Java is designed, the programmer needs to create only a single program, and that program automatically works with all puters that have browsers with builtin Java interpreters. (This safely includes the vast majority of machines.) Since Java is a fullfledged programmi