Servlet是使用Java Servlet應用程式設計介面及相關類和方法的Java程式。
Servlet通過建立一個架構擴充伺服器的能力,採用要求-回應模式提供Web服務。當客戶機發送請求至伺服器時,伺服器將請求資訊發送給Servlet,Servlet產生響應內容並將其傳給Server,然後再由Server將響應返回給用戶端。
一、Servlet的功能:
1、建立並返回一個包含基於客戶請求性質的動態內容的完整的 HTML頁面。
2、建立可嵌入到現有 HTML 頁面中的一部分HTML 頁面(HTML 片段)。與其他伺服器資源(檔案、資料庫、Applet、Java應用程式等)進行通訊。
3、接受多個客戶機的輸入,並將結果廣播到多個客戶機上。例如,Servlet 可以是多參與者的遊戲伺服器。
4、對特殊的處理採用 MIME 類型過濾資料,例像轉換和伺服器端(包括SSI)。
二、servlet容器:
負責處理客戶請求、把請求傳送給servlet並把結果返回給客戶。不同程式的容器實際實現可能有所變化,但容器與servlet之間的介面是由Servlet API定義好的,這個介面定義了servlet容器在servlet上要調用的方法及傳遞給servlet的對象類。
三、servlet的生命週期:
1、servlet容器建立servlet的一個執行個體
2、容器調用該執行個體的init()方法
3、如果容器對該servlet有請求,則調用此執行個體的service()方法
4、容器在銷毀本執行個體前調用它的destroy()方法
一旦請求了一個servlet,就沒有辦法阻止容器執行一個完整的生命週期。
四、Servlet API
1、servlet介面:
public interface Servlet
它的生命週期由javax.servlet.servlet介面定義。當你在寫servlet的時候必須直接或間接的實現這個介面。一般趨向於間接實現:通過從javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。
在實現servlet介面時必須實現它的五個方法:
init():
public void init(ServletConfig config) throws ServletException
一旦對servlet執行個體化後,容器就調用此方法。容器把一個ServletConfig對象傳統給此方法,這樣servlet的執行個體就可以把與容器相關的配置資料儲存起來供以後使用。如果此方法沒有正常結束就會拋出一個ServletException。一旦拋出該異常,servlet就不再執行,而隨後對它的調用會導致容器對它重新載入並再次運行此方法。介面規定對任何servlet執行個體,此方法只能被調用一次,在任何請求傳遞給servlet之前,此方法可以在不拋出異常的情況下運行完畢。
service():
public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException
只有成功初始化後此方法才能被調用處理使用者請求。前一個參數提供訪問初始請求資料的方法和欄位,後一個提供servlet構造響應的方法。
destroy():
public void destroy()
容器可以在任何時候終止servlet服務。容器調用此方法前必須給service()線程足夠時間來結束執行,因此介面規定當service()正在執行時destroy()不被執行。
getServletConfig():
public ServletConfig getServletConfig()
在servlet初始化時,容器傳遞進來一個ServletConfig對象並儲存在servlet執行個體中,該對象允許訪問兩項內容:初始化參數和ServletContext對象,前者通常由容器在檔案中指定,允許在運行時向sevrlet傳遞有關調度資訊,後者為servlet提供有關容器的資訊。此方法可以讓servlet在任何時候獲得該對象及配置資訊。
getServletInfo():
public String getServletInfo()
此方法返回一個String對象,該對象包含servlet的資訊,例如開發人員、建立日期、描述資訊等。該方法也可用於容器。
2、HttpServlet類
該類擴充了GenericServlet類並對servlet介面提供了與HTTP更相關的實現。
service():
protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
public void service(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
該方法作為HTTP請求的分發器,這個方法在任何時候都不能被重載。當請求到來時,service()方法決定請求的類型(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),並把請求分發給相應的處理方法(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每個do方法具有和第一個service()相同的形式。為了響應特定類型的HTTP請求,我們必須重載相應的do方法。如果servlet收到一個HTTP請求而你沒有重載相應的do方法,它就返回一個說明此方法對本資源停用標準HTTP錯誤。
getLatModified():
protected long getLastModified(HttpServletRequest req)
該方法返回以毫秒為單位的的自GMT時間1970年1月1日0時0分0秒依賴的最近一次修改servlet的時間,預設是返回一個負數表示時間未知。當處理GET請求時,調用此方法可以知道servlet的最近修改時間,伺服器就可決定是否把結果從緩衝中去掉。
3、HttpServletRequest介面
public interface HttpServletRequest extends ServletRequest
所有實現此介面的對象(例如從servlet容器傳遞的HTTP請求對象)都能讓servlet通過自己的方法訪問所有請求的資料。下面是一些用來擷取表單資料的基本方法。
getParameter()
public String getParameter(String key)
此方法試圖將根據查詢串中的關鍵字定位對應的參數並返回其值。如果有多個值則返回列表中的第一個值。
getParameterValues():
public String[] getParameterValues(String key)
如果一個參數可以返回多個值,比如複選框集合,則可以用此方法獲得對應參數的所有值。
getParameterNames():
Public Enumeration getParameterNames()
此方法返回一個Enumeration對象,包含對應請求的所有參數名字列表。
4、HttpServletResponse介面
public interface HttpServletResponse extends servletResponse
servlet容器提供一個實現該介面的對象並通過service()方法將它傳遞給servlet。通過此對象及其方法,servlet可以修改回應標頭並返回結果。
setContentType():
public void setContentType(String type)
在給調用者發迴響應前,必須用此方法來設定HTTP響應的MIME類型。可以是任何有效MIME類型,當給瀏覽器返回HTML是就是”text/html”類型。
getWriter():
public PrintWriter getWriter()throws IOException
此方法將返回PrintWriter對象,把servlet的結果作為文本返回給調用者。PrintWriter對象自動把Java內部的UniCode編碼字元轉換成正確的編碼以使用戶端能夠閱讀。
getOutputStream():
public ServletOutputStream getOutputStream() throws IOException
此方法返回ServletOutputStream對象,它是java.io.OutputStream的一個子類。此對象向客戶發送位元據。
setHeader():
public void setHeader(String name,String value)
此方法用來設定送回給客戶的HTTP回應標頭。有一些快捷的方法用來改變某些常用的回應標頭,但有時也需要直接調用此方法。
servlet的效能和效率
一個servlet僅被初始化一次而執行多次,因此極小的低效性也會隨著時間的增加而產生很很大的影響。在代碼中需要考慮String對象的使用,如果產生HTML響應需要用到很多字串時,不應該為每一個字串產生一個String對象,因為這會產生大量的String和StringBuffer對象,造成大量的物件建構消耗和垃圾收集負擔,解決的辦法是一行一行的把所有需要寫入的直接寫入PrintWriter中,或者建立一個StringBuffer對象,並使用append()方法將文本加入。
及時回送
有時,程式需要花費很長時間執行,在這種情況下應該回送給用戶端一些資訊,而不是長時間顯示白屏,這可以在執行到一定程度就回送一些東西,可以使用PrintWriter的flush()方法強制將現有的內容回送給瀏覽器。
具體關於servlet啟動並執行例子,參看
http://blog.csdn.net/wasingmon/archive/2006/01/10/575703.aspx
END!