Servlet是對支持Java的服務(wù)器的一般擴充。它最常見(jiàn)的用途是擴展Web服務(wù)器,提供非常安全的、可移植的、易于使用的CGI替代品。它是一種動(dòng)態(tài)加載的模塊,為來(lái)自Web服務(wù)器的請求提供服務(wù)。它完全運行在Java虛擬機上。由于它在服務(wù)器端運行,因此它不依賴(lài)于瀏覽器的兼容性。
servlet容器:
負責處理客戶(hù)請求、把請求傳送給servlet并把結果返回給客戶(hù)。不同程序的容器實(shí)際實(shí)現可能有所變化,但容器與servlet之間的接口是由servlet API定義好的,這個(gè)接口定義了servlet容器在servlet上要調用的方法及傳遞給servlet的對象類(lèi)。
servlet的生命周期:
1、servlet容器創(chuàng )建servlet的一個(gè)實(shí)例
2、容器調用該實(shí)例的init()方法
3、如果容器對該servlet有請求,則調用此實(shí)例的service()方法
4、容器在銷(xiāo)毀本實(shí)例前調用它的destroy()方法
5、銷(xiāo)毀并標記該實(shí)例以供作為垃圾收集
一旦請求了一個(gè)servlet,就沒(méi)有辦法阻止容器執行一個(gè)完整的生命周期。
容器在servlet首次被調用時(shí)創(chuàng )建它的一個(gè)實(shí)例,并保持該實(shí)例在內存中,讓它對所有的請求進(jìn)行處理。容器可以決定在任何時(shí)候把這個(gè)實(shí)例從內存中移走。在典型的模型中,容器為每個(gè)servlet創(chuàng )建一個(gè)單獨的實(shí)例,容器并不會(huì )每接到一個(gè)請求就創(chuàng )建一個(gè)新線(xiàn)程,而是使用一個(gè)線(xiàn)程池來(lái)動(dòng)態(tài)的將線(xiàn)程分配給到來(lái)的請求,但是這從servlet的觀(guān)點(diǎn)來(lái)看,效果和為每個(gè)請求創(chuàng )建一個(gè)新線(xiàn)程的效果相同。
servlet API
servlet接口:
public interface Servlet
它的生命周期由javax.servlet.servlet接口定義。當你在寫(xiě)servlet的時(shí)候必須直接或間接的實(shí)現這個(gè)接口。一般趨向于間接實(shí)現:通過(guò)從javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在實(shí)現servlet接口時(shí)必須實(shí)現它的五個(gè)方法:
init():
public void init(ServletConfig config) throws ServletException
一旦對servlet實(shí)例化后,容器就調用此方法。容器把一個(gè)ServletConfig對象傳統給此方法,這樣servlet的實(shí)例就可以把與容器相關(guān)的配置數據保存起來(lái)供以后使用。如果此方法沒(méi)有正常結束就會(huì )拋出一個(gè)ServletException。一旦拋出該異常,servlet就不再執行,而隨后對它的調用會(huì )導致容器對它重新載入并再次運行此方法。接口規定對任何servlet實(shí)例,此方法只能被調用一次,在任何請求傳遞給servlet之前,此方法可以在不拋出異常的情況下運行完畢。
service():
public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException
只有成功初始化后此方法才能被調用處理用戶(hù)請求。前一個(gè)參數提供訪(fǎng)問(wèn)初始請求數據的方法和字段,后一個(gè)提供servlet構造響應的方法。
destroy():
public void destroy()
容器可以在任何時(shí)候終止servlet服務(wù)。容器調用此方法前必須給service()線(xiàn)程足夠時(shí)間來(lái)結束執行,因此接口規定當service()正在執行時(shí)destroy()不被執行。
getServletConfig():
public ServletConfig getServletConfig()
在servlet初始化時(shí),容器傳遞進(jìn)來(lái)一個(gè)ServletConfig對象并保存在servlet實(shí)例中,該對象允許訪(fǎng)問(wèn)兩項內容:初始化參數和ServletContext對象,前者通常由容器在文件中指定,允許在運行時(shí)向sevrlet傳遞有關(guān)調度信息,后者為servlet提供有關(guān)容器的信息。此方法可以讓servlet在任何時(shí)候獲得該對象及配置信息。
getServletInfo():
public String getServletInfo()
此方法返回一個(gè)String對象,該對象包含servlet的信息,例如開(kāi)發(fā)者、創(chuàng )建日期、描述信息等。該方法也可用于容器。
GenericServlet類(lèi)
Public abstract class GenericServlet implants Servlet,ServletConfig,Serializable
此類(lèi)提供了servlet接口的基本實(shí)現部分,其service()方法被申明為abstract,因此需要被派生。init(ServletConfig conf)方法把servletConfig對象存儲在一個(gè)private transient(私有臨時(shí))實(shí)例變量里,getServletConfig()方法返回指向本對象的指針,如果你重載此方法,將不能使用getServletConfig來(lái)獲得ServletConfig對象,如果確實(shí)想重載,記住要包含對super.config的調用。2.1版的API提供一個(gè)重載的沒(méi)有參數的init()方法?,F在在init(ServletConfig)方法結束時(shí)有一個(gè)對init()的調用,盡管目前它是空的。2.1版API里面,此類(lèi)實(shí)現了ServletConfig接口,這使得開(kāi)發(fā)者不用獲得ServletConfig對象情況下直接調用ServletConfig的方法,這些方法是:getInitParameter(),getInitParameterNames(),getServletContext。此類(lèi)還包含兩個(gè)寫(xiě)日志的方法,它們實(shí)際上調用的是ServletContext上的對應方法。log(String msg)方法將servlet的名稱(chēng)和msg參數寫(xiě)到容器的日志中,log(String msg,Throwable cause)除了包含servlet外還包含一個(gè)異常。
HttpServlet類(lèi)
該類(lèi)擴展了GenericServlet類(lèi)并對servlet接口提供了與HTTP更相關(guān)的實(shí)現。
service():
protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
public void service(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
該方法作為HTTP請求的分發(fā)器,這個(gè)方法在任何時(shí)候都不能被重載。當請求到來(lái)時(shí),service()方法決定請求的類(lèi)型(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把請求分發(fā)給相應的處理方法(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每個(gè)do方法具有和第一個(gè)service()相同的形式。為了響應特定類(lèi)型的HTTP請求,我們必須重載相應的do方法。如果servlet收到一個(gè)HTTP請求而你沒(méi)有重載相應的do方法,它就返回一個(gè)說(shuō)明此方法對本資源不可用的標準HTTP錯誤。
getLatModified():
protected long getLastModified(HttpServletRequest req)
該方法返回以毫秒為單位的的自GMT時(shí)間1970年1月1日0時(shí)0分0秒依賴(lài)的最近一次修改servlet的時(shí)間,缺省是返回一個(gè)負數表示時(shí)間未知。當處理GET請求時(shí),調用此方法可以知道servlet的最近修改時(shí)間,服務(wù)器就可決定是否把結果從緩存中去掉。
HttpServletRequest接口
public interface HttpServletRequest extends ServletRequest
所有實(shí)現此接口的對象(例如從servlet容器傳遞的HTTP請求對象)都能讓servlet通過(guò)自己的方法訪(fǎng)問(wèn)所有請求的數據。下面是一些用來(lái)獲取表單數據的基本方法。
getParameter()
public String getParameter(String key)
此方法試圖將根據查詢(xún)串中的關(guān)鍵字定位對應的參數并返回其值。如果有多個(gè)值則返回列表中的第一個(gè)值。如果請求信息中沒(méi)有指定參數,則返回null。
getParameterValues():
public String[] getParameterValues(String key)
如果一個(gè)參數可以返回多個(gè)值,比如復選框集合,則可以用此方法獲得對應參數的所有值。如果請求信息中沒(méi)有指定參數,則返回null。
GetParameterNames():
Public Enumeration getParameterNames()
此方法返回一個(gè)Enumeration對象,包含對應請求的所有參數名字列表。
HttpServletResponse接口
public interface HttpServletResponse extends servletResponse
servlet容器提供一個(gè)實(shí)現該接口的對象并通過(guò)service()方法將它傳遞給servlet。通過(guò)此對象及其方法,servlet可以修改響應頭并返回結果。
setContentType():
public void setContentType(String type)
在給調用者發(fā)回響應前,必須用此方法來(lái)設置HTTP響應的MIME類(lèi)型??梢允侨魏斡行У腗IME類(lèi)型,當給瀏覽器返回HTML是就是”text/html”類(lèi)型。
getWriter():
public PrintWriter getWriter()throws IOException
此方法將返回PrintWriter對象,把servlet的結果作為文本返回給調用者。PrintWriter對象自動(dòng)把Java內部的UniCode編碼字符轉換成正確的編碼以使客戶(hù)端能夠閱讀。
getOutputStream():
public ServletOutputStream getOutputStream() throws IOException
此方法返回ServletOutputStream對象,它是java.io.OutputStream的一個(gè)子類(lèi)。此對象向客戶(hù)發(fā)送二進(jìn)制數據。
setHeader():
public void setHeader(String name,String value)
此方法用來(lái)設置送回給客戶(hù)的HTTP響應頭。有一些快捷的方法用來(lái)改變某些常用的響應頭,但有時(shí)也需要直接調用此方法。
編譯條件
需要從http://java.sun.com/products/servlet/ 獲得一份JSDK的拷貝,并把servlet.jar移動(dòng)到JDK安裝目錄下的\jre\lib\ext目錄下。如果是JDK1.1,則移動(dòng)到\lib下,并在CLASSPATH中加入servlet.jar的絕對路徑。
運行條件
需要Apache Jserv,Jrun Servlet Exec,Java Web Server,Weblogic,WebSphere,Tomcat,Resin等servlet服務(wù)器端程序。
簡(jiǎn)單范例
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>"); }}
聯(lián)系客服