天天看點

Servlet中使用到的模式

一:Servlet簡介 

Servlet的最廣泛用途是建造動态的網頁,沒有Servlet或相應的動态技術(如CGI,ASP,JSP),一個Web伺服器隻能提供靜态的網頁,不能針對使用者的請求提供相應的伺服器端的操作,如查詢資料庫并根據查詢結果構造一個新的結果網頁等.所有的Servlet必須遵循Java Servlet API,這個API是由兩個庫包及一系列類組成的: 

javax.servlet:這個庫包提供了普通Servlet模型 

javax.servlet.http:這個庫包提供了http和https的Servlet模式 

普通的Servlet模型隻是假定協定是建立在TCP/IP之上的,并沒有對請求-回答(request-response)的協定(protocol) 作出任何具體的假設,所有與http和https有關的邏輯均在javax .servlet.http庫裡面,這種辦法可以最大程度上把可能發生變化的部分與一般邏輯分開。 

二:Servlet的主要類 

servlet庫中有三個類提供了主要的Servlet技術的架構,這三個類是:Servlet接口,GenericServlet類和 HttpServlet類: 

(A)Servlet接口聲明了三個方法,init(),destroy()和service()方法,這三個方法決定了Servlet的生命周期 

(B)GenericServlet是一個抽象類,它提供了Servlet接口的預設實作,但是卻留下一個service()方法,這個方法仍然是一個抽象方法,任何個體的Servlet類均必須提供service()方法,以便提供必要的具體行為. 

(C)HttpServlet類繼承自GenericServlet,雖然它本身也是一個抽象類,但是它為所有行為包括service和七個do方法都提供了預設的實作:doGet,doHead,doPost,doPut,doDelete,doOption,doTrace,這七個do方法基本涵蓋了 http協定的各種請求的種類. 

三:HttpServlet的生命周期 

Servlet的生命周期描述一個Servlet如何被加載和被初始化,它是怎麼樣接收請求,響應請求以提供服務,java的HttpServlet類必須在一個Servlet引擎所提供的容器環境裡面運作,是以,它的生命周期是由容器環境管理的. 

Servlet生命周期由接口javax.servlet.Servlet所定義,所有的Servlet必須實作它才能在Servlet容器環境裡面運作.它的生命周其大概如下: 

(A)加載:Servlet容器可以同時建立一個或多個Servlet執行個體,這個過程可以在Servlet容器加載Servlet類時執行,或者在 Servlet對象響應請求時執行,也可以在兩者之間的任何時候執行. 

(B)初始化:Servlet容器調用一個init()方法将此Servlet初始化,初始化時,Servlet對象可以從資料庫中讀取初始資料,建立 Connection,或者建立對其他有價值的資源的引用. 

(C)就緒:Servlet被初始化後,處于能響應請求的就緒狀态,當用戶端有一個請求時,Servlet容器将SevletRequest和 ServletResponse對象都轉發給Servlet,這兩個對象以參數的形式傳給service方法,這樣,service方法會進一步調用 doGet和doPost等方法處理相應的http處理請求 

(D)釋放:調用destroy()方法,系統将釋放相應的資源,所有失去引用的Java對象都會被垃圾收集器收集. 

四:模闆方法模式的使用 

Servlet在幾個地方法采用了模闆方法模式的設計 

(A)service()方法是一個模闆方法,這個方法調用了七個do方法中的一個或幾個,完成對用戶端的請求,下面是示意源碼: 

protexted void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{

String method = req.getMethod(); 

if(method.equals("GET")){ 

}else if(method.equals("POST")){ 

...... 

當然,這個service方法可以被子類置換掉. 

五:觀察者模式的應用 

Servlet引擎的事件可以分成Servlet環境事件和Session事件兩種,通過Servlet引擎的事件機制可以做如下的工作:

(A)管理資料庫的各種資源的使用和釋放 

(B)建立計數機制 

(C)監視Http Session的狀态及屬性 

Servlet引擎的事件機制與AWT和Swing庫中的事件模型是一樣的事件委派模型。 

(1)Servlet環境事件 

當Servlet環境被建立,關閉,或者一個屬性被加入到環境裡,一個已經在環境裡的屬性被删除或修改時,都會産生Servlet事件: 

事件類型接口方法 

servlet環境被建立javax.servlet.ServletContextListener contextInitialized 

Servlet環境被關閉javax.servlet.ServletContextListener contextDestroyed 

........................ 

(2)Session的事件 

當Session被激活,鈍化,或者一個屬性被加入到Session對象裡,一個已經在Session裡的屬性被删除或者修改時,都會産生Session 事件,下面的表給出了Session事件的清單,每一個事件對應的事件監聽器(listener)接口,以及所對應的方法: 

事件類型接口方法 

一個session被激活javax.servlet.http.HttpSessionListener sessionCreated 

一個session被鈍化javax.servlet.http.HttPSessionListener sessionDestroyed 

一個屬性被加入javax.servlet.http.HttpSessionAttributesListener attributeAdded 

............................ 

要對某一個事件做出響應,就要準備一個謂的監聽器,這個類實際上扮演的就是觀察者模式的角色,那麼怎麼才能準備一監聽器類呢? 

(1)針對某個事件的監聽類必須實作所對應的事件接口 

(2)一個監聽器類必須有一個公開的預設構造子 

(3)必須實作監聽器接口所要求的方法 

下面分為Servlet環境的艦艇器和Session屬性監聽器 

import javax.servlet.*; 

public final class myListener implements ServletContextListener 

     /** This method is called when the servlet context is 

      * initialized(when the Web Application is deployed). 

      * You can initialize servlet context related data here. 

      */ 

     public void contextInitialized(ServletContextEvent event) 

     { 

         //write your code here 

     } 

     /** This method is invoked when the Servlet Context 

      * (the Web Application) is undeployed or 

      * WebLogic Server shuts down. 

      */ 

     public void contextDestroyed(ServletContextEvent event) 

     { 

         //write your code here 

     } 

import javax.servlet.*; 

import javax.servlet.http.HttpSessionAttributeListener; 

import javax.servlet.http.HttpSessionBindingEvent; 

public final class myListener implements HttpSessionAttributeListener 

     /** This method is called when an attribute 

      *﹛is added to a session. 

      */ 

     public void attributeAdded(HttpSessionBindingEvent sbe) 

     { 

     } 

     /** This method is called when an attribute 

      * is removed from a session. 

      */ 

     public void attributeRemoved(HttpSessionBindingEvent sbe) 

     { 

     } 

     /** This method is invoked when an attibute 

      * is replaced in a session. 

      */ 

     public void attributeReplaced(HttpSessionBindingEvent sbe) 

     { 

     } 

}