1. 概述<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1.1. 什麼是Servlet
Servlet是受容器管理的web組件,它能動態地生成內容。Servlet是一段小程序,被編譯成平臺無關、架構中立的的字節碼之後,可以被Web服務器器動態地加載和運行。Servlet通過容器實現的請求-相應(request-response)方式與Web瀏覽器進行交互,這種請求-相應模式是基於超文本傳輸協議(HTTP)的。
1.2. 什麼是Servlet容器
Servlet容器和Web服務器或者應用服務器一起提供網絡服務,能解析MIME編碼的請求,能生成MIME編碼格式的相應。容器還負責容納servlet,並對其生命週期進行管理。
Servlet容器可以內置在Web服務器中,也可以通過web服務器的擴展API作爲附加組件安裝。Servlet容器同樣可以作爲具體Web服務功能的應用服務器的內置模塊或者附加組件。
所有的Servlet容器必須支持HTTP協議,並可以支持其他基於請求-相應模式的協議,例如HTTPS。Servlet容器至少需要支持HTTP 1.0版本,並強烈建議同時支持HTTP 1.1版本。
Servlet容易可以對servlet的運行環境設置安全限制。在J2SE1.2或者J2EE 1.2環境下,這些限制條件應當使用Java2平臺所提供的授權框架來實現。例如,high end application servers 會限制某些操作,例如創建Thread對象,來保證容器的其他組件不會收到負面影響。
1.3. 一個例子
客戶端程序,如Web瀏覽器,使用HTTP請求來訪問Web服務器。請求首先被Web服務器處理,並被轉交給Servlet容器。Servlet根據內部配置決定調用哪一個servlet,並在調用時將代表request和response的對象傳遞給它。Servlet容器可以與Web服務器運行在同一個進程中,同一個主機的不同進程中,或者運行在不同的主機中。
Servlet通過request對象知道誰是遠程對象,哪些HTML表單參數作爲request的一部分被髮送,以及其他相關的數據。Servlet可以執行程序設定的各種邏輯,生成發還給客戶端的數據,並通過response對象將這些數據發還給客戶端。
一旦servlet完成對request的處理,servlet容器需要保證response內容被正確刷新,並將控制返還給Web服務器。
1.4. Servlet和其他技術的比較
從功能性的角度,Servlet介於CGI程序和私有服務器擴展(例如Netscape服務器API-NSAPI,Apache模塊)之間。
相對於其他的服務器擴展機制,Servlet具備如下優點:
l 由於使用了不同的進程模型,其速度遠遠超過CGI腳本
l 使用標準API,這些API得到大量Web服務器的支持
l 擁有Java編程預言的所有有點,包括易於開發,平臺無關性
l 可以使用Java平臺所提供的大量API
1.5. Servlet和J2EE的關係
Servlet API是Java 2 平臺企業版 1.2版本所需要的API。J2EE規範描述了對servlet和servlet容易的附加要求。Servlet應當被部署到容器中,而容器和servlet則都運行在J2EE環境中。
1.6. 可分佈的Servlet容器
在這個版本的規範中,增加了一個特性:將一個Web應用標記爲可分佈。這個標記允許servlet容器提供商將一個Web應用的servlet部署在多個Java虛擬機中,而這些虛擬機可以運行在同一臺主機上,也可以運行在不同的主機上。一個被標記爲可分佈的應用必須遵循一些限制條件,使得支持分佈式應用的容器能實現集羣、失效轉移等特性。
高性能的環境支持可擴展性、集羣、失效轉移(J2EE兼容)。所有需要在高性能的環境下運行的Web應用,應當設計實現成爲可發佈的Web應用,這使得應用可以最大程度地利用服務器所提供的特性。如果一個不可分佈的應用部署在這樣一個服務器上,則不能充分利用服務器提供的特性。
1.7. 自2.1版本之後的變動
自2.1版正式發佈之後,對本規範的主要變動如下:
l Web應用的概念的介紹
l web application archive files的介紹
l Response buffering(響應緩存)的介紹
l 可分佈servlet的介紹
l 增加通過名稱獲取RequestDispatcher的功能
l 增加通過相對路徑獲取RequestDispatcher的功能
l 改進國際化
l 對於分佈式servlet引擎語義的一些澄清
對API做了如下變動:
l ServletConfig接口添加了getServletName方法,用於獲取在系統中表示本servlet的名稱
l ServletContext接口添加getInitParameter,getInitParameterNames這兩個方法,使初始化參數能在應用層面被設置,並被改應用的所有servlet所共享
l ServletRequest接口添加getLocale方法,幫助決定客戶端當前在哪個locale
l ServletRequest接口添加isSecure方法,用於標識request是否通過安全的方式進行傳輸,例如使用HTTPS協議
l 修改了UnavailableException類的構造函數。因爲現有的構造器方面參數簽名容易被開發人員混淆。修改之後的構造器使用了更簡單的參數簽名。
l HttpServletRequest接口添加getHeaders方法,用於獲取在request中,所有用某個名稱標識的頭信息
l HttpServletRequest添加isUserInRole、getUserPrinciple兩個方法,使servlet可以使用基於抽象角色的認證
l HttpServletResponse接口添加addHeader、addIntHeader、addDateHeader三個方法,允許使用同一個名字,創建多個頭信息
l HttpSession接口添加getAttribute、getAttributeNames、setAttribute、removeAttribute四個方法,以改進API的命名規範,相應地,getValue,、getValueNames,、setValue、removeValue這四個方法被廢棄。
此外,還增加了大量概念的說明和澄清。