【正文】
an does Visual Basic, VBScript, or C++. Why go back to those languages for serverside programming? 3. Powerful Servlets support several capabilities that are difficult or impossible to acplish with regular CGI. Servlets can talk directly to the Web server, whereas regular CGI programs cannot, at least not without using a serverspecific API. Communicating with the Web server makes it easier to translate relative URLs into concrete path names, for instance. Multiple servlets can also share data, making it easy to implement database connection pooling and similar resourcesharing optimizations. Servlets can also maintain information from request to request, simplifying techniques like session tracking and caching of previous putations. 4. Portable Servlets are written in the Java programming language and follow a standard API. Servlets are supported directly or by a plugin on virtually every major Web server. Consequently, servlets written for, say, Macromedia JRun can run virtually uncha nged on Apache Tomcat, Microsoft Inter Information Server (with a separate plugin), IBM WebSphere, iPla Enterprise Server, Oracle9i AS, or StarNine WebStar. They are part of the Java 2 Platform, Enterprise Edition (J2EE。t support them and developers don39。 Servlet 的工作是執(zhí)行西門的任務(wù),如圖 所示 。 最終用戶一般在頁面的 HTML 表單中輸入這些數(shù)據(jù)。 ( 2) 讀取由瀏覽器發(fā)送的隱式請求數(shù)據(jù)。兩種數(shù)據(jù)都很重要。 ( 3) 生成結(jié)果。實(shí)際的數(shù)據(jù)可能存儲在關(guān)系型數(shù)據(jù)庫中。即使它能夠做到這一點(diǎn),為了安全上的考慮,我們也不希望讓它這么做。因此,我們需要Web 中間層從 HTTP 流中提取輸入數(shù)據(jù),與應(yīng)用程序會話,并將結(jié)果嵌入到文檔中。 這個文檔可以用各種格式發(fā)送,包括文本( HTML 或 XML),二進(jìn)制( GIF圖),甚至可以式建立在其他底層格式之上的壓縮格式,如 gzip。 ( 5) 發(fā)送隱式的 HTTP 響應(yīng)數(shù)據(jù)。但是,實(shí)際發(fā)送的數(shù)據(jù)有兩種:文檔本身,以及后臺的 HTTP 信息。 HTTP 響應(yīng)數(shù)據(jù)的發(fā)送過程涉及告知瀏覽器或其他客戶程序所返回文檔的類型(如 HTML),設(shè)置 cookie 和緩存參數(shù),以及其他類似的任務(wù)。然而,許多情況下靜態(tài)的結(jié)果不能滿足要求,我們需要針對每個請求生成一個頁面。 例如,搜索引擎生成的頁面,以及在線商店的訂單確認(rèn)頁面,都要針對特定的用戶請求而產(chǎn)生。要記住,用戶提交兩種類型的數(shù)據(jù):顯示(即 HTML 表單的數(shù)據(jù))和隱式(即 HTTP 請求的報(bào)頭)?;?cookie 值針對具體用戶構(gòu)建頁面的情況尤其普遍。 如果頁面需要根據(jù)每個具體的請求做出相應(yīng)的改變,當(dāng)然需要在請求發(fā)生時構(gòu)建響應(yīng)。具體應(yīng)該采用哪種方式要根據(jù)具體情況而定,但后一種方式常常更為方便,因?yàn)樗恍韬唵蔚氐却脩舻恼埱蟆? 頁面中使用了來自公司數(shù)據(jù)庫或其他數(shù)據(jù)庫斷數(shù)據(jù)源的信息。想象以下,如果一個搜索引擎網(wǎng)站完全使用 applet,那么用戶將會看到: “正在下載 50TB 的 applet,請等待! ”。從客戶端到 Web 層再到數(shù)據(jù)庫(三層結(jié)構(gòu)),要比從 applet 直接到數(shù)據(jù)庫(二層結(jié)構(gòu))更靈活,也更安全,而性能上的損失很少甚至沒有。 理論上講, servelt 并非只用于處理 HTTP 請求的 Web 服務(wù)器或應(yīng)用服務(wù)器,它同樣可以用于其他類型的服務(wù)器。而且,用于會話啟動協(xié)議服務(wù)器的 servlet API 最近已經(jīng)被標(biāo)準(zhǔn)化(參見 servelt 的這種用法尚不流行,在此,我們只論述 HTTP Servlet。 效率 應(yīng)用傳統(tǒng)的 CGI,針對每個 HTTP 請求都用啟動一個新的進(jìn)程。而使用servelt, Java 虛擬機(jī)會一直運(yùn)行,并用輕量級的 Java 線程處理每個請求,而非重量級的操作系統(tǒng)進(jìn)程。同樣的情況,如果使用servlet 則啟動 N 個線程,單僅僅載入 servlet 類的單一副本。最后,當(dāng) CGI 程序結(jié)束對請求的處理之后 ,程序結(jié)束。然而, servelt 會一直停留在內(nèi)存中(即使請求處理完畢),因而可以直接存儲客戶請求之間的任意復(fù)雜數(shù)據(jù)。而在CGI 中,大部分工作都需要我們資金完成。 Servlet 能夠直接于 Web 服務(wù)器對話,而常規(guī)的 CGI 程序做不到這一點(diǎn),至少在不使用服務(wù)器專有 API 的情況下是這樣。多個 servelt 還可以共享數(shù)據(jù),從而易于實(shí)現(xiàn)數(shù)據(jù)庫連接共享和類似的資源共享優(yōu)化。 可移植性 Servelt 使用 Java 編程語言,并且遵循標(biāo)準(zhǔn)的 API。實(shí)際上都直接或通過插件支持 servlet。為 Macromedia JRun 編寫的 servlet,可以不經(jīng)過任何修改地在 Apache Tomcat, Microsoft Inter Information Server,IBM WebSphere 。 Oracle9i AS 或者 StrNine WebStar 上運(yùn)行。 廉價 對于開發(fā)用的網(wǎng)站、低容量或中等容量網(wǎng)站的部署,有大量免費(fèi)或極為廉價的 Web 服務(wù)器可供選擇。這與其他 CGI 方案形成鮮明的對比,這些 CGI 方案在初期都需要為購買專利軟件包投入大量的資金。例如, Marty 記錄了所有通過電子郵件向他發(fā)送 問題的讀者的所在國。Marty 曾在馬尼拉講授過 jsp 和 servlet 培訓(xùn)課程,那兒對 servelt 和 jsp 技術(shù)抱很大的興趣。首先,這兩個國家都擁有大量訓(xùn)練有素的軟件開發(fā)人員。因此,從美國公司那里購買專用 Web服務(wù)器會消耗掉項(xiàng)目的大部分前期資金。項(xiàng)目取得成功之 后,他們可以轉(zhuǎn)移到性能更高、管理更容易,但需要付費(fèi)的服務(wù)器。如果他們的項(xiàng)目變得更龐大,他們或許希望轉(zhuǎn)移到分布式環(huán)境。同樣,他們的 servelt 和 jsp 沒有任何部分需要重寫。因此,他們可以切換到 BEA WebLogic 或Oracle9i AS。最后,如果他們的項(xiàng)目變得更龐大,他們或許將他從 Linux 轉(zhuǎn)移到運(yùn)行 IBM WebSphere 的 IBM 大型機(jī)上。 安全 傳統(tǒng) CGI 程序中主要的漏洞來源之一就是, CGI 程序常常由通過的操作系統(tǒng)外殼來執(zhí)行。實(shí)現(xiàn)這項(xiàng)預(yù)防措施的難度可能超出我們的想象,在廣泛應(yīng)用的 CGI 庫中,不斷發(fā)現(xiàn)由這類問題引發(fā)的弱點(diǎn)。例如,在 C 和 C++中,可以分配一個 100 個元素的數(shù)組,然后向第 999 個 “元素 “寫入數(shù)據(jù) ——實(shí)際上是程序內(nèi)存的隨機(jī)部分,這完全合法。 Servelt 不存在這些問題。當(dāng)然,數(shù)組邊界的檢查以及其他內(nèi)存包含特性是 java 編程語言的核心部分。存在幾種低廉的插件,通過應(yīng)用這些插件,Microsoft IIS 和 Zeus 也同樣支持 servlet 和 jsp 技術(shù),它們運(yùn)行在 Windows,Unix/Linus,MacOS,VMS,和 IBM 大型機(jī)操作系統(tǒng)之上。 當(dāng)然,僅僅是流行并不能證明技術(shù)的優(yōu)越性。但我們的立場是:服務(wù)器端 Java 本非一項(xiàng)新的、為經(jīng)證實(shí)的技術(shù)