Servlet簡介 (轉)
簡介
servlet容器::namespace prefix = o ns = "urn:schemas--com::office" />
負責處理客戶請求、把請求傳送給servlet並把結果返回給客戶。不同的容器實際實現可能有所變化,但容器與servlet之間的介面是由servlet定義好的,這個介面定義了servlet容器在servlet上要的方法及傳遞給servlet的類。
servlet的生命週期:
l servlet容器建立servlet的一個例項
l 容器呼叫該例項的init()方法
l 如果容器對該servlet有請求,則呼叫此例項的service()方法
l 容器在銷燬本例項前呼叫它的destroy()方法
l 銷燬並標記該例項以供作為垃圾收集
一旦請求了一個servlet,就沒有辦法阻止容器一個完整的生命週期。
容器在servlet首次被呼叫時建立它的一個例項,並保持該例項在中,讓它對所有的請求進行處理。容器可以決定在任何時候把這個例項從記憶體中移走。在典型的模型中,容器為每個servlet建立一個單獨的例項,容器並不會每接到一個請求就建立一個新執行緒,而是使用一個執行緒池來動態的將執行緒分配給到來的請求,但是這從servlet的觀點來看,效果和為每個請求建立一個新執行緒的效果相同。
servlet API
servlet介面:
public interface Servlet
它的生命週期由x.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的資訊,例如開發者、建立日期、描述資訊等。該方法也可用於容器。
GenericServlet類
Public abstract class GenericServlet implants Servlet,ServletConfig,Serializable
此類提供了servlet介面的基本實現部分,其service()方法被申明為abstract,因此需要被派生。init(ServletConfig conf)方法把servletConfig物件在一個private transient(私有臨時)例項變數裡,getServletConfig()方法返回指向本物件的指標,如果你過載此方法,將不能使用getServletConfig來獲得ServletConfig物件,如果確實想過載,記住要包含對super.config的呼叫。2.1版的API提供一個過載的沒有引數的init()方法。現在在init(ServletConfig)方法結束時有一個對init()的呼叫,儘管目前它是空的。2.1版API裡面,此類實現了ServletConfig介面,這使得開發者不用獲得ServletConfig物件情況下直接呼叫ServletConfig的方法,這些方法是:getInitParameter(),getInitParameterNames(),getServletContext。此類還包含兩個寫日誌的方法,它們實際上呼叫的是ServletContext上的對應方法。log(String msg)方法將servlet的名稱和msg引數寫到容器的日誌中,log(String msg,Throwable cause)除了包含servlet外還包含一個異常。
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(),dtions(),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的最近修改時間,就可決定是否把結果從快取中去掉。
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物件,包含對應請求的所有引數名字列表。
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響應頭。有一些快捷的方法用來改變某些常用的響應頭,但有時也需要直接呼叫此方法。
編譯條件
需要從 獲得一份JSDK的複製,並把servlet.jar移動到目錄下的libext目錄下。如果是JDK1.1,則移動到lib下,並在CLASSPATH中加入servlet.jar的絕對路徑。
執行條件
需要 Jserv,Jrun Servlet Exec,Java Server,,,,Resin等servlet伺服器端程式。
簡單範例
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("");
out.println("
");out.println("
");out.println("
out.println("");
out.println("
");out.println("
Hello World!
");out.println("");
out.println("");
}
}
servlet的和
一個servlet僅被初始化一次而執行多次,因此極小的低效性也會隨著時間的增加而產生很很大的影響。在程式碼中需要考慮String物件的使用,如果產生HTML響應需要用到很多字串時,不應該為每一個字串生成一個String物件,因為這會產生大量的String和StringBuffer物件,造成大量的物件構造消耗和垃圾收集負擔,解決的辦法是一行一行的把所有需要寫入的直接寫入PrintWriter中,或者建立一個StringBuffer物件,並使用append()方法將文字加入。
及時回送
有時,程式需要花費很長時間執行,在這種情況下應該回送給客戶端一些資訊,而不是長時間顯示白屏,這可以在執行到一定程度就回送一些東西,可以使用PrintWriter的flush()方法強制將現有的內容回送給瀏覽器。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1000529/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Servlet簡介及其生命週期詳解Servlet
- [轉]SSH框架簡介框架
- powermt 命令簡介(轉載)
- servlet 轉發與重定向Servlet
- 1.簡易使用ServletServlet
- [轉載]SQLServer之檢視簡介SQLServer
- 數字轉型Digital Transformation簡介GitORM
- 簡單瞭解什麼是ServletServlet
- Servlet 到 Spring MVC 的簡化之路ServletSpringMVC
- JWT簡介:從Session到Token的轉變JWTSession
- servlet的生命週期和工作原理介紹Servlet
- Servlet實現、與html的簡單互動ServletHTML
- 簡介
- Jira使用簡介 HP ALM使用簡介
- Jsp+JavaBean模式,Jsp+Servlet模式,MVC模式介紹JSJavaBean模式ServletMVC
- scRNA_seq:單細胞轉錄組測序簡介
- [轉]Oracle資料庫ASH和AWR的簡單介紹Oracle資料庫
- 簡單介紹最新python 字串陣列互轉問題Python字串陣列
- JSP(ajax)+Servlet實現簡單的登入功能JSServlet
- Servlet系列:(一)servlet原理剖析Servlet
- Servlet 規範和 Servlet 容器Servlet
- BookKeeper 介紹(1)--簡介
- loadsh簡介
- Knative 簡介
- Javascript 簡介JavaScript
- JanusGraph -- 簡介
- Linux簡介Linux
- CSS 簡介CSS
- 反射簡介反射
- CSS簡介CSS
- JUC簡介
- sass簡介
- APIGateway 簡介APIGateway
- Feign簡介
- Django簡介Django
- Virgilio 簡介
- 簡介JSXJS
- LVM : 簡介LVM
- Linux——簡介Linux