隨筆 - 14, 文章 - 39, 評論 - 17, 引用 - 0
          數據加載中……

          Servlet 2.1規范概述(中文版)『轉』

          1概述
          和傳統的Server端擴展機制相比,Servlet有如下優點:
          1. 比CGI腳本快,因為Servlet采用了不同的處理模式。
          2. Servlet使用的標準API為大多數Web Server所接受。
          3. 因為是Java語言開發的,所以擁有Java的所有優點,包括易于開發和平臺無關等。
          4. 可以方便地訪問大量的Java類庫資源。

          2 Servlet生命周期
          一個Servlet有一個生命周期,定義了一個Servlet 如何被加載和被初始化,它怎樣接收請求、響應請求、怎樣提供服務。

          在代碼中,Servlet生命周期由接口:javax.servlet.Servlet 所定義。 所有的Java Servlet 必須,直接或間接地實現javax.servlet.Servlet接口,這樣才能在Servlet Engine上運行。Servlet Engine提供network Service, 響應MIME request, 運行Servlet Container。 javax.servlet.Servlet接口定義了一些方法,在Servlet 的生命同期中這些方法會在特定時間按照一定的順序被調用。如下圖:

          2.1 Servlet 如何被加載(Load),被實例化(Instantiated)
          Servlet Engine 負責實例化和加載Servlet,這個過程可以在Servlet Engine 加載時執行,可以在Servlet 響應請求時執行,也可以在兩者之間的任何時候執行。

          2.2 Servlet如何被初始化(Initialized)
          Servlet Engine 加載好Servlet 后,必須要初始化它。初始化時Servlet 可以從數據庫里讀取初始數據,建立JDBC Connection,或者建立對其它有價值的資源的引用。
          在初始化階段,Init( )方法被調用。這個方法在javax.servlet.Serlet接口中定義。Init( )方法以一個Servlet 配置文件(ServletConfig 型)為參數。Servlet configuration 對象由Servlet Engine 實現,可以讓Servlet 從中讀取一些name-value對的參數值。ServletConfig對象還可以讓Servlet access 一個Servlet Context對象。

          2.3 Servlet 如何處理請求
          Servlet 被初始化以后,就處于能響應請求的就緒狀態。每個對Servlet 的請求由一個Servlet Request 對象代表。Servlet 給客戶端的響應由一個Servlet Response對象代表。
          當客戶端有一個請求時,Servlet Engine 將ServletRequest 和ServletResponse對象都轉發給Servlet,這兩個對象以參數的形式傳給Service方法。這個方法由javax.servlet.Servlet定義、并由具體的Servlet 實現。
          Servlet還可以實現 ServletRequest 和ServletResponse接口。ServletRequest接口可以讓Servlet 獲取客戶端請求中的參數。如form data, request信息,協議類型等等。Servlet 可以從ServletInputStream流中讀取request 數據。ServletResponse接口允許Servlet設置response headers和status codes 。實現這個接口可以使Servlet能訪問ServletOutputStream流用來向客戶端返回數據。

          2.4 多線程和映射(Mapping)
          在多線程環境中,大多數Servlet 必須能處理同時發生的多個請求。但一種情況例外,就是當一個Servlet 實現了 SingleThreadModel接口,這樣的Servlet 只會響應同一時間的一個請求。
          Servlet根據Servlet Engine 的Mapping 來響應客戶端請求、Mapping將URL和Servlet實例相對應。比如:/hello/index.html可以對應HelloServlet。 然而,一個對應也可以將一個URL和多個Servlet實例相對應。比如,一個分布式的Servlet Engine 運行在多臺機器上時, 同一個Servlet 可以有多個實例運行在不同的服務器上,以均衡處理的負載。作為一個Servlet 開發者。你不能假定Servlet將來只有一個實例。

          2.5 Servlet如何被釋放
          Servlet Engine 沒有必要在Servlet 生命周期的每一段時間內都保持Servlet的狀態。Servlet Engine可以隨時隨意使用或釋放Servlet。因此,你不能依賴Servlet class或其成員來存貯信息。
          當Servlet Engine 判斷一個Servlet應當被釋放時,(比如說engine準備Shut down 或需要回收資源)engine必須讓Servlet 能釋放其正在使用的任何資源,并保存持續性的狀態信息。這些可以通過調用Servlet的destroy方法來實現。
          當Servlet Engine 釋放一個servlet 以前必須讓其完成當前實例的service方法或是等到timeout(如果engine定義了timeout)。當engine釋放一個Servlet以后,engine將不能再將請求轉發給它,engine必須徹底釋放該servlet并將其標明為可回收的(給garbage collection)。

          3 Servlet Mapping技術
          作為一個Servlet Engine 開發者,你可以隨意規定如何將客戶端的請求映射到Servlets。Specification本身并不強制這種規則,然而你可以使用下面任何一種建議:

          1. 你可以使一個servlet 只和一個URL對應。 如:URL/feedback/index.html對應feedBack class。
          2. 可以認為指定的某些目錄下全是Servlet。
          3. 可以指定以特殊的后綴名結尾的請求為Servlet請求。 如:*.thtml認為是Servlet。
          4. 使用特定的URL:/servlet/servlet_name.
          5. 可以直接用Servlet的class名來激活它。 如:/servlet/com.foo.servlet.MailServlet.

          4 Servlet Context ServletContext 接口
          定義了一個Servlet context 對象,保存著Servlet engine 的信息。通過Servlet context, Servlet 可以記日志文件,可以獲取資源和對象(比如RequestDispatcher)。一個Servlet 只能在一個Servlet context 下運行,但不同的Servlet能擁有Servlet Engine 的不同視圖。
          如果一個Servlet Engine支持虛擬主機,每個虛擬主機擁有一個Servlet context,它不能被多個虛擬主機共享。
          Servlet Engine 可以讓Servlet Context擁有自己的范圍,就象作為URL的一部分。如一個Servlet Context 屬于一個銀行應用,可以被映射到/bank,這時一個getContext請求(由/bank/fooServlet發出)將返回/bank的Servlet Context。

          5 HTTP Sessions
          HTTP是一個stateless的協議,為了建立有效的Web Server Application, 你必須能識別來自遠程客戶端的眾多請求中哪些是屬于同一個客戶端的。有許多追蹤session的方法,但都很復雜,難于使用。
          但是Java Servlet API提供了一個簡單的接口,允許Servlet Engine來通過任何途徑追蹤一個用戶的session。

          5.1創建一個session
          因為HTTP是一種"請求--應答"式的協議。一個session總是被認為是新的,直到有客戶端join進來。Join意思是客戶端向Server端返回了session的追蹤信息,指明了session已經被建立。
          如果客戶端沒有join一個session,你就不能假定接下來的客戶端響應是屬于當前的session。
          如果有下述情況出現session就被認為是新的:
          1.客戶端還不知道任何關于此session的信息。
          2. 客戶端選擇不加入session,比如客戶端拒絕接受cookies。
          作為一個servlet開發者,你必須設計Web Application能處理客戶端沒有或不能加入一個session的情況。Server將保持session對象一段時間,這個時間可以由Server或Servlet指定。當一個session過期后,Server將釋放session對象和其它與之綁定在一起的所有對象。

          5.2 綁定對象到一個session
          如果有需要,比如能幫助你處理應用中的數據需要,你可能會綁定一些對象到一個session中。你可以綁定任何對象到HttpSession對象中,只要用唯一的標識名。任何綁定到session中的對象對其它任何一個處理同一個session中的請求的Servlet來講,都是可見的。一些對象需要知道自己什么時候被放入或移出一個session,你可以通過HttpSession Binding Listener接口來獲得這些信息。當你的servlet在session中存儲或釋放數據時,servlet engine檢查對象是否通過實現Http Session Binding Listener的類來綁定,如果是,接口中的方法將通知對象,它已被綁定。

          posted on 2006-12-07 22:00 mlw2000 閱讀(233) 評論(0)  編輯  收藏 所屬分類: jsp


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 庄浪县| 黑山县| 杂多县| 全州县| 平江县| 社旗县| 翁牛特旗| 武宣县| 陇西县| 中超| 长乐市| 博湖县| 唐海县| 锦州市| 玛多县| 汪清县| 阿鲁科尔沁旗| 台前县| 衢州市| 共和县| 耒阳市| 石河子市| 高邮市| 怀仁县| 冷水江市| 大余县| 东乡| 巴东县| 西乡县| 临汾市| 双流县| 阳原县| 巴彦淖尔市| 宣化县| 常山县| 双城市| 馆陶县| 通渭县| 玉山县| 平顶山市| 丁青县|