一: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)
{
}
}