本文介紹一個簡單?servlet?容器的基本原理。
Servlet容器工作原理講解本文介紹一個簡單?servlet?容器的基本原理。現有兩個servlet容器,第一個很簡單,第二個則是根據第一個寫出。為了使第一個容器盡量簡單,所以沒有做得很完整。復雜一些的?servlet容器(包括TOMCAT4和5)在TOMCAT運行內幕的其他章節有介紹。?
兩個servlet容器都處理簡單的?servlet及staticResource。您可以使用?webroot/?目錄下的?PrimitiveServlet?來測試它。復雜一些的?servlet會超出這些容器的容量,您可以從?TOMCAT?運行內幕?一書學習創建復雜的?servlet?容器。?
兩個應用程序的類都封裝在ex02.pyrmont?包下。在理解應用程序如何運作之前,您必須熟悉?javax.servlet.Servlet?接口。首先就來介紹這個接口。隨后,就介紹servlet容器服務servlet的具體內容。?
javax.servlet.Servlet?接口?
servlet?編程,需要引用以下兩個類和接口:javax.servlet?和?javax.servlet.http,在這些類和接口中,javax.servlet.Servlet接口尤為重要。所有的?servlet?必須實現這個接口或繼承已實現這個接口的類。?
Servlet?接口有五個方法,如下?
public?void?init(ServletConfig?config)?throws?ServletException
public?void?service(ServletRequest?request,?ServletResponse?response)throws?ServletException,?java.io.IOException??
public?void?destroy()??
public?ServletConfig?getServletConfig()??
public?java.lang.String?getServletInfo()init、?service和?destroy?方法是?Servlet?生命周期的方法。當?Servlet?類實例化后,容器加載?init,以通知?servlet?它已進入服務行列。init?方法必須被加載,Servelt?才能接收和請求。如果要載入數據庫驅動程序、初始化一些值等等,程序員可以重寫這個方法。在其他情況下,這個方法一般為空。?
service?方法由?Servlet?容器調用,以允許?Servlet?響應一個請求。Servlet?容器傳遞?javax.servlet.ServletRequest?對象和?javax.servlet.ServletResponse?對象。ServletRequest?對象包含客戶端?HTTP?請求信息,ServletResponse?則封裝servlet?響應。這兩個對象,您可以寫一些需要?servlet?怎樣服務和客戶怎樣請求的代碼。?
從service中刪除Servlet實例之前,容器調用destroy方法。在servlet容器關閉或servlet容器需要更多的內存時,就調用它。這個方法只有在servlet的?service方法內的所有線程都退出的時候,或在超時的時候才會被調用。在?servlet?容器調用?destroy方法之后,它將不再調用servlet的service方法。destroy?方法給了?servlet?機會,來清除所有候住的資源(比如:內存,文件處理和線程),以確保在內存中所有的持續狀態和?servlet的當前狀態是同步的。Listing?2.1?包含了PrimitiveServlet?的代碼,此servlet非常簡單,您?可以用它來測試本文中的servlet容器應用程序。?
PrimitiveServlet?類實現了javax.servlet.Servlet?并提供了五個servlet方法的接口?。它做的事情也很簡單:每次調用?init,service?或?destroy方法的時候,servlet就向控制口寫入方法名。service?方法也從ServletResponsec對象中獲得java.io.PrintWriter?對象,并發送字符串到瀏覽器。?
Listing?2.1.PrimitiveServlet.java
import?javax.servlet.*;
import?java.io.IOException;
import?java.io.PrintWriter;
public?class?PrimitiveServlet?implements?Servlet?{?
public?void?init(ServletConfig?config)?throws?ServletException?{
???System.out.println("init");
????}?
public?void?service(ServletRequest?request,?ServletResponse??response)?throws?ServletException,?IOException?{
??????System.out.println("from?service");
??????PrintWriter?out?=?response.getWriter();
??????out.println("Hello.Roses?are?red.");
??????out.print("Violets?are?blue.");
????}?
public?void?destroy()?{
????System.out.println("destroy");
????}
public?String?getServletInfo()?{
???return?null;????
????}?
public?ServletConfig?getServletConfig()?{
????return?null;
????}
}?
Application?1?
現在,我們從?servlet容器的角度來看看?servlet?編程。一個功能健全的?servlet容器對于每個?servlet?的HTTP請求會完成以下事情:?
當servlet?第一次被調用的時候,加載了?servlet類并調用它的init方法(僅調用一次)?
響應每次請求的時候?,構建一個javax.servlet.ServletRequest?和?javax.servlet.ServletResponse實例。?
激活servlet的service方法,傳遞?ServletRequest?和?ServletResponse?對象。?
當servlet類關閉的時候,調用servlet的destroy方法,并卸載servlet類。?
發生在?servlet?容器內部的事就復雜多了。只是這個簡單的servlet容器的功能不很健全,所以,這它只能運行非常簡單的servelt?,并不能調用servlet的init和destroy方法。然而,它也執行了以下動作:?
等待HTTP請求。?
構建ServletRequest和ServletResponse對象?
如果請求的是一個staticResource,就會激活StaticResourceProcessor實例的?process方法,傳遞ServletRequest?和?ServletResponse?對象。?
如果請求的是一個servlet?,載入該類,并激活它的service方法,傳遞ServletRequest和ServletResponse?對象。注意:在這個servlet?容器,每當?servlet被請求的時候該類就被載入。?
在第一個應用程序中,servlet容器由六個類組成?。?
HttpServer1?
Request?
Response?
StaticResourceProcessor?
ServletProcessor1?
Constants?證如前文中的應用程序一樣,這個程序的進入口(靜態?main?方法)是HttpServer?類。這個方法創建了HttpServer實例,并調用它的await方法。這個方法等待?HTTP?請示,然后創建一個?request?對象和?response對象,根據請求是否是staticResource還是?servlet?來分派它們到?StaticResourceProcessor實例或ServletProcessor實例。?
Constants?類包含?static?find?WEB_ROOT,它是從其他類引用的。?WEB_ROOT?指明?PrimitiveServlet?位置?和容器服務的staticResource。?
HttpServer1?實例等待?HTTP?請求,直到它收到一個?shutdown?命令。發布?shutdown命令和前文是一樣的。
posted on 2006-12-06 12:36
matthew 閱讀(382)
評論(0) 編輯 收藏 所屬分類:
JavaEE