Java Servlet API中文說明文檔
目 錄
1.... Servet資料
1.1????? 緒言
1.2????? 誰需要讀這份文檔
1.3????? Java Servlet API的組成
1.4????? 有關規范
1.5????? 有關Java Servlets
1.6????? Java Servlet概論
1.7????? Servlet的生命周期
1.8????? Servlet的解析和載入
1.9????? Servlet的初始化
1.10??? Servlet處理請求
1.11 ? ?多線程和映射
1.12??? Servlet的卸載
1.13??? Servlet映射技術
1.14 ? ?通過類名調用Servlet
1.15??? Servlet環境
1.16??? HTTP會話
1.17 ? ?建立Session
2.... API介紹
2.1????? Request Dispatcher接口
2.2????? Servlet接口
2.3????? ServletConfig接口
2.4????? ServletContext接口
2.5????? ServletRequest接口
2.6????? ServletResponse接口
2.7????? SingleThreadModel接口
2.8????? GenericServlet類
2.9????? ServletInputStream類
2.10??? ServletOutputStream類
2.11??? ServletException類
2.12??? UnavailableException類
2.13??? HttpServletRequest接口
2.14??? HttpServletResponse接口
2.15??? HttpSession接口
2.16??? HttpSessionBindingListener接口
2.17??? HttpSessionContext接口
2.18??? Cookie類
2.19??? HttpServlet類
2.20??? HttpSessionBindingEvent類
2.21??? HttpUtils類
?
1 ?Servet資料
1.1??? 緒言
??? 這是一份關于2.1版Java Servlet API的說明文檔,作為對這本文檔的補充,你可以到http://java.sun.com/products/servlet/index.html下面下載Javadoc格式的文檔。
1.2??? 誰需要讀這份文檔
??? 這份文檔描述了Java Servlet API的最新版本2.1版。所以,這本書對于Servlet的開發者及servlet引擎的開發者同樣適用。
1.3??? Java Servlet API的組成
??? Java Servlet API由兩個軟件包組成:一個是對應HTTP的軟件包,另一個是不對應HTTP的通用的軟件包。這兩個軟件包的同時存在使得Java Servlet API能夠適應將來的其他請求-響應的協議。
??? 這份文檔以及剛才提及的Javadoc格式的文檔都描述了這兩個軟件包,Javadoc格式的文檔還描述了你應該如何使用這兩個軟件包中的所有方法。
1.4??? 有關規范
??? 你也許對下面的這些Internet規范感興趣,這些規范將直接影響到Servlet API的發展和執行。
你可以從http: //info.internet.isi.edu/7c/in-notes/rfc/.cache 找到下面提到的所有這些RFC規范。
?????? RFC 1738 統一資源定位器(URL)
?????? RFC 1808 相關統一資源定位器
?????? RFC 1945 超文本傳輸協議--HTTP/1.0
?????? RFC 2045 多用途Internet郵件擴展(多用途網際郵件擴充協議(MIME))第一部分:Internet信息體格式
?????? RFC 2046 多用途Internet郵件擴展(多用途網際郵件擴充協議(MIME))第二部分:媒體類型
?????? RFC 2047 多用途網際郵件擴充協議(MIME)(多用途Internet郵件擴展)第三部分:信息標題擴展用于非ASCII文本
?????? RFC 2048 多用途Internet郵件擴展(多用途網際郵件擴充協議(MIME))第四部分: 注冊步驟
?????? RFC 2049 多用途Internet郵件擴展(多用途網際郵件擴充協議(MIME))第五部分:一致性標準和例子
?????? RFC 2068 超文本傳輸協議 -- HTTP/1.1
?????? RFC 2069 一個擴展HTTP:摘要訪問鑒定
?????? RFC 2109 HTTP狀態管理機制
?????? RFC 2145 HTTP 版本號的使用和解釋
?????? RFC 2324 超文本Coffee Pot控制協議 (HTCPCP/1.0)
?????? 萬維網協會(http://www.w3.org)管理著這些協議的規范和執行。
1.5??? 有關Java Servlets
??? JavaTM servlets 是一個不受平臺約束的Java小程序,它可以被用來通過多種方法擴充一個Web服務器的功能。你可以把Servlet理解成Server上的 applets,它被編譯成字節碼,這樣它就可以被動態地載入并用效地擴展主機的處理能力。
??? Servlet與applets不同的地方是,它不運行在Web瀏覽器或其他圖形化的用戶界面上。Servlet通過servlet引擎運行在Web服務器中,以執行請求和響應,請求、響應的典型范例是HTTP協議。
??? 一個客戶端程序,可以是一個Web瀏覽器,或者是非其他的可以連接上Internet的程序,它會訪問Web服務器并發出請求。這個請求被運行在Web服 務器上的Servlet引擎處理,并返回響應到Servlet。Servlet通過HTTP將這個響應轉發到客戶端。
在功能上,Servlet與CGI、NSAPI有點類似,但是,與他們不同的是:Servlet具有平臺無關性。
1.6??? Java Servlet概論
????? ?Servlet與其他普通的server擴展機制有以下進步:
?????? 因為它采用了不同的進程處理模式,所以它比CGI更快。
?????? 它使用了許多Web服務器都支持的標準的API。
?????? 它繼承了Java的所有優勢,包括易升級以及平臺無關性。
?????? 它可以調用Java所提供的大量的API的功能模塊。
?????? 這份文檔說明了Java Servlet API的類和接口的方法。有關更多的信息,請參看下面的API說明。
1.7??? Servlet的生命周期
??? 一個Java servlet具有一個生命周期,這個生命周期定義了一個Servlet如何被載入并被初始化,如何接收請求并作出對請求的響應,如何被從服務中清除。Servlet的生命周期被javax.servlet.Servlet這個接口所定義。
??? 所有的Java Servlet都會直接地或間接地執行javax.servlet.Servlet接口,這樣它才能在一個Servlet引擎中運行。 Servlet引擎是Web 服務器按照Java Servlet API定制的擴展。Servlet引擎提供網絡服務,能夠理解MIME請求,并提供一 個運行Servlet的容器。
??? javax.servlet.Servlet接口定義了在Servlet的生命周期中特定時間以及特定順序被調用的方法。
?
1.8??? Servlet的解析和載入
??? Servlet引擎解析并載入一個Servlet,這個過程可以發生在引擎啟動時,需要一個Servlet去響應請求時,以及在此之間的任何時候。
??? Servlet引擎利用Java類載入工具載入一個Servlet,Servlet引擎可以從一個本地的文件系統、一個遠程的文件系統以及網絡載入Servlet。
?
1.9??? Servlet的初始化
??? Servlet引擎載入Servlet后,Servlet引擎必須對Servlet進行初始化,在這一過程中,你可以讀取一些固定存儲的數據、初始化JDBC的連接以及建立與其他資源的連接。
??? 在初始化過程中,javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息。這樣,Servlet可以對自己進行配置。
?????? init()方法獲得了一個Servlet配置對象(ServletConfig)。這個對象在Servlet引擎中執行,并允許Servlet通過它獲處相關參數。這個對象使得Servlet能夠訪問ServletContext對象。
?
1.10 ? ? ? Servlet處理請求
??? Servlet被初始化之后,它已經可以處理來自客戶端的請求,每一個來自客戶端的請求都被描述成一個ServletRequest對象,Servlet的響應被描述成一個ServletResponse對象。
??? 當客戶端發出請求時,Servlet引擎傳遞給Servlet一個ServletRequest對象和一個ServletResponse對象,這兩個對象作為參數傳遞到service()方法中。
??? Servlet 也可以執行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有權使用客戶端發出的請求。Servlet可以通過ServletInputStream對象讀取請求信息。
??? ServletResponse接口允許Servlet建立響應頭和狀態代碼。通過執行這個接口,Servlet有權使用ServletOutputStream類來向客戶端返回數據。
?
1.11?????? 多線程和映射
??? 在多線程的環境下,Servlet必須能處理許多同時發生的請求。例外的情況是這個Servlet執行了SingleThreadModel接口,如果是那樣的話,Servlet只能同時處理一個請求。
??? Servlet依照Servlet引擎的映射來響應客戶端的請求。一個映射對包括一個Servlet實例以及一個Servlet返回數據的URL,例如:HelloServlet with /hello/index.html。
??? 然而,一個映射可能是由一個URL和許多Servlet實例組成,例如:一個分布式的Servlet引擎可能運行在不止一個的服務器中,這樣的話,每一個服務器中都可能有一個Servlet實例,以平衡進程的載入。作為一個Servlet的開發者,你不能假定一個Servlet只有一個實例。
?
1.12?????? Servlet的卸載
??? Servlet引擎并不必需保證一個Servlet在任何時候或在服務開啟的任何時候都被載入。Servlet引擎可以自由的在任何時候使用或清除一個Servlet。因此,我們不能依賴一個類或實例來存儲重要的信息。
??? 當Servlet引擎決定卸載一個Servlet時(例如,如果這個引擎被關閉或者需要讓資源),這個引擎必須允許Servlet釋放正在使用的資源并存儲有關資料。為了完成以上工作,引擎會調用Servlet的destroy()方法。
??? 在卸載一個Servlet之前,Servlet引擎必須等待所有的service()方法完成或超時結束(Servlet引擎會對超時作出定義)。當一個 Servlet被卸載時,引擎將不能給Servlet發送任何請求。引擎必須釋放Servlet并完成無用存儲單元的收集
?
1.13?????? Servlet映射技術
??? 作為一個Servlet引擎的開發者,你必須對于如何映射客戶端的請求到Servlet有大量的適應性。這份說明文檔不規定映射如何發生。但是,你必須能夠自由地運用下面的所有技術:
?
?????? 映射一個Servlet到一個URL
?????? 例如,你可以指定一個特殊的Servlet它僅被來自/feedback/index.html的請求調用。
?
?????? 映射一個Servlet到以一個指定的目錄名開始的所有URL
?????? 例如,你可以映射一個Servlet到/catalog,這樣來自/catalog/、 /catalog/garden和 /catalog/housewares/index.html的請求都會被映射到這個Servlet。但是來自/catalogtwo 或 /catalog.html的請求沒被映射。
?
?????? 映射一個Servlet到所有以一個特定的字段結尾的所有URL
?????? 例如,你可以映射一個來自于所有以in.thtml結尾的請求到一個特定的Servlet。
?
?????? 映射一個Servlet到一個特殊的URL /servlet/servlet_name。
?????? 例如,如果你建立了一個名叫listattributes的Servlet,你可以通過使用/servlet/listattributes來訪問這個Servlet。
?
1.14?????? 通過類名調用Servlet
?????? 例如,如果Servlet引擎接收了來自/servlet/com.foo.servlet.MailServlet的請求,Servlet引擎會載入這 個com.foo.servlet.MailServlet類,建立實例,并通過這個Servlet來處理請求。
?
1.15?????? Servlet環境
??? ServletContext 接口定義了一個Servlet環境對象,這個對象定義了一個在Servlet引擎上的Servlet的視圖。通過使用這個對象,Servlet可以記錄事 件、得到資源并得到來自Servlet引擎的類(例如RequestDispatcher對象)。一個Servlet只能運行在一個Servlet環境 中,但是不同的Servlet可以在Servlet引擎上有不同的視圖。
?????? 如果Servlet引擎支持虛擬主機,每個虛擬主機有一個Servlet環境。一個Servlet環境不能在虛擬主機之間共享。
?????? Servlet引擎能夠允許一個Servlet環境有它自己的活動范圍。
??? ???例如,一個Servlet環境是屬于bank應用的,它將被映射到/bank目錄下。在這種情況下,一個對getContext方法的調用會返回/bank的Servlet環境。
?
1.16?????? HTTP會話
??? HTTP是一個沒有狀態的協議。要建立一個有效的Web服務應用,你必須能夠識別一個連續的來自遠端的客戶機的唯一的請求。隨著時間的過去,發展了許多會話跟蹤的技術,但是使用起來都比較麻煩。
?????? Java Servlet API提供了一個簡單的接口,通過這個接口,Servlet引擎可以有效地跟蹤用戶的會話。
?
1.17?????? 建立Session
??? 因為HTTP是一個請求-響應協議,一個會話在客戶機加入之前會被認為是一個新的會話。加入的意思是返回會話跟蹤信息到服務器中,指出會話已被建立。在客戶端加入之前,我們不能判斷下一個客戶端請求是目前會話的一部分。
在下面的情況下,Session會被認為是新的Session。客戶端的Session在此之前還不知道客戶端選擇不加入Session,例如,如果客戶端拒絕接收來自服務器的cookie作 為一個Servlet的開發者,你必須決定你的Web應用是否處理客戶機不加入或不能加入Session。服務器會在Web服務器或Servlet規定的時間內維持一個Session對象。當Session終止時,服務器會釋放Session對象以及所有綁定在Session上的對象。
綁定對象到Session中
??? 如果有助于你處理應用的數據需求,你也許需要綁定對象到Session中,你可以通過一個唯一的名字綁定任何的對象到Session中,這時,你需要使用 HttpSession對象。任何綁定到Session上的對象都可以被處理同一會話的Servlet調用。
??? 有些對象可能需要你知道什么時候會被放置到Session中或從Session中移開。你可以通過使用HttpSessionBindingListener接口獲得這些信息。當你的應用存儲數據到Session中,或從Session中清除數據,Servlet都會通過HttpSessionBindingListener檢杳什么類被綁定或被取消綁定。這個接口的方法會通報被綁定或被取消綁定的對象。
?
2 ?API介紹
API對象的說明
??? 這一部分包含了對Java Servlet API的全部類和接口的詳細說明。這個說明與Javadoc API差不多,但是這份文檔提供了更多的信息。
API包含了兩個軟件包,十二個接口和九個類。
軟件包:javax.servlet
?所包含的接口:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。
?所包含的類:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。
軟件包:javax.servlet.http
?????? 所包含的接口:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。
?????? 所包含的類:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。
?
所包含的接口:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。
所包含的類:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。
2.1??? Request Dispatcher接口
?????? 定義:
?????? public interface RequestDispatcher;
?????? 定義一個對象,從客戶端接收請求,然后將它發給服務器的可用資源(例如Servlet、CGI、HTML文件、JSP文件)。Servlet引擎創建request dispatcher對象,用于封裝由一個特定的URL定義的服務器資源。
?????? 這個接口是專用于封裝Servlet的,但是一個Servlet引擎可以創建request dispatcher對象用于封裝任何類型的資源。
?????? request dispatcher對象是由Servlet引擎建立的,而不是由Servlet開發者建立的。
?????? 方法
?????? 1、forward
?????? public void forward(ServletRequest request, ServletReponse response)
???????????? throws ServletException, IOException;
?????? 被用來從這個Servlet向其它服務器資源傳遞請求。當一個Servlet對響應作了初步的處理,并要求其它的對象對此作出響應時,可以使用這個方法。
?????? 當request對象被傳遞到目標對象時,請求的URL路徑和其他路徑參數會被調整為反映目標對象的目標URL路徑。
?????? 如果已經通過響應返回了一個ServletOutputStream對象或PrintWriter對象,這個方法將不能使用,否則,這個方法會拋出一個IllegalStateException。
?????? 2、include
?????? public void include(ServletRequest request, ServletResponse response)
???????????? throws ServletException, IOException
?????? 用來包括發送給其他服務器資源的響應的內容。本質上來說,這個方法反映了服務器端的內容。
?????? 請求對象傳到目標對象后會反映調用請求的請求URL路徑和路徑信息。這個響應對象只能調用這個Servlet的ServletOutputStream對象和PrintWriter對象。
?????? 一個調用include的Servlet不能設置頭域,如果這個Servlet調用了必須設置頭域的方法(例如cookie),這個方法將不能保證正常使用。作為一個Servlet開發者,你必須妥善地解決那些可能直接存儲頭域的方法。例如,即使你使用會話跟蹤,為了保證session的正常工作,你必須在一個調用include的Servlet之外開始你的session
?
2.2??? Servlet接口
?????? 定義
?????? public interface Servlet
?????? 這個接口定義了一個Servlet:一個在Web服務器上繼承了這個功能的Java類。
?????? 方法
?????? 1、init
?????? public void init(ServletConfig config) throws ServletException;
?????? Servlet引擎會在Servlet實例化之后,置入服務之前精確地調用init方法。在調用service方法之前,init方法必須成功退出。
?????? 如果init方法拋出一個ServletException,你不能將這個Servlet置入服務中,如果init方法在超時范圍內沒完成,我們也可以假定這個Servlet是不具備功能的,也不能置入服務中。
?????? 2、service
?????? public void service(ServletRequest request, ServletResponse response)
???????????? throws ServletException, IOException;
?????? Servlet引擎調用這個方法以允許Servlet響應請求。這個方法在Servlet未成功初始化之前無法調用。在Servlet被初始化之前,Servlet引擎能夠封鎖未決的請求。
?????? 在一個Servlet對象被卸載后,直到一個新的Servelt被初始化,Servlet引擎不能調用這個方法
?????? 3、destroy
?????? public void destroy();
?????? 當一個Servlet被從服務中去除時,Servlet引擎調用這個方法。在這個對象的service方法所有線程未全部退出或者沒被引擎認為發生超時操作時,destroy方法不能被調用。
?????? 4、getServletConfig
?????? public ServletConfig getServletConfig();
?????? 返回一個ServletConfig對象,作為一個Servlet的開發者,你應該通過init方法存儲ServletConfig對象以便這個方法能返回這個對象。為了你的便利,GenericServlet在執行這個接口時,已經這樣做了。
?????? 5、getServletInfo
?????? public String getServletInfo();
?????? 允許Servlet向主機的Servlet運行者提供有關它本身的信息。返回的字符串應該是純文本格式而不應有任何標志(例如HTML,XML等)。
2.3??? ServletConfig接口
?????? 定義
?????? public interface ServletConfig
?????? 這個接口定義了一個對象,通過這個對象,Servlet引擎配置一個Servlet并且允許Servlet獲得一個有關它的ServletContext接口的說明。每一個ServletConfig對象對應著一個唯一的Servlet。
?????? 方法
?????? 1、getInitParameter
?????? public String getInitParameter(String name);
?????? 這個方法返回一個包含Servlet指定的初始化參數的String。如果這個參數不存在,返加空值。
?????? 2、getInitParameterNames
?????? public Enumeration getInitParameterNames();
?????? 這個方法返回一個列表String對象,該對象包括Servlet的所有初始化參數名。如果Servlet沒有初始化參數,getInitParameterNames返回一個空的列表。
?????? 3、getServletContext
?????? public ServletContext getServletContext();
?????? 返回這個Servlet的ServletContext對象。
?
2.4??? ServletContext接口
?????? 定義
?????? public interface ServletContext
?????? 定義了一個Servlet的環境對象,通過這個對象,Servlet引擎向Servlet提供環境信息。
?????? 一個Servlet的環境對象必須至少與它所駐留的主機是一一對應的。在一個處理多個虛擬主機的Servlet引擎中(例如,使用了HTTP1.1的主機 頭域),每一個虛擬主機必須被視為一個單獨的環境。此外,Servlet引擎還可以創建對應于一組Servlet的環境對象。
?????? 方法
?????? 1、getAttribute
?????? public Object getAttribute(String name);
?????? 返回Servlet環境對象中指定的屬性對象。如果該屬性對象不存在,返回空值。這個方法允許訪問有關這個Servlet引擎的在該接口的其他方法中尚未提供的附加信息。
?????? 2、getAttributeNames
?????? public Enumeration getAttributeNames();
?????? 返回一個Servlet環境對象中可用的屬性名的列表。
?????? 3、getContext
?????? public ServletContext getContext(String uripath);
?????? 返回一個Servlet環境對象,這個對象包括了特定URI路徑的Servlets和資源,如果該路徑不存在,則返回一個空值。URI路徑格式是/dir/dir/filename.ext。
?????? 為了安全,如果通過這個方法訪問一個受限制的Servlet的環境對象,會返回一個空值。
?????? 4、getMajorVersion
?????? public int getMajorVersion();
?????? 返回Servlet引擎支持的Servlet API的主版本號。例如對于2.1版,這個方法會返回一個整數2。
?????? 5、getMinorVersion
?????? public int getMinorVersion();
?????? 返回Servlet引擎支持的Servlet API的次版本號。例如對于2.1版,這個方法會返回一個整數2。
?????? 6、getMimeType
?????? public String getMimeType(String file);
??? ???返回指定文件的MIME類型,如果這種MIME類型未知,則返回一個空值。MIME類型是由Servlet引擎的配置決定的。
?????? 7、getRealPath
?????? public String getRealPath(String path);
?????? 一個符合URL路徑格式的指定的虛擬路徑的格式是:/dir/dir/filename.ext。用這個方法,可以返回與一個符合該格式的虛擬路徑相對應的真實路徑的String。這個真實路徑的格式應該適合于運行這個Servlet引擎的計算機(包括其相應的路徑解析器)。
?????? 不管是什么原因,如果這一從虛擬路徑轉換成實際路徑的過程不能執行,該方法將會返回一個空值。
?????? 8、getResource
?????? public URL getResource(String uripath);
?????? 返回一個URL對象,該對象反映位于給定的URL地址(格式:/dir/dir/filename.ext)的Servlet環境對象已知的資源。無論 URLStreamHandlers對于訪問給定的環境是不是必須的,Servlet引擎都必須執行。如果給定的路徑的Servlet環境沒有已知的資源,該方法會返回一個空值。
?????? 這個方法和java.lang.Class的getResource方法不完全相同。 java.lang.Class的getResource方法通過裝載類來尋找資源。而這個方法允許服務器產生環境變量給任何資源的任何Servlet, 而不必依賴于裝載類、特定區域等等。
?????? 9、getResourceAsStream
?????? public InputStream getResourceAsStream(String uripath);
?????? 返回一個InputStream對象,該對象引用指定的URL的Servlet環境對象的內容。如果沒找到Servlet環境變量,就會返回空值,URL路徑應該具有這種格式:/dir/dir/filename.ext。
?????? 這個方法是一個通過getResource方法獲得URL對象的方便的途徑。請注意,當你使用這個方法時,meta-information(例如內容長度、內容類型)會丟失。
?????? 10、getRequestDispatcher
???? ??public RequestDispatcher getRequestDispatcher(String uripath);
?????? 如果這個指定的路徑下能夠找到活動的資源(例如一個Servlet,JSP頁面,CGI等等)就返回一個特定URL的RequestDispatcher 對象,否則,就返回一個空值,Servlet引擎負責用一個request dispatcher對象封裝目標路徑。這個 request dispatcher對象可以用來完全請求的傳送。
?????? 11、getServerInfo
?????? public String getServerInfo();
?????? 返回一個String對象,該對象至少包括Servlet引擎的名字和版本號。
?????? 12、log
?????? public void log(String msg);
?????? public void log(String msg, Throwable t);
?????? public void log(Exception exception, String msg); // 這種用法將被取消
?????? 寫指定的信息到一個Servlet環境對象的log文件中。被寫入的log文件由Servlet引擎指定,但是通常這是一個事件log。當這個方法被一個異常調用時,log中將包括堆棧跟蹤。
?????? 13、setAttribute
?????? public void setAttribute(String name, Object o);
?????? 給予Servlet環境對象中你所指定的對象一個名稱。
?????? 14、removeAttribute
?????? public void removeAttribute(String name);
?????? 從指定的Servlet環境對象中刪除一個屬性。
?????? 注:以下幾個方法將被取消
?????? 15、getServlet
?????? public Servlet getServlet(String name) throws ServletException;
?????? 最初用來返回一個指定名稱的Servlet,如果沒找到就返回一個空值。如果這個Servlet能夠返回,這就意味著它已經被初始化,而且已經可以接受 service請求。這是一個危險的方法。當調用這個方法時,可能并不知道Servlet的狀態,這就可能導致有關服務器狀態的問題。而允許一個 Servlet訪問其他Servlet的這個方法也同樣的危險。
?????? 現在這個方法返回一個空值,為了保持和以前版本的兼容性,現在這個方法還沒有被取消。在以后的API版本中,該方法將被取消。
?????? 16、getServletNames
?????? public Enumeration getServletNames();
?????? 最初用來返回一個String對象的列表,該列表表示了在這個Servlet環境下所有已知的Servlet對象名。這個列表總是包含這個Servlet自身。
基于與上一個方法同樣的理由,這也是一個危險的方法。
?????? 現在這個方法返回一個空的列表。為了保持和以前版本的兼容性,現在這個方法還沒有被取消。在以后的API版本中,該方法將被取消。
?????? 17、getServlets
?????? public Enumeration getServlets();
?????? 最初用來返回在這個Servelet環境下所有已知的Servlet對象的列表。這個列表總是包含這個Servlet自身。
基于與getServlet方法同樣的理由,這也是一個危險的方法。
?????? 現在這個方法返回一個空的列表。為了保持和以前版本的兼容性,現在這個方法還沒有被取消。在以后的API版本中,該方法將被取消。
?
2.5??? ServletRequest接口
?????? 定義
?????? public interface ServletRequest
?????? 定義一個Servlet引擎產生的對象,通過這個對象,Servlet可以獲得客戶端請求的數據。這個對象通過讀取請求體的數據提供包括參數的名稱、值和屬性以及輸入流的所有數據。
?????? 方法
?????? 1、getAttribute
?????? public Object getAttribute(String name);
?????? 返回請求中指定屬性的值,如果這個屬性不存在,就返回一個空值。這個方法允許訪問一些不提供給這個接口中其他方法的請求信息以及其他Servlet放置在這個請求對象內的數據。
?????? 2、getAttributeNames
?????? public Enumeration getAttributeNames();
?????? 返回包含在這個請求中的所有屬性名的列表。
?????? 3、getCharacterEncoding
?????? public String getCharacterEncoding();
?????? 返回請求中輸入內容的字符編碼類型,如果沒有定義字符編碼類型就返回空值。
?????? 4、getContentLength
?????? public int getContentLength();
?????? 請求內容的長度,如果長度未知就返回-1。
?????? 5、getContentType
?????? public String getContentType();
?????? 返回請求數據體的MIME類型,如果類型未知返回空值。
?????? 6、getInputStream
?????? public ServletInputStream getInputStream() throws IOException;
?????? 返回一個輸入流用來從請求體讀取二進制數據。如果在此之前已經通過getReader方法獲得了要讀取的結果,這個方法會拋出一個IllegalStateException。
?????? 7、getParameter
?????? public String getParameter(String name);
?????? 以一個String返回指定的參數的值,如果這個參數不存在返回空值。例如,在一個HTTP Servlet中,這個方法會返回一個指定的查詢語句產生的參數的值或一個被提交的表單中的參數值。如果一個參數名對應著幾個參數值,這個方法只能返回通過getParameterValues方法返回的數組中的第一個值。因此,如果這個參數有(或者可能有)多個值,你只能使用getParameterValues方法。
?????? 8、getParameterNames
?????? public Enumeration getParameterNames();
?????? 返回所有參數名的String對象列表,如果沒有輸入參數,該方法返回一個空值。
?????? 9、getParameterValues
?????? public String[] getParameterValues(String name);
? ?????通過一個String對象的數組返回指定參數的值,如果這個參數不存在,該方法返回一個空值。
?????? 10、getProtocol
?????? public String getProtocol();
?????? 返回這個請求所用的協議,其形式是協議/主版本號.次版本號。例如對于一個HTTP1.0的請求,該方法返回HTTP/1.0。
?????? 11、getReader
?????? public BufferedReader getReader() throws IOException;
?????? 這個方法返回一個buffered reader用來讀取請求體的實體,其編碼方式依照請求數據的編碼方式。如果這個請求的輸入流已經被getInputStream調用獲得,這個方法會拋出一個IllegalStateException。
?????? 12、getRemoteAddr
?????? public String getRemoteAddr();
?????? 返回發送請求者的IP地址。
?????? 13、getRemoteHost
?????? public String getRemoteHost();
?????? 返回發送請求者的主機名稱。如果引擎不能或者選擇不解析主機名(為了改善性能),這個方法會直接返回IP地址。
?????? 14、getScheme
?????? public String getScheme();
?????? 返回請求所使用的URL的模式。例如,對于一個HTTP請求,這個模式就是http。
?????? 15、getServerName
?????? public String getServerName();
?????? 返回接收請求的服務器的主機名。
?????? 16、getServerPort
?????? public int getServerPort();
?????? 返回接收請求的端口號。
?????? 17、setAttribute
?????? public void setAttribute(String name, Object object);
?????? 這個方法在請求中添加一個屬性,這個屬性可以被其他可以訪問這個請求對象的對象(例如一個嵌套的Servlet)使用。
?????? 注:以下方法將被取消
?????? getRealPath
?????? public String getRealPath(String path);
?????? 返回與虛擬路徑相對應的真實路徑,如果因為某種原因,這一過程不能進行,該方法將返回一個空值。
?????? 這個方法和ServletContext接口中的getRealPath方法重復。在2.1版中,ServletContext接口將闡明一個 Servlet所能用的所有的路徑的映射。該方法執行的結果將會與ServletContext中getRealPath方法的結果完全一樣。
?
2.6??? ServletResponse接口
?????? 定義
?????? public interface ServletResponse
?????? 定義一個Servlet引擎產生的對象,通過這個對象,Servlet對客戶端的請求作出響應。這個響應應該是一個MIME實體,可能是一個HTML頁、圖象數據或其他MIME的格式。
?????? 方法
?????? 1、getCharacterEncoding
?????? public String getCharacterEncoding();
?????? 返回MIME實體的字符編碼。這個字符編碼可以是指定的類型,也可以是與請求頭域所反映的客戶端所能接受的字符編碼最匹配的類型。在HTTP協議中,這個信息被通過Accept-Charset傳送到Servlet引擎。
?????? 有關字符編碼和MIME的更多信息請參看RFC 2047。
?????? 2、getOutputStream
?????? public ServletOutputStream getOutputStream() throws IOException;
?????? 返回一個記錄二進制的響應數據的輸出流。
?????? 如果這個響應對象已經調用getWriter,將會拋出IllegalStateException。
?????? 3、getWriter
?????? public PrintWriter getWriter throws IOException;
?????? 這個方法返回一個PringWriter對象用來記錄格式化的響應實體。如果要反映使用的字符編碼,必須修改響應的MIME類型。在調用這個方法之前,必須設定響應的content類型。
?????? 如果沒有提供這樣的編碼類型,會拋出一個UnsupportedEncodingException,如果這個響應對象已調用getOutputStream,會拋出一個getOutputStream。
?????? 4、setContentLength
?????? public void setContentLength(int length);
?????? 設置響應的內容的長度,這個方法會覆蓋以前對內容長度的設定。
?????? 為了保證成功地設定響應頭的內容長度,在響應被提交到輸出流之前必須調用這個方法。
?????? 5、setContentType
?????? public void setContentType(String type);
?????? 這個方法用來設定響應的content類型。這個類型以后可能會在另外的一些情況下被隱式地修改,這里所說的另外的情況可能當服務器發現有必要的情況下對MIME的字符設置。
?????? 為了保證成功地設定響應頭的content類型,在響應被提交到輸出流之前必須調用這個方法。
?
2.7??? ?SingleThreadModel接口
?????? 定義
?????? public interface SingleThreadModel;
?????? 這是一個空接口,它指定了系統如何處理對同一個Servlet的調用。如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法中將不會有兩個線程被同時執行。
?????? Servlet可以通過維持一個各自獨立的Servlet實例池,或者通過只讓Servlet的service中只有一個線程的方法來實現這個保證。
?
2.8??? GenericServlet類
?????? public abstract class GenericServlet implements Servlet,
???????????? ServletConfig, Serializable;
?????? 這個類的存在使得編寫Servlet更加方便。它提供了一個簡單的方案,這個方案用來執行有關Servlet生命周期的方法以及在初始化時對ServletConfig對象和ServletContext對象進行說明。
?????? 方法
?????? 1、destroy
?????? public void destroy();
?????? 在這里destroy方法不做任何其他的工作。
?????? 2、getInitParameter
?????? public String getInitParameter(String name);
?????? 這是一個簡便的途徑,它將會調用ServletConfig對象的同名的方法。
?????? 3、getInitParameterNames
?????? public Enumeration getInitParameterNames();
?????? 這是一個簡便的途徑,它將會調用ServletConfig對象的同名的方法。
? ?????4、getServletConfig
?????? public ServletConfig getServletConfig();
?????? 返回一個通過這個類的init方法產生的ServletConfig對象的說明。
?????? 5、getServletContext
?????? public ServletContext getServletContext();
?????? 這是一個簡便的途徑,它將會調用ServletConfig對象的同名的方法。
?????? 6、getServletInfo
?????? public String getServletInfo();
?????? 返回一個反映Servlet版本的String。
?????? 7、init
?????? public void init() throws ServletException;
?????? public void init(ServletConfig config) throws ServletException;
?????? init(ServletConfig config)方法是一個對這個Servlet的生命周期進行初始化的簡便的途徑。
?????? init()方法是用來讓你對GenericServlet類進行擴充的,使用這個方法時,你不需要存儲config對象,也不需要調用super.init(config)。
?????? init(ServletConfig config)方法會存儲config對象然后調用init()。如果你重載了這個方法,你必須調用super.init(config),這樣GenericServlet類的其他方法才能正常工作。
?????? 8、log
????? ?public void log(String msg);
?????? public void log(String msg, Throwable cause);
?????? 通過Servlet content對象將Servlet的類名和給定的信息寫入log文件中。
?????? 9、service
?????? public abstract void service(ServletRequest request, ServletResponse
???????????? response) throws ServletException, IOException;
?????? 這是一個抽象的方法,當你擴展這個類時,為了執行網絡請求,你必須執行它。
?
2.9??? ServletInputStream類
?????? 定義
?????? public abstract class ServletInputStream extends InputStream
?????? 這個類定義了一個用來讀取客戶端的請求信息的輸入流。這是一個Servlet引擎提供的抽象類。一個Servlet通過使用ServletRequest接口獲得了對一個ServletInputStream對象的說明。
?????? 這個類的子類必須提供一個從InputStream接口讀取有關信息的方法。
?????? 方法
?????? 1、readLine
?????? public int readLine(byte[] b, int off, int len) throws IOException;
?????? 從輸入流的指定的偏移量開始將指定長度的字節讀入到指定的數組中。如果該行所有請求的內容都已被讀取,這個讀取的過程將結束。如果是遇到了新的一行,新的一行的首個字符也將被讀入到數組中。
?
2.10 ? ?ServletOutputStream類
?????? 定義
?????? public abstract class ServletOutputStream extends OutputStream
?????? 這是一個由Servlet引擎使用的抽象類。Servlet通過使用ServletResponse接口的使用獲得了對一個這種類型的對象的說明。利用這個輸出流可以將數據返回到客戶端。
?????? 這個類的子類必須提供一個向OutputStream接口寫入有關信息的方法。
?????? 在這個接口中,當一個刷新或關閉的方法被調用時。所有數據緩沖區的信息將會被發送到客戶端,也就是說響應被提交了。請注意,關閉這種類型的對象時不一定要關閉隱含的socket流。
?????? 方法
?????? 1、print
?????? public void print(String s) throws IOException;
?????? public void print(boolean b) throws IOException;
?????? public void print(char c) throws IOException;
?????? public void print(int i) throws IOException;
?????? public void print(long l) throws IOException;
?????? public void print(float f) throws IOException;
?????? public void print(double d) throws IOException;
?? ????輸出變量到輸出流中
?????? 2、println
?????? public void println() throws IOException;
?????? public void println(String s) throws IOException;
?????? public void println(boolean b) throws IOException;
?????? public void println(char c) throws IOException;
????? ?public void println(int i) throws IOException;
?????? public void println(long l) throws IOException;
?????? public void println(float f) throws IOException;
?????? public void println(double d) throws IOException;
?????? 輸出變量到輸出流中,并增加一個回車換行符
?
2.11 ? ?ServletException類
?????? 定義
?????? public class ServletException extends Exception
?????? 當Servlet遇到問題時拋出的一個異常。
?????? 構造函數
?????? public ServletException();
?????? public ServletException(String message);
?????? public ServletException(String message, Throwable cause);
?????? public ServletException(Throwable cause);
?????? 構造一個新的ServletException,如果這個構造函數包括一個Throwable參數,這個Throwable對象將被作為可能拋出這個異常的原因。
?????? 方法
?????? 1、getRootCause
?????? public Throwable getRootCause();
?????? 如果配置了拋出這個異常的原因,這個方法將返回這個原因,否則返回一個空值。
?
2.12?????? UnavailableException類
?????? 定義
?????? public class UnavailableException extends ServletException
?????? 不論一個Servlet是永久地還是臨時地無效,都會拋出這個異常。Servlet會記錄這個異常以及Servlet引擎所要采取的相應措施。
?????? 臨時的無效是指Servlet在某一時間由于一個臨時的問題而不能處理請求。例如,在另一個不同的應用層的服務(可能是數據庫)無法使用。這個問題可能會自行糾正或者需要采取其他的糾正措施。
?????? 永久的無效是指除非管理員采取措施,這個Servlet將不能處理客戶端的請求。例如,這個Servlet配置信息丟失或Servlet的狀態被破壞。
?????? Servlet 引擎可以安全地處理包括永久無效在內的這兩種異常,但是對臨時無效的正常處理可以使得Servlet引擎更健壯。特別的,這時對Servlet的請求只是 被阻止(或者是被延期)一段時間,這顯然要比在service自己重新啟動前完全拒絕請求更為科學。
?????? 構造函數
?????? public UnavailableException(Servlet servlet, String message);
?????? public UnavailableException(int seconds, Servlet servlet,
???????????? String message);
?????? 構造一個包含指定的描述信息的新的異常。如果這個構造函數有一個關于秒數的參數,這將給出Servlet發生臨時無效后,能夠重新處理請求的估計時間。如果不包含這個參數,這意味著這個Servlet永久無效。
?????? 方法
?????? 1、getServlet
?????? public Servlet getServlet();
?????? 返回報告無效的Servlet。這被Servlet引擎用來識別受到影響的Servlet。
?????? 2、getUnavailableSeconds
?????? public int getUnavailableSeconds();
?????? 返回Servlet預期的無效時間,如果這個Servlet是永久無效,返回-1。
?????? 3、isPermanent
?????? public boolean isPermanent();
?????? 如果這個Servlet永久無效,返回布爾值true,指示必須采取一些管理行動以使得這個Servlet可用。
?
?????? 所包含的接口:HttpServletRequest;HttpServletResponse;HttpSession;HttpSessionBindingListener;HttpSessionContext。
?????? 所包含的類:Cookie;HttpServlet;HttpSessionBindingEvent;HttpUtils。
2.13?????? HttpServletRequest接口
?????? 定義
?????? public interface HttpServletRequest extends ServletRequest;
?????? 用來處理一個對Servlet的HTTP格式的請求信息。
?????? 方法
?????? 1、getAuthType
?????? public String getAuthType();
?? ????返回這個請求的身份驗證模式。
?????? 2、getCookies
?????? public Cookie[] getCookies();
?????? 返回一個數組,該數組包含這個請求中當前的所有cookie。如果這個請求中沒有cookie,返回一個空數組。
?????? 3、getDateHeader
?????? public long getDateHeader(String name);
?????? 返回指定的請求頭域的值,這個值被轉換成一個反映自1970-1-1日(GMT)以來的精確到毫秒的長整數。
?????? 如果頭域不能轉換,拋出一個IllegalArgumentException。如果這個請求頭域不存在,這個方法返回-1。
?????? 4、getHeader
?????? public String getHeader(String name);
?????? 返回一個請求頭域的值。(譯者注:與上一個方法不同的是,該方法返回一個字符串)
?????? 如果這個請求頭域不存在,這個方法返回-1。
?????? 5、getHeaderNames
?????? public Enumeration getHeaderNames();
?????? 該方法返回一個String對象的列表,該列表反映請求的所有頭域名。
?????? 有的引擎可能不允許通過這種方法訪問頭域,在這種情況下,這個方法返回一個空的列表。
?????? 6、getIntHeader
?????? public int getIntHeader(String name);
?????? 返回指定的請求頭域的值,這個值被轉換成一個整數。
?????? 如果頭域不能轉換,拋出一個IllegalArgumentException。如果這個請求頭域不存在,這個方法返回-1。
?????? 7、getMethod
?????? public String getMethod();
?????? 返回這個請求使用的HTTP方法(例如:GET、POST、PUT)
?????? 8、getPathInfo
?????? public String getPathInfo();
?????? 這個方法返回在這個請求的URL的Servlet路徑之后的請求URL的額外的路徑信息。如果這個請求URL包括一個查詢字符串,在返回值內將不包括這個查詢字符串。這個路徑在返回之前必須經過URL解碼。如果在這個請求的URL的Servlet路徑之后沒有路徑信息。這個方法返回空值。
?????? 9、getPathTranslated
?????? public String getPathTranslated();
?????? 這個方法獲得這個請求的URL的Servlet路徑之后的額外的路徑信息,并將它轉換成一個真實的路徑。在進行轉換前,這個請求的URL必須經過URL解碼。如果在這個URL的Servlet路徑之后沒有附加路徑信息。這個方法返回空值。
? ?????10、getQueryString
?????? public String getQueryString();
?????? 返回這個請求URL所包含的查詢字符串。一個查詢字串符在一個URL中由一個“?”引出。如果沒有查詢字符串,這個方法返回空值。
?????? 11、getRemoteUser
?????? public String getRemoteUser
?????? 返回作了請求的用戶名,這個信息用來作HTTP用戶論證。
?????? 如果在請求中沒有用戶名信息,這個方法返回空值。
?????? 12、getRequestedSessionId
?????? public String getRequestedSessionId();
?????? 返回這個請求相應的session id。如果由于某種原因客戶端提供的session id是無效的,這個session id將與在當前session中的session id不同,與此同時,將建立一個新的session。
?????? 如果這個請求沒與一個session關聯,這個方法返回空值。
?????? 13、getRequestURI
?????? public String getRequestURI();
?????? 從HTTP請求的第一行返回請求的URL中定義被請求的資源的部分。如果有一個查詢字符串存在,這個查詢字符串將不包括在返回值當中。例如,一個請求通過 /catalog/books?id=1這樣的URL路徑訪問,這個方法將返回/catalog/books。這個方法的返回值包括了Servlet路徑 和路徑信息。
?????? 如果這個URL路徑中的的一部分經過了URL編碼,這個方法的返回值在返回之前必須經過解碼。
?????? 14、getServletPath
?????? public String getServletPath();
?????? 這個方法返回請求URL反映調用Servlet的部分。例如,一個Servlet被映射到/catalog/summer這個URL路徑,而一個請求使用了/catalog/summer/casual這樣的路徑。所謂的反映調用Servlet的部分就是指/catalog/summer。
?????? 如果這個Servlet不是通過路徑匹配來調用。這個方法將返回一個空值。
?????? 15、getSession
?????? public HttpSession getSession();
?????? public HttpSession getSession(boolean create);
?????? 返回與這個請求關聯的當前的有效的session。如果調用這個方法時沒帶參數,那么在沒有session與這個請求關聯的情況下,將會新建一個session。如果調用這個方法時帶入了一個布爾型的參數,只有當這個參數為真時,session才會被建立。
?????? 為了確保session能夠被完全維持。Servlet開發者必須在響應被提交之前調用該方法。
?????? 如果帶入的參數為假,而且沒有session與這個請求關聯。這個方法會返回空值。
?????? 16、isRequestedSessionIdValid
?????? public boolean isRequestedSessionIdValid();
?????? 這個方法檢查與此請求關聯的session當前是不是有效。如果當前請求中使用的session無效,它將不能通過getSession方法返回。
?????? 17、isRequestedSessionIdFromCookie
?????? public boolean isRequestedSessionIdFromCookie();
?????? 如果這個請求的session id是通過客戶端的一個cookie提供的,該方法返回真,否則返回假。
?????? 18、isRequestedSessionIdFromURL
?????? public boolean isRequestedSessionIdFromURL();
?????? 如果這個請求的session id是通過客戶端的URL的一部分提供的,該方法返回真,否則返回假。請注意此方法與isRequestedSessionIdFromUrl在URL的拼寫上不同。
?????? 以下方法將被取消
?????? 19、isRequestedSessionIdFromUrl
?????? public boolean isRequestedSessionIdFromUrl();
?????? 該方法被isRequestedSessionIdFromURL代替。
?
2.14?????? HttpServletResponse接口
?????? 定義?
?????? public interface HttpServletResponse extends ServletResponse
?????? 描述一個返回到客戶端的HTTP回應。這個接口允許Servlet程序員利用HTTP協議規定的頭信息。
?????? 成員變量
?????? public static final int SC_CONTINUE = 100;
?????? public static final int SC_SWITCHING_PROTOCOLS = 101;
?? ????public static final int SC_OK = 200;
?????? public static final int SC_CREATED = 201;
?????? public static final int SC_ACCEPTED = 202;
?????? public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
?????? public static final int SC_NO_CONTENT = 204;
?????? public static final int SC_RESET_CONTENT = 205;
?????? public static final int SC_PARTIAL_CONTENT = 206;
?????? public static final int SC_MULTIPLE_CHOICES = 300;
?????? public static final int SC_MOVED_PERMANENTLY = 301;
?????? public static final int SC_MOVED_TEMPORARILY = 302;
?????? public static final int SC_SEE_OTHER = 303;
?????? public static final int SC_NOT_MODIFIED = 304;
?????? public static final int SC_USE_PROXY = 305;
?????? public static final int SC_BAD_REQUEST = 400;
?????? public static final int SC_UNAUTHORIZED = 401;
?????? public static final int SC_PAYMENT_REQUIRED = 402;
?????? public static final int SC_FORBIDDEN = 403;
?????? public static final int SC_NOT_FOUND = 404;
?????? public static final int SC_METHOD_NOT_ALLOWED = 405;
?????? public static final int SC_NOT_ACCEPTABLE = 406;
?????? public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
?????? public static final int SC_REQUEST_TIMEOUT = 408;
?????? public static final int SC_CONFLICT = 409;
?????? public static final int SC_GONE = 410;
?????? public static final int SC_LENGTH_REQUIRED = 411;
?????? public static final int SC_PRECONDITION_FAILED = 412;
?????? public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
?????? public static final int SC_REQUEST_URI_TOO_LONG = 414;
?????? public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
?????? public static final int SC_INTERNAL_SERVER_ERROR = 500;
?????? public static final int SC_NOT_IMPLEMENTED = 501;
?????? public static final int SC_BAD_GATEWAY = 502;
?????? public static final int SC_SERVICE_UNAVAILABLE = 503;
?????? public static final int SC_GATEWAY_TIMEOUT = 504;
?????? public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
?????? 以上HTTP產狀態碼是由HTTP/1.1定義的。
?????? 方法
?????? 1、addCookie
??? ???public void addCookie(Cookie cookie);
?????? 在響應中增加一個指定的cookie。可多次調用該方法以定義多個cookie。為了設置適當的頭域,該方法應該在響應被提交之前調用。
?????? 2、containsHeader
?????? public boolean containsHeader(String name);
?????? 檢查是否設置了指定的響應頭。
?????? 3、encodeRedirectURL
?????? public String encodeRedirectURL(String url);
?????? 對sendRedirect方法使用的指定URL進行編碼。如果不需要編碼,就直接返回這個URL。之所以提供這個附加的編碼方法,是因為在 redirect的情況下,決定是否對URL進行編碼的規則和一般情況有所不同。所給的URL必須是一個絕對URL。相對URL不能被接收,會拋出一個 IllegalArgumentException。
?????? 所有提供給sendRedirect方法的URL都應通過這個方法運行,這樣才能確保會話跟蹤能夠在所有瀏覽器中正常運行。
?????? 4、encodeURL
?????? public String encodeURL(String url);
?????? 對包含session ID的URL進行編碼。如果不需要編碼,就直接返回這個URL。Servlet引擎必須提供URL編碼方法,因為在有些情況下,我們將不得不重寫URL,例如,在響應對應的請求中包含一個有效的session,但是這個session不能被非URL的(例如cookie)的手段來維 持。
?????? 所有提供給Servlet的URL都應通過這個方法運行,這樣才能確保會話跟蹤能夠在所有瀏覽器中正常運行。
?????? 5、sendError
?????? public void sendError(int statusCode) throws IOException;
?????? public void sendError(int statusCode, String message) throws
????????? IOException;
?????? 用給定的狀態碼發給客戶端一個錯誤響應。如果提供了一個message參數,這將作為響應體的一部分被發出,否則,服務器會返回錯誤代碼所對應的標準信息。
?????? 調用這個方法后,響應立即被提交。在調用這個方法后,Servlet不會再有更多的輸出。
?????? 6、sendRedirect
?????? public void sendRedirect(String location) throws IOException;
?????? 使用給定的路徑,給客戶端發出一個臨時轉向的響應(SC_MOVED_TEMPORARILY)。給定的路徑必須是絕對URL。相對URL將不能被接收,會拋出一個IllegalArgumentException。
?????? 這個方法必須在響應被提交之前調用。調用這個方法后,響應立即被提交。在調用這個方法后,Servlet不會再有更多的輸出。
?????? 7、setDateHeader
?????? public void setDateHeader(String name, long date);
?????? 用一個給定的名稱和日期值設置響應頭,這里的日期值應該是反映自1970-1-1日(GMT)以來的精確到毫秒的長整數。如果響應頭已經被設置,新的值將覆蓋當前的值。
?????? 8、setHeader
?????? public void setHeader(String name, String value);
?????? 用一個給定的名稱和域設置響應頭。如果響應頭已經被設置,新的值將覆蓋當前的值。
?????? 9、setIntHeader
?????? public void setIntHeader(String name, int value);
?????? 用一個給定的名稱和整形值設置響應頭。如果響應頭已經被設置,新的值將覆蓋當前的值。
?????? 10、setStatus
?????? public void setStatus(int statusCode);
?????? 這個方法設置了響應的狀態碼,如果狀態碼已經被設置,新的值將覆蓋當前的值。
?????? 以下的幾個方法將被取消
?????? 11、encodeRedirectUrl
?????? public String encodeRedirectUrl(String url);
?????? 該方法被encodeRedirectURL取代。
?????? 12、encodeUrl
?????? public String encodeUrl(String url);
?????? 該方法被encodeURL取代。
?????? 13、setStatus
?????? public void setStatus(int statusCode, String message);
?????? 這個方法設置了響應的狀態碼,如果狀態碼已經被設置,新的值將覆蓋當前的值。如果提供了一個message,它也將會被作為響應體的一部分被發送。
?
2.15?????? HttpSession接口
?? ????定義
?????? public interface HttpSession
?????? 這個接口被Servlet引擎用來實現在HTTP客戶端和HTTP會話兩者的關聯。這種關聯可能在多外連接和請求中持續一段給定的時間。session用來在無狀態的HTTP協議下越過多個請求頁面來維持狀態和識別用戶。
?????? 一個session可以通過cookie或重寫URL來維持。
?????? 方法
?????? 1、getCreationTime
?????? public long getCreationTime();
?????? 返回建立session的時間,這個時間表示為自1970-1-1日(GMT)以來的毫秒數。
?????? 2、getId
?????? public String getId();
?????? 返回分配給這個session的標識符。一個HTTP session的標識符是一個由服務器來建立和維持的唯一的字符串。
?????? 3、getLastAccessedTime
?????? public long getLastAccessedTime();
?????? 返回客戶端最后一次發出與這個session有關的請求的時間,如果這個session是新建立的,返回-1。這個時間表示為自1970-1-1日(GMT)以來的毫秒數。
?????? 4、getMaxInactiveInterval
?????? public int getMaxInactiveInterval();
?????? 返加一個秒數,這個秒數表示客戶端在不發出請求時,session被Servlet引擎維持的最長時間。在這個時間之后,Servlet引擎可能被Servlet引擎終止。如果這個session不會被終止,這個方法返回-1。
?????? 當session無效后再調用這個方法會拋出一個IllegalStateException。
?????? 5、getValue
?????? public Object getValue(String name);
?????? 返回一個以給定的名字綁定到session上的對象。如果不存在這樣的綁定,返回空值。
?????? 當session無效后再調用這個方法會拋出一個IllegalStateException。
?????? 6、getValueNames
? ?????public String[] getValueNames();
?????? 以一個數組返回綁定到session上的所有數據的名稱。
?????? 當session無效后再調用這個方法會拋出一個IllegalStateException。
?????? 7、invalidate
?????? public void invalidate();
?????? 這個方法會終止這個session。所有綁定在這個session上的數據都會被清除。并通過HttpSessionBindingListener接口的valueUnbound方法發出通告。
?????? 8、isNew
?????? public boolean isNew();
?????? 返回一個布爾值以判斷這個session是不是新的。如果一個session已經被服務器建立但是還沒有收到相應的客戶端的請求,這個session將被 認為是新的。這意味著,這個客戶端還沒有加入會話或沒有被會話公認。在他發出下一個請求時還不能返回適當的session認證信息。
?????? 當session無效后再調用這個方法會拋出一個IllegalStateException。
?????? 9、putValue
?????? public void putValue(String name, Object value);
?????? 以給定的名字,綁定給定的對象到session中。已存在的同名的綁定會被重置。這時會調用HttpSessionBindingListener接口的valueBound方法。
?????? 當session無效后再調用這個方法會拋出一個IllegalStateException。
?????? 10、removeValue
???? ??public void removeValue(String name);
?????? 取消給定名字的對象在session上的綁定。如果未找到給定名字的綁定的對象,這個方法什么出不做。這時會調用HttpSessionBindingListener接口的valueUnbound方法。
?????? 當session無效后再調用這個方法會拋出一個IllegalStateException。
?????? 11、setMaxInactiveInterval
?????? public int setMaxInactiveInterval(int interval);
?????? 設置一個秒數,這個秒數表示客戶端在不發出請求時,session被Servlet引擎維持的最長時間。
?????? 以下這個方法將被取消
?????? 12、getSessionContext
?????? public HttpSessionContext getSessionContext();
?????? 返回session在其中得以保持的環境變量。這個方法和其他所有HttpSessionContext的方法一樣被取消了。
2.16?????? ?HttpSessionBindingListener接口
?????? 定義
?????? public interface HttpSessionBindingListener
?????? 這個對象被加入到HTTP的session中,執行這個接口會通告有沒有什么對象被綁定到這個HTTP session中或被從這個HTTP session中取消綁定。
?????? 方法
?????? 1、valueBound
?????? public void valueBound(HttpSessionBindingEvent event);
?????? 當一個對象被綁定到session中,調用此方法。HttpSession.putValue方法被調用時,Servlet引擎應該調用此方法。
?????? 2、valueUnbound
?????? public void valueUnbound(HttpSessionBindingEvent event);
?????? 當一個對象被從session中取消綁定,調用此方法。HttpSession.removeValue方法被調用時,Servlet引擎應該調用此方法。
?
2.17?????? HttpSessionContext接口
?????? 定義
?????? 此接口將被取消
?????? public interface HttpSessionContext
?????? 這個對象是與一組HTTP session關聯的單一的實體。
?????? 這個接口由于安全的原因被取消,它出現在目前的版本中僅僅是為了兼容性的原因。這個接口的方法將模擬以前的版本的定義返回相應的值。
?????? 方法
?????? 1、getSession
?????? public HttpSession getSession(String sessionId);
?????? 當初用來返回與這個session id相關的session。現在返回空值。
?????? 2、getIds
?????? public Enumeration getIds();
?????? 當初用來返回這個環境下所有session id的列表。現在返回空的列表。
?
2.18?????? Cookie類
?????? 定義
?????? public class Cookie implements Cloneable
?????? 這個類描述了一個cookie,有關cookie的定義你可以參照Netscape Communications Corporation的說明,也可以參照RFC 2109。
?????? 構造函數
?????? public Cookie(String name, String value);
?????? 用一個name-value對定義一個cookie。這個name必須能被HTTP/1.1所接受。
?????? 以字符$開頭的name被RFC 2109保留。
?????? 給定的name如果不能被HTTP/1.1所接受,該方法拋出一個IllegalArgumentException。
?????? 方法
?????? 1、getComment
?????? public String getComment();
?????? 返回描述這個cookie目的的說明,如果未定義這個說明,返回空值。
?????? 2、getDomain
?????? public String getDomain();
?????? 返回這個cookie可以出現的區域,如果未定義區域,返回空值。
?????? 3、getMaxAge
????? ?public int getMaxAge();
?????? 這個方法返回這個cookie指定的最長存活時期。如果未定義這個最長存活時期,該方法返回-1。
?????? 4、getName
?????? public String getName();
?????? 該方法返回cookie名。
?????? 5、getPath
?????? public String getPath();
?????? 返回這個cookie有效的所有URL路徑的前綴,如果未定義,返回空值。
?????? 6、getSecure
?????? public boolean getSecure();
?????? 如果這個cookie只通過安全通道傳輸返回真,否則返回假。
?????? 7、getValue
?????? public String getValue();
?????? 該方法返回cookie的值。
?????? 8、getVersion
?????? public int getVersion();
?????? 返回cookie的版本。版本1由RFC 2109解釋。版本0由Netscape Communications Corporation的說明解釋。新構造的cookie默認使用版本0。
?????? 9、setComment
?????? public void setComment(String purpose);
?????? 如果一個用戶將這個cookie提交給另一個用戶,必須通過這個說明描述這個cookie的目的。版本0不支持這個屬性。
?????? 10、setDomain
?????? public void setDomain(String pattern);
?????? 這個方法設置cookie的有效域的屬性。這個屬性指定了cookie可以出現的區域。一個有效域以一個點開頭(.foo.com),這意味著在指定的域名解析系統的區域中(可能是www.foo.com但不是a.b.foo.com)的主機可以看到這個cookie。默認情況是,cookie只能返回保 存它的主機。
?????? 11、setMaxAge
?????? public void setMaxAge(int expiry);
?????? 這個方法設定這個cookie的最長存活時期。在該存活時期之后,cookie會被終目。負數表示這個cookie不會生效,0將從客戶端刪除這個cookie。
? ? ? ?12、setPath
?????? public void setPath(String uri);
?????? 這個方法設置cookie的路徑屬性。客戶端只能向以這個給定的路徑String開頭的路徑返回cookie。
?????? 13、setSecure
?????? public void setSecure(boolean flag);
?????? 指出這個cookie只能通過安全通道(例如HTTPS)發送。只有當產生這個cookie的服務器使用安全協議發送這個cookie值時才能這樣設置。
?????? 14、setValue
?????? public void setValue(String newValue);
?????? 設置這個cookie的值,對于二進制數據采用BASE64編碼。
?????? 版本0不能使用空格、{}、()、=、,、“”、/、?、@、:以及;。
?????? 15、setVersion
?????? public void setVersion(int v);
?????? 設置cookie的版本號
?
2.19?????? HttpServlet類
?????? 定義
?????? public class HttpServlet extends GenericServlet implements
????????? Serializable
?????? 這是一個抽象類,用來簡化HTTP Servlet寫作的過程。它是GenericServlet類的擴充,提供了一個處理HTTP協議的框架。
?????? 在這個類中的service方法支持例如GET、POST這樣的標準的HTTP方法。這一支持過程是通過分配他們到適當的方法(例如doGet、doPost)來實現的。
?????? 方法
?????? 1、doDelete
?????? protected void doDelete(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? 被這個類的service方法調用,用來處理一個HTTP DELETE操作。這個操作允許客戶端請求從服務器上刪除URL。這一操作可能有負面影響,對此用戶就負起責任。
?????? 這一方法的默認執行結果是返回一個HTTP BAD_REQUEST錯誤。當你要處理DELETE請求時,你必須重載這一方法。
?????? 2、doGet
?????? protected void doGet(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? 被這個類的service方法調用,用來處理一個HTTP GET操作。這個操作允許客戶端簡單地從一個HTTP服務器“獲得”資源。對這個方法的重載將自動地支持HEAD方法。
?????? GET操作應該是安全而且沒有負面影響的。這個操作也應該可以安全地重復。
?????? 這一方法的默認執行結果是返回一個HTTP BAD_REQUEST錯誤。
?????? 3、doHead
?????? protected void doHead(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? 被這個類的service方法調用,用來處理一個HTTP HEAD操作。默認的情況是,這個操作會按照一個無條件的GET方法來執行,該操作不向客戶端返回任何數據,而僅僅是返回包含內容長度的頭信息。
?????? 與GET操作一樣,這個操作應該是安全而且沒有負面影響的。這個操作也應該可以安全地重復。
?????? 這個方法的默認執行結果是自動處理HTTP HEAD操作,這個方法不需要被一個子類執行。
?????? 4、doOptions
?????? protected void doOptions(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? 被這個類的service方法調用,用來處理一個HTTP OPTION操作。這個操作自動地決定支持哪一種HTTP方法。例如,一個Servlet寫了一個HttpServlet的子類并重載了doGet方法,doOption會返回下面的頭:
?????? Allow: GET,HEAD,TRACE,OPTIONS
?????? 你一般不需要重載這個方法。
?????? 5、doPost
?????? protected void doPost(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? 被這個類的service方法調用,用來處理一個HTTP POST操作。這個操作包含請求體的數據,Servlet應該按照他行事。
?????? 這個操作可能有負面影響。例如更新存儲的數據或在線購物。
?????? 這一方法的默認執行結果是返回一個HTTP BAD_REQUEST錯誤。當你要處理POST操作時,你必須在HttpServlet的子類中重載這一方法。
?????? 6、doPut
?????? protected void doPut(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? 被這個類的service方法調用,用來處理一個HTTP PUT操作。這個操作類似于通過FTP發送文件。
?????? 這個操作可能有負面影響。例如更新存儲的數據或在線購物。
?????? 這一方法的默認執行結果是返回一個HTTP BAD_REQUEST錯誤。當你要處理PUT操作時,你必須在HttpServlet的子類中重載這一方法。
?????? 7、doTrace
?????? protected void doTrace(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? 被這個類的service方法調用,用來處理一個HTTP TRACE操作。這個操作的默認執行結果是產生一個響應,這個響應包含一個反映trace請求中發送的所有頭域的信息。
?????? 當你開發Servlet時,在多數情況下你需要重載這個方法。
?????? 8、getLastModified
?????? protected long getLastModified(HttpServletRequest request);
?????? 返回這個請求實體的最后修改時間。為了支持GET操作,你必須重載這一方法,以精確地反映最后修改的時間。這將有助于瀏覽器和代理服務器減少裝載服務器和網絡資源,從而更加有效地工作。返回的數值是自1970-1-1日(GMT)以來的毫秒數。
默認的執行結果是返回一個負數,這標志著最后修改時間未知,它也不能被一個有條件的GET操作使用。
?????? 9、service
?????? protected void service(HttpServletRequest request,
???????????? HttpServletResponse response) throws ServletException,
???????????? IOException;
?????? public void service(ServletRequest request, ServletResponse response)
???????????? throws ServletException, IOException;
?????? 這是一個Servlet的HTTP-specific方案,它分配請求到這個類的支持這個請求的其他方法。
?????? 當你開發Servlet時,在多數情況下你不必重載這個方法。
?
2.20?????? HttpSessionBindingEvent類
?????? 定義
?????? public class HttpSessionBindingEvent extends EventObject
?????? 這個事件是在監聽到HttpSession發生綁定和取消綁定的情況時連通HttpSessionBindingListener的。這可能是一個session被終止或被認定無效的結果。
?????? 事件源是HttpSession.putValue或HttpSession.removeValue。
?????? 構造函數
?????? public HttpSessionBindingEvent(HttpSession session, String name);
?????? 通過引起這個事件的Session和發生綁定或取消綁定的對象名構造一個新的HttpSessionBindingEvent。
?????? 方法
?????? 1、getName
?????? public String getName();
?????? 返回發生綁定和取消綁定的對象的名字。
?????? 2、getSession
?????? public HttpSession getSession();
?????? 返回發生綁定和取消綁定的session的名字。
?
2.21?????? HttpUtils類
?????? 定義
?????? public class HttpUtils
?????? 收集HTTP Servlet使用的靜態的有效的方法。
?????? 方法
?????? 1、getRequestURL
?????? public static StringBuffer getRequestURL(HttpServletRequest
???????????? request);
?????? 在服務器上重建客戶端用來建立請求的URL。這個方法反映了不同的協議(例如http和https)和端口,但不包含查詢字符串。
?????? 這個方法返回一個StringBuffer而不是一個String,這樣URL可以被Servlet開發者有效地修改。
?????? 2、parsePostData
?????? public static Hashtable parsePostData(int len,
???????????? ServletInputstream in);
?????? 解析一個包含MIME類型application/x-www-form-urlencoded的數據的流,并創建一個具有關鍵值-數據對的 hash table。這里的關鍵值是字符串,數據是該字符串所對應的值的列表。一個關鍵值可以在POST的數據中出現一次或多次。這個關鍵值每出現一次,它的相應的值就被加入到hash table中的字符串所對應的值的列表中。
?????? 從POST數據讀出的數據將經過URL解碼,+將被轉換為空格以十六進制傳送的數據(例如%xx)將被轉換成字符。
?????? 當POST數據無效時,該方法拋出一個IllegalArgumentException。
?????? 3、parseQueryString
?????? public static Hashtable parseQueryString(String s);
?????? 解析一個查詢字符串,并創建一個具有關鍵值-數據對的hash table。這里的數據是該字符串所對應的值的列表。一個關鍵值可以出現一次或多次。這個關鍵值每出現一次,它的相應的值就被加入到hash table中的字符串所對應的值的列表中。
?????? 從查詢字符串讀出的數據將經過URL解碼,+將被轉換為空格以十六進制傳送的數據(例如%xx)將被轉換成字符。
?????? 當查詢字符串無效時,該方法拋出一個IllegalArgumentException。
?
術語表
bytecode
?????? 字節碼:由Java編譯器和Java解釋程序生成的機器代碼。
cookie
?????? 由Web服務器建立的數據,該數據存儲在用戶的計算機上,提供了一個Web站點跟蹤用戶的參數并存儲在用戶自己硬盤上的方法。
HTTP
?????? 超文本傳輸協議。一個請求響應協議用來連接WWW服務器向客戶端瀏覽器傳輸HTML頁面。
輸入流對象
? ? ? ?一個對象,由ServletInputStream類定義,被Servlet用來從客戶端讀取請求。
映射
?????? 由Servlet實例和Servlet返回數據的URL組成的一對,例如,HelloServlet和/hello/index.html。
輸出流對象
? ? ? ?一個對象,由ServletOutputStream class類定義,被Servlet用來向客戶端返回數據。
request dispatcher object
?????? 由RequestDispatcher接口定義的一個對象,用來從客戶端接收請求,并將其發送到Web服務器上可用的其他資源(例如Servlet、CGI、HTML文件或JSP文件)。
sandboxed servlet
?????? 在一個安全性約束下運行的Servlet。
servlet
? ? ? ?一個小的,具有平臺無關性的,沒有圖形用戶界面的Java程序。它可以在許多方面擴充Web服務的功能。
servlet configuration object
?????? ServletConfig接口定義的一個對象,用來配置一個Servlet。
servlet context object
?????? ServletContext接口定義的一個對象。給予Servlet有關Servlet引擎的信息。
servlet引擎
?????? 由Web服務器提供商制作的一個環境,可以允許Servlet在具體的Web服務器上運行。
servlet請求對象
?????? 由ServletRequest接口定義的一個對象,允許Servlet獲得用關客戶端請求的數據。
servlet response object
?????? 由ServletResponse接口定義的一個對象,允許Servlet作出響應。
servlet runner
? ? ? ?Java Servlet Developer’s Kit (JSDK)中的sun.servlet.http.HttpServer過程,它使得Servlet得以運行。
會話跟蹤
?????? 在一個Web應用程序中,識別一個從同一個客戶端發出的連續的唯一的請求的能力。
SSL
?????? 加密套接字協議層。一個安全協議,用來在Iternet上的客戶端瀏覽器和服務器交換密鑰和加密數據。
URI
?????? 統一資源標識。定義一個Internet地址,它是一個URL的超集。
URL
?????? 統一資源路徑。這個地址定義了到達一個WWW上的文件的路線,通常由協議前綴、域名、目錄名和文件名組成。
?