廣義的 Servlet 泛指在服務器上運行的 Java 程序,但是這個 Java 程序,并不能獨立運行(因為 Servlet 沒有 main 方法),需要部署在相應的 Servlet 容器中,比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地瀏覽和修改數據,生成動態 Web 內容。
~
本篇內容包括:Serlvet 相關概念、Servlet 的應用、javax.servlet 包下主要的類和接口 以及 javax.servlet.http 包下主要的類和接口
- 上一篇內容:JavaWeb:JavaWeb技術架構演進
- 更多知識學習:全網最全的 Java 技術棧內容梳理(持續更新中)
文章目錄
- 一、Serlvet 相關概念
- 1、Servlet
- 2、Servlet 容器
- 3、Apache / Tomcat
- 二、Servlet 的應用
- 1、Servlet Api
- 2、Servlet 軟件包
- 三、javax.servlet 包下主要的類和接口
- 1、javax.servlet 包定義的類和接口
- 2、RequestDispatcher
- 3、Servlet
- 4、ServletRequest
- 5、ServletResponse
- 6、ServletConfig
- 7、ServletContext
- 四、javax.servlet.http 包下主要的類和接口
- 1、javax.servlet.http 包定義的類和接口
- 2、HttpServlet
- 3、HttpServletRequest
- 4、HttpServletResponse
一、Serlvet 相關概念
1、Servlet
Servlet,即 Java Servlet 的簡稱,其中 Servlet 的含義為 Server Applet(服務端程序),并且 Servlet 的名字由來也是這兩個單詞的拼接。
狹義的 Servlet 是指 Java 語言實現的一個接口。
廣義的 Servlet 泛指在服務器上運行的 Java 程序,但是這個 Java 程序,并不能獨立運行(因為 Servlet 沒有 main 方法),需要部署在相應的 Servlet 容器中,比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地瀏覽和修改數據,生成動態 Web 內容。
2、Servlet 容器
Servlet 容器也被稱為 Servlet 引擎,是 Web 服務器或應用程序服務器的一部分,用于在發送的請求和響應之上提供網絡服務。
Servlet 沒有 main 方法,不能獨立運行,它必須被部署到 Servlet 容器中,由容器來實例化和調用 Servlet 的方法(如 doGet() 和 doPost() ),Servlet 容器在 Servlet 的生命周期內包容和管理 Servlet。在 JSP 技術推出后,管理和運行 Servlet/JSP 的容器也稱為 Web 容器。
3、Apache / Tomcat
Apache 是 Web 服務器,Tomcat 是應用(java)服務器,它只是一個 servlet 容器,是 Apache 的擴展。 Apache 和 Tomcat 都可以做為獨立的 Web 服務器來運行,但是 Apache 不能解釋 Java 程序(JSP、Servlet)。
兩者都是一種容器,只不過發布的東西不同:
- Apache 是 Html 容器,功能像 IIS(Internet Information Services)一樣;
- Tomcat 是 JSP/Servlet 容器,用于發布 JSP 及 Java 應用。
二、Servlet 的應用
1、Servlet Api
Java Servlet 是運行在帶有支持 Java Servlet 規范的解釋器的 web 服務器上的 Java 類。
針對 Servlet 實現技術,SUN 公司提供了一套標準的 Java Servlet Api 以便于更快速、規范地開發 Servlet 程序。
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency>
2、Servlet 軟件包
在這套 Servlet API 中,最重要的兩個軟件包是:javax.servlet、javax.servlet.http
javax.servlet
:包含定義 servlet 和 servlet 容器之間契約的類和接口,主要有 RequestDispatcher、Servlet、GenericServlet、ServletConfig、ServletContext、ServletRequest、ServletResponse、Filter;javax.servlet.http
:包含定義 HTTP Servlet 和 Servlet 容器之間關系的類和接口,主要有 HttpServlet、HttpServletRequest、HttpServletResponse、HttpSession、Cookie;
總的來說:javax.servlet
是一個與通信協議無關的通用軟件包;javax.servlet.http
是一個支持 HTTP 訪問協議的軟件包,這兩個軟件包的同時存在,使得 Servlet API 能支持任何協議的請求/響應。
此外,Servlet API 中還有另外兩個包,也有一定作用:
javax.servlet.annotation
,其中包含標注 servlet,Filter,Listener 的標注。它還為被標注元件定義元數據。javax.servlet.descriptor
,其中包含提供程序化登錄 Web 應用程序的配置信息的類型。
三、javax.servlet 包下主要的類和接口
1、javax.servlet 包定義的類和接口
類/接口 | 說明 |
---|---|
interface RequestDispatcher | 定義一種對象,用于從客戶接受請求,并將請求發送到服務器上任何指定的資源,如一個 Servlet 、JSP 或 HTML 文件 |
interface Servlet | 定義了所有 Servlet 必須實現的方法。 |
interface ServletConfig | 定義 Servlet config 對象,由Servlet 引擎用在 Servlet 初始化時,向 Servlet 傳遞信息。 |
interface ServletContext | 定義了一系列方法,以便 Servlet 與其運行的環境通信。 |
interface ServletRequest | 定義了一個對象,用于向 Servlet 傳遞客戶請求信息的對象。 |
interface ServletResponse | 定義了一個對象,由 Servlet 用于向客戶發送響應的對象。 |
interface SingleThreadModel | 用于保證 Servlet 在任一時刻,只處理一個請求。 |
class GenericServlet | 繼承 Servlet 接口,定義了一個通用的,與協議無關的Servlet。 |
class ServletInputStream | 定義了一個輸入流,用于由 Servlet 從中讀取客戶請求的二進制數據。 |
class ServletOutputStream | 定義了一個輸出流,用于由 Servlet 向客戶發送二進制數據。 |
class ServletException | 定義了一個當 Servlet 遇到問題時可以拋出的異常。 |
class UnavailableException | 定義了一種異常,用于由 Servlet 指明它永遠或暫時不可用。 |
2、RequestDispatcher
RequestDispatcher 是資源調度器接口,實現的是請求轉發。請求轉發的意思就是說通知其他 Web 資源處理當前 Servlet 的請求。
RequestDispatcher 對象由 Servlet 容器創建,用于封裝并調度由一個特定的 URL 定義的服務器資源。
public interface RequestDispatcher {//forward方式下,來源URI名稱(值在目標request中attribute中獲取)static final String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri";//forward方式下,來源context路徑名稱(值在目標request中attribute中獲取)static final String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path";//forward方式下,來源路徑信息名稱(值在目標request中attribute中獲取)static final String FORWARD_PATH_INFO = "javax.servlet.forward.path_info";//forward方式下,來源servlet的servlet路徑名稱(值在目標request中attribute中獲取)static final String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path";//forward方式下,來源請求查詢串名稱(值在目標request中attribute中獲取)static final String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string";//include方式下,目標請求的URI名稱(值在目標request中attribute中獲取)static final String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";//include方式下,目標context路徑名稱(值在目標request中attribute中獲取)static final String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path";//include方式下,目標路徑信息名稱(值在目標request中attribute中獲取)static final String INCLUDE_PATH_INFO = "javax.servlet.include.path_info";//include方式下,目標servlet路徑名稱(值在目標request中attribute中獲取)static final String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";//include方式下,目標查詢串名稱(值在目標request中attribute中獲取)static final String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string";//error方式下,傳遞的異常對象名稱(值在目標request中attribute中獲取)public static final String ERROR_EXCEPTION = "javax.servlet.error.exception";//error方式下,傳遞的異常類型名稱(值在目標request中attribute中獲取)public static final String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type";//error方式下,傳遞的異常信息名稱(值在目標request中attribute中獲取)public static final String ERROR_MESSAGE = "javax.servlet.error.message";//error方式下,導致傳遞異常的請求URI名稱(值在目標request中attribute中獲取)public static final String ERROR_REQUEST_URI = "javax.servlet.error.request_uri";//error方式下,傳遞的發生錯誤的servlet名稱(值在目標request中attribute中獲取)public static final String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name";//error方式下,傳遞的響應code名稱(值在目標request中attribute中獲取)public static final String ERROR_STATUS_CODE = "javax.servlet.error.status_code";//在內部(瀏覽器地址不會改變)將請求從一個serlvet轉發到另一個資源(servlet、jsp、html)處理public void forward(ServletRequest request, ServletResponse response)throws ServletException, IOException;//在響應請求中添加指定資源(servlet、jsp、html)public void include(ServletRequest request, ServletResponse response)throws ServletException, IOException;
}
3、Servlet
Servlet 定義了所有 Servlet 必須實現的方法:
public interface Servlet {// Servlet初始化方法,通過init()方法可以獲得容器創建的ServletConfig對象void init(ServletConfig var1) throws ServletException;// 請求處理方法(第一次請求時,會先調用init( ))void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;// Servlet實例銷毀方法void destroy();// 獲取ServletConfig配置對象方法ServletConfig getServletConfig();// 獲取Servlet相關信息方法String getServletInfo();
}
其中,init()
、service()
、destroy()
是Servlet生命周期的方法。代表了 Servlet 從“出生”到“工作”再到“死亡”的過程。
4、ServletRequest
Servlet 容器對于接受到的每一個 Http 請求,都會創建一個 ServletRequest 對象,并把這個對象傳遞給 Servlet 的 Sevice()
方法。其中,ServletRequest 對象內封裝了關于這個請求的許多詳細信息。
public interface ServletRequest {// 獲取請求中指定屬性的值Object getAttribute(String var1); // 獲取請求中所有屬性name集Enumeration<String> getAttributeNames(); // 返回請求中輸入內容的字符編碼類型String getCharacterEncoding(); // 設置字符編碼類型void setCharacterEncoding(String var1) throws UnsupportedEncodingException; // 獲取請求內容的長度,如果長度位置就返回-1int getContentLength();long getContentLengthLong();// 返回請求數據體的MIME類型,如果類型未知就返回空值String getContentType(); // 返回一個輸入流用來從請求體讀取二進制數據。// 如果在此之前已經通過getReader方法獲得了要讀取的結果,這個方法會拋出一個IllegalStateException。ServletInputStream getInputStream() throws IOException;// 通過名稱獲取參數值String getParameter(String var1); // 獲取所有參數名稱集Enumeration<String> getParameterNames(); // 獲取指定參數名的所有參數值String[] getParameterValues(String var1); // 返回參數的鍵值對,是一個只讀的map類型Map<String, String[]> getParameterMap(); // 返回這個請求所用的協議,其形式是協議/主版本號.次版本號String getProtocol(); // 返回請求所使用的URL的模式。例如,對于一個HTTP請求,這個模式就是http。String getScheme(); // 返回接收請求的服務器的主機名。String getServerName(); // 返回接收請求的端口號。int getServerPort(); // 返回一個buffered reader用來讀取請求體的實體,其編碼方式依照請求數據的編碼方式。// 如果這個請求的輸入流已經被getInputStream調用獲得,這個方法會拋出一個IllegalStateException。BufferedReader getReader() throws IOException;// 返回發送請求者的IP地址。String getRemoteAddr(); // 返回發送請求者的主機名稱。如果引擎不能或者選擇不解析主機名(為了改善性能),這個方法會直接返回IP地址。String getRemoteHost();// 在請求中添加一個屬性,這個屬性可以被其他可以訪問這個請求對象的對象(例如一個嵌套的Servlet)使用。void setAttribute(String var1, Object var2);// 根據屬性名,刪除屬性值void removeAttribute(String var1);// 獲取請求者的國家地區信息Locale getLocale(); // .Enumeration<Locale> getLocales(); // 返回安全狀態boolean isSecure(); // 返回一個RequestDispatcher對象,是一個Web資源的包裝器,// 可以用來把當前request傳遞到該資源,或者把新的資源包括到當前響應中。// RequestDispatcher接口中定義了兩個方法:include/forward。RequestDispatcher getRequestDispatcher(String var1);/** @deprecated */// 獲取應用的完整絕對路徑。String getRealPath(String var1); // 返回發送請求者的端口號int getRemotePort(); // 獲取Web服務器的主機名String getLocalName(); // 獲取Web服務器的IP地址String getLocalAddr(); // 獲取Web服務器所使用的網絡端口號int getLocalPort(); // 獲取上下文對象ServletContext getServletContext(); // 返回一個異步上下文對象AsyncContext startAsync() throws IllegalStateException; AsyncContext startAsync(ServletRequest var1, ServletResponse var2) throws IllegalStateException;// 是否啟動異步boolean isAsyncStarted(); // 是否支持異步boolean isAsyncSupported(); // 獲取異步上下文AsyncContext getAsyncContext(); // 獲取調度器類型DispatcherType getDispatcherType();
}
5、ServletResponse
ServletResponse 接口表示一個 Servlet 響應,在調用 Servlet 的 Service()
方法前,Servlet 容器會先創建一個 ServletResponse 對象,并把它作為第二個參數傳給Service()
方法。ServletResponse 隱藏了向瀏覽器發送響應的復雜過程。
public interface ServletResponse {// 返回在此響應中發送的正文所使用的字符編碼(MIME字符集)的名稱String getCharacterEncoding();// 返回用于在此響應中發送的MIME主體的內容類型。String getContentType();// 返回一個適合于在響應中寫入二進制數據的服務輸出流ServletOutputStream getOutputStream() throws IOException;// 返回一個可以向客戶端發送字符文本的打印寫入器對象。PrintWriter getWriter() throws IOException;// 設置此響應中發送的正文所使用的字符編碼(MIME字符集)的名稱void setCharacterEncoding(String var1);// 設置響應中內容主體的長度在HTTPservlet中,此方法設置HTTP內容長度頭。void setContentLength(int var1);// 設置此響應中發送的MIME主體的內容類型。void setContentType(String var1);// 設置用于響應的實際緩沖區大小void setBufferSize(int var1);// 返回用于響應的實際緩沖區大小int getBufferSize();// 強制將緩沖區中的任何內容寫入客戶機void flushBuffer() throws IOException;// 清除響應中底層緩沖區的內容,而無需清除標題或狀態代碼。void resetBuffer();// 返回一個布爾值,以指示是否已提交了響應。boolean isCommitted();// 清除緩沖區中存在的任何數據以及狀態代碼、報頭。void reset();// 設置此響應指定的區域設置void setLocale(Locale var1);// 返回此響應指定的區域設置Locale getLocale();
}
6、ServletConfig
ServletConfig 是一個 Servlet 對象的配置信息對象 ServletConfig 對象中封裝了一個 Servlet 對象的配置信息,Servlet 對象的配置信息在 web.xml 中
一個 Servlet 對象對應一個 ServletConfig 對象,100 個 Servlet 對象對應 100 個 ServletConfig 對象。
public interface ServletConfig {// 獲取<servlet>servletName</servlet>String getServletName();// 獲取 ServletContext【Servlet上下文】對象ServletContext getServletContext();// 通過初始化參數的name獲取初始化參數的valueString getInitParameter(String var1);// 獲取初始化參數的全部的valueEnumeration<String> getInitParameterNames();
}
# 獲取ServletConfig對象的兩種方式
- 定義一個全局變量
private ServletConfig config;
- 這個方法是在Servlet對象中自己用的 - 通過:
getServletConfig()
方法獲取 - 這個方法是在Servlet對象的子類中使用的
7、ServletContext
ServletContext 官方叫 servlet 上下文。服務器會為每一個工程創建一個對象,這個對象就是 ServletContext 對象。這個對象全局唯一,而且工程內部的所有 servlet 都共享這個對象。所以叫全局應用程序共享對象。所有的 Servlet 對象共享一個 ServletContext 對象。
/*** 提供一些方法,供Servlet與Servlet容器進行交互,例如獲取文件MIME類型等.* 每個Web應用程序都有一個Servlet上下文.* */
public interface ServletContext {/*** 方法返回web應用的上下文路徑,就是我們部署的應用的根目錄名稱.*/public String getContextPath();/*** 根據資源定位符,獲取其Servlet上下文.*/public ServletContext getContext(String uripath);/*** 返回Servlet容器支持的Servlet API主版本號.*/public int getMajorVersion();/*** 返回Servlet容器支持的Servlet API次版本號.*/public int getMinorVersion();/*** 返回指定文件的MIME類型.* @param file 文件.* @return MIME類型.*/public String getMimeType(String file);/*** 返回一個類似于目錄的列表,其中列出了web應用程序中資源的所有路徑,這些資源的最長子路徑與提供的路徑參數匹配.* 例如輸入/pages,會以路徑的方式返回pages目錄下的所有文件.* @param path 目錄. * @return 指定目錄下的文件列表.*/public Set getResourcePaths(String path);/*** 根據指定路徑返回資源的URL,路徑必須以/開頭,代表當前Web應用程序的根目錄.* @param path 資源路徑.* @return 代表資源的URL.* @throws MalformedURLException .*/public URL getResource(String path) throws MalformedURLException;/*** 使用相對于根目錄的路徑訪問到web目錄下的所有文件,而不知道絕對路徑. * @param path 相對路徑.* @return 資源輸入流.*/public InputStream getResourceAsStream(String path);/*** 返回一個RequestDispatcher對象,該對象扮演著一個給定資源包裝者的角色.* 一個RequestDispatcher對象可以用于傳送一個請求到特定資源或者把特定資源包含到一個響應當中.* 該特定資源可以是動態的也可以是靜態的.* @param path 給定資源路徑.* @return RequestDispatcher對象.*/public RequestDispatcher getRequestDispatcher(String path);/*** 為指定名字的servlet對象返回一個RequestDispatcher對象.* 一個Servlet實例的名稱可以由ServletConfig.getServletName()獲取.* @param name Servlet名稱.* @return RequestDispatcher對象.*/public RequestDispatcher getNamedDispatcher(String name);/*** @deprecated * 根據Servlet名稱獲取Servlet.*/public Servlet getServlet(String name) throws ServletException;/*** @deprecated * 獲取所有Servlet的枚舉.*/public Enumeration getServlets();/*** @deprecated * 獲取所有Servlet名稱的枚舉.*/public Enumeration getServletNames();/*** 把指定的信息寫進servlet日志文件,通常是事物日志.日志文件的名稱和類型與servlet容器有關.*/public void log(String msg);/*** @deprecated * 把指定的信息寫進servlet日志文件,通常是事物日志.日志文件的名稱和類型與servlet容器有關.*/public void log(Exception exception, String msg);/*** 把指定的信息寫進servlet日志文件,通常是事物日志.日志文件的名稱和類型與servlet容器有關.*/public void log(String message, Throwable throwable);/*** 根據相對路徑獲取文件路徑.* "" -> C:\項目根.* "/" -> C:\項目根\.* "/pp" -> C:\項目根\pp* @param path 相對路徑.* @return 文件絕對路徑.*/public String getRealPath(String path);/*** 獲取Servlet容器版本號.* @return Servlet容器版本號.*/public String getServerInfo();/*** 根據指定名稱獲取初始化參數值.* @param name 參數名稱.* @return 參數值.*/public String getInitParameter(String name);/*** 獲取初始化參數枚舉.* @return 參數枚舉.*/public Enumeration getInitParameterNames();/*** 根據給定屬性名,從ServletContext中獲取屬性.* @param name 屬性名.* @return 屬性值.*/public Object getAttribute(String name);/*** 獲取ServletContext屬性名枚舉.* @return 屬性名枚舉.*/public Enumeration getAttributeNames();/*** 設置ServletContext屬性.*/public void setAttribute(String name, Object object);/*** 移除ServletContext屬性.移除后,獲取此屬性返回null.* @param name*/public void removeAttribute(String name);/*** 返回ServletContext對應應用的名稱.* 該名稱配置于web.xml的<display-name>標簽中.* @return 應用名稱.*/public String getServletContextName();
}
四、javax.servlet.http 包下主要的類和接口
1、javax.servlet.http 包定義的類和接口
類/接口 | 說明 |
---|---|
interface HttpServletRequest | 繼承了ServletRequest 接口,為HTTPServlet 提供請求信息 |
interface HttpServletResponse | 繼承了ServletResponse 接口,為HTTPServlet 輸出響應信息提供支持。 |
interface HttpSession | 為維護 HTTP 用戶的會話狀態提供支持。 |
interface HttpSessionBindingListener | 使得某對象在加入一個會話或從會話中刪除時能夠得到通知。 |
interface HttpSessionContext | 由Servlet 2.1 定義,該對象在新版本已不被支持。 |
class Cookie | 用在Servlet 中使用Cookie 技術 |
class HttpServlet | 定義了一個抽象類,繼承 GenericServlet 抽象類,應被 HTTPServlet 繼承。 |
class HttpSessionBindingEvent | 定義了一種對象,當某一個實現了 HttpSessionBindingListener 接口的對象被加入會話或從話中刪除時,會收到該類對象的一個句柄 |
class HttpUtils | 提供了一系列便于編寫HTTPServlet 的方法。 |
2、HttpServlet
HttpServlet 抽象類是繼承于 GenericServlet 抽象類而來的。使用 HttpServlet 抽象類時,還需要借助分別代表 Servlet 請求和 Servlet 響應的 HttpServletRequest 和 HttpServletResponse 對象。
HttpServlet 抽象類覆蓋了 GenericServlet 抽象類中的 Service()
方法,并且添加了一個自己獨有的 Service(HttpServletRequest request,HttpServletResponse)
方法。
GenericServlet 抽象類中是如何定義 service 方法的:
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
我們看到是一個抽象方法,也就是 HttpServlet 要自己去實現這個 service 方法,我們在看看 HttpServlet 是怎么覆蓋這個 service 方法的:
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;try {request = (HttpServletRequest)req;response = (HttpServletResponse)res;} catch (ClassCastException var6) {throw new ServletException("non-HTTP request or response");}this.service(request, response);}
我們發現,HttpServlet 中的 service 方法把接收到的 ServletRequsest 類型的對象轉換成了 HttpServletRequest 類型的對象,把 ServletResponse 類型的對象轉換成了HttpServletResponse 類型的對象。之所以能夠這樣強制的轉換,是因為在調用 Servlet 的 Service 方法時,Servlet 容器總會傳入一個 HttpServletRequest 對象和 HttpServletResponse 對象,預備使用 HTTP。因此,轉換類型當然不會出錯了。
3、HttpServletRequest
HttpServletRequest 是在 ServletRequest 基礎上做的進一步封裝,使得其更適用于基于 HTTP 的服務特性,在原有的 ServletRequest API 基礎上增加了處理 HTTP 的操作。Servlet 容器開發廠商會依據 HttpServletRequest API 進行具體實現。
package javax.servlet.http;import javax.servlet.ServletRequest;
import java.util.Enumeration;/*** 繼承自javax.servlet.ServletRequest.* 專門為HTTP Servlet提供的請求封裝類.* 由容器創建并傳遞給Servlet的sevice類.*/
public interface HttpServletRequest extends ServletRequest {/*** 基于BASIC認證.*/public static final String BASIC_AUTH = "BASIC";/*** 基于FORM認證.*/public static final String FORM_AUTH = "FORM";/*** 基于CLIENT_CERT認證.*/public static final String CLIENT_CERT_AUTH = "CLIENT_CERT";/*** 基于DIGEST認證.*/public static final String DIGEST_AUTH = "DIGEST";/*** 返回認證類型.* 所有Servlet容器都支持basic、form、client_cert,digest不一定支持.* 若不支持,則返回null.*/public String getAuthType();/*** 獲取請求中帶有的Cookie信息.*/public Cookie[] getCookies();/*** 以長整數形式返回一個特定的請求頭,該長整數代表一個Date對象. * 該方法可以用在包含時間信息的header中,如:If-Modified-Since.* @param name 頭名稱.* @return 頭值.*/public long getDateHeader(String name);/*** 根據指定的頭名稱獲取頭的值.* 若存在多個,則返回第一個.* @param name 頭名稱.* @return 頭值.*/public String getHeader(String name); /*** 根據指定的頭名稱獲取頭值的枚舉.* 若沒有找到,則返回空的枚舉.* @param name 頭名稱.* @return 頭值.*/public Enumeration getHeaders(String name); /*** 獲取所有的頭的枚舉.* @return 頭的枚舉.*/public Enumeration getHeaderNames();/*** 根據指定頭名稱獲取int類型的值.若未找到則返回-1,如不是int類型,則會拋出NumberFormatException異常.* @param name 頭名稱.* @return 頭值.*/public int getIntHeader(String name);/*** 獲取HTTP方法,如:GET、POST、PUT等.* @return 方法名.*/public String getMethod();/*** 官網解釋:* 返回與客戶端發出此請求時發送的URL相關聯的任何額外路徑信息.* 額外的路徑信息跟隨servlet路徑,但位于查詢字符串之前,并以"/"字符開頭.* 例如:url-pattern配置為/demo/*,請求URL為http://localhost/Pro/demo/htm/index.html,則pathInfo為/htm/index.html.* @return*/public String getPathInfo();/*** 返回servlet名稱之后、* 查詢字符串之前的任何額外路徑信息,并將其轉換為實際路徑. * 與轉換的CGI變量PATH U的值相同* @return*/public String getPathTranslated();/*** 返回項目根路徑.* 例如:url-pattern配置為/demo/*,請求URL為http://localhost/Pro/demo/htm/index.html,則contextPath為/demo.* @return 項目根路徑.*/public String getContextPath();/*** 獲得請求中的查詢字符串,例如a=1&b=2這樣的格式.* @return 查詢字符串.*/public String getQueryString();/*** 如果用戶已經過驗證,則返回發出此請求的用戶的登錄信息,如果用戶未經過驗證,則返回 null.* 用戶名是否隨每個后續請求發送取決于瀏覽器和驗證類型,返回的值與 CGI變量REMOTE_USER的值相同.* @return 用戶信息.*/public String getRemoteUser();/*** 返回一個 boolean值,指示指定的邏輯"角色"中是否包含經過驗證的用戶.* 角色和角色成員關系可使用部署描述符定義.* 如果用戶沒有經過驗證,則該方法返回 false.* @param role 角色.* @return 已驗證用戶是否屬于某種角色.*/public boolean isUserInRole(String role);/*** 返回包含當前已經過驗證的用戶的名稱的 java.security.Principal對象.* 如果用戶沒有經過驗證,則該方法返回 null.* @return java.security.Principal或null.*/public java.security.Principal getUserPrincipal();/*** 獲取請求對應的sessionId.* @return sessionId.會話ID.*/public String getRequestedSessionId();/*** 請求URL的相對地址,包括服務器路徑,不包括查詢參數.* @return 請求URL的相對地址.*/public String getRequestURI();/*** 請求的URL地址,包含協議、主機名、端口和服務器路徑,但是不包括查詢參數.* @return 請求URL地址.*/public StringBuffer getRequestURL();/*** 官方解釋:* 返回此請求的URL中調用servlet的部分.* 此路徑以"/"字符開頭,包含servlet名稱或到servlet的路徑,但不包含任何額外的路徑信息或查詢字符串.* 與CGI變量SCRIPT_NAME的值相同.* 其實真是的意思就是,在配置webx.xml或編程式配置時,配置了url-pattern,請求的URL與url-pattern的有效部分重合部分就是servletPath,* 也可以理解為url-pattern的有效部分就是servletPath.* 例如:url-pattern配置為/demo/*,請求URL為http://localhost/Pro/demo/htm/index.html,則servletPath為/demo.* @return*/public String getServletPath();/*** 獲得請求對應的當前sesson.* 在沒有session的情況下:* 若create=true,則新創建一個session.* 若create=false,則不創建session,返回null.* @param create session失效的情況下,是否創建session.* @return HttpSession實例.*/public HttpSession getSession(boolean create);/*** 獲得請求對應的當前sesson.* 若沒有session,則創建一個session.* @return HttpSession實例.*/public HttpSession getSession();/*** 返回session是否有效.* @return session是否有效.*/public boolean isRequestedSessionIdValid();/*** sessionId是否從Cookie中獲得.* @return 若是從Cookie中獲得,返回true,否則返回false.*/public boolean isRequestedSessionIdFromCookie();/*** sessionId是否從URL中獲得.* @return 若是從URL中獲得,返回true,否則返回false.*/public boolean isRequestedSessionIdFromURL();/*** @deprecated* sessionId是否從URL中獲得.* @return 若是從URL中獲得,返回true,否則返回false.*/public boolean isRequestedSessionIdFromUrl();}
4、HttpServletResponse
HttpServletResponse 是在 ServletResponse 基礎上做的進一步封裝,使得其更適用于基于 HTTP 的服務特性,在原有的 ServletResponse API 基礎上增加了處理 HTTP 的操作。 Servlet 容器開發廠商會依據 HttpServletResponse API 進行具體實現。
package javax.servlet.http;import java.io.IOException;import javax.servlet.ServletResponse;/*** 繼承自ServletResponse類,HttpServletResponse提供了HTTP專用的功能. * 例如:HTTP Headers和Cookies的設置.* Servlet容器創建HttpServletResponse實例,并將它傳遞給Servlet的service方法.*/
public interface HttpServletResponse extends ServletResponse {/*** 設置指定Cookie到response中.* 可以被多次調用,可以設置多個Cookie.* @param Cookie實例.*/public void addCookie(Cookie cookie);/*** 判斷response中是否包含某個響應頭.* @param 響應頭名稱.* @return 存在返回true,否則返回false.*/public boolean containsHeader(String name);/*** 對指定URL進行編碼,編碼后包含會話ID,若邏輯判斷不需要編碼,則返回原URL.* 此方法的實現需包括:確定會話ID是否需要包含在編碼后的URL中,例如,當瀏覽器支持Cookie時,或者URL重寫(會話跟蹤)被關閉時,則不需要URL編碼,直接返回原URL.* 對于健壯的會話跟蹤,Servlet發出的所有URL都應該通過這個方法運行.否則,URL重寫不能用于不支持Cookie的瀏覽器.* @param 待編碼的URL.* @return 已編碼的URL.*/public String encodeURL(String url);/*** 對指定URL進行編碼,編碼后包含會話ID,若邏輯判斷不需要編碼,則返回原URL.* HttpServletResponse.sendRedirect調用前,需調用此方法進行URL編碼.* 此方法包括是否包含會話ID的邏輯.* 此方法包含會話ID的邏輯與encodeURL(String url)是不同的,所以進行了分離.* 所有發送到HttpServletResponse.sendRedirect方法應通過此方法運行,否則,URL重寫不能用于不支持cookies的瀏覽器.* @param 待編碼的URL.* @return 已編碼的URL.*/public String encodeRedirectURL(String url);/*** @deprecated * 已棄用,使用encodeURL(String url).*/public String encodeUrl(String url);/*** @deprecated * 已棄用,使用encodeRedirectURL(String url).*/public String encodeRedirectUrl(String url);/*** 寫入指定的狀態碼和錯誤描述信息,并清除緩沖區,將錯誤響應給客戶端.* 如果響應已經提交,此方法將拋出一個IllegalStateException,使用此方法后,應將響應視為已提交,不應寫入.* @param 錯誤狀態碼.* @param 錯誤描述信息.*/public void sendError(int sc, String msg) throws IOException;/*** 寫入指定的狀態碼,并清除緩沖區,將錯誤響應給客戶端.* 如果響應已經提交,此方法將拋出一個IllegalStateException,使用此方法后,應將響應視為已提交,不應寫入.* @param 錯誤狀態碼.*/public void sendError(int sc) throws IOException;/*** 使用指定的重定向位置URL向客戶端發送臨時重定向響應.* 此方法可以接受相對URL,Servlet容器必須在向客戶機發送響應之前將相對URL轉換為絕對URL.* 如果位置是相對的而沒有前導"/",容器會將其解釋為相對于當前請求URI.* 如果位置與前導"/"相關,則容器會將其解釋為相對于servlet容器根.* 如果響應已經提交,此方法將拋出一個IllegalStateException,使用此方法后,應將響應視為已提交,不應寫入.* @param 重定向地址.*/public void sendRedirect(String location) throws IOException;/*** 設置Date類型頭信息.若已經存在指定的頭,則會覆蓋.* @param 頭名稱.* @param 頭值.*/public void setDateHeader(String name, long date);/*** 新增Date類型頭信息.不管是否存在,都會追加,可允許存在多個同名的頭.* @param 頭名稱.* @param 頭值.*/public void addDateHeader(String name, long date);/*** 設置頭信息.若已經存在指定的頭,則會覆蓋.* @param 頭名稱.* @param 頭值.*/public void setHeader(String name, String value);/*** 新增頭信息.不管是否存在,都會追加,可允許存在多個同名的頭.* @param 頭名稱.* @param 頭值.*/public void addHeader(String name, String value);/*** 設置int類型頭信息.若已經存在指定的頭,則會覆蓋.* @param 頭名稱.* @param 頭值.*/public void setIntHeader(String name, int value);/*** 新增int類型頭信息.不管是否存在,都會追加,可允許存在多個同名的頭.* @param 頭名稱.* @param 頭值.*/public void addIntHeader(String name, int value);/*** 設置response的狀態碼.* 此方法被用來設置成功狀態碼,出現錯誤設置狀態碼使用sendError方法.* 例如:SC_OK、SC_MOVED_TEMPORARILY.* @param 狀態碼.*/public void setStatus(int sc);/*** @deprecated * 設置response的狀態碼.* 此方法被用來設置成功狀態碼,出現錯誤設置狀態碼使用sendError方法.* 例如:SC_OK、SC_MOVED_TEMPORARILY.* @param 狀態碼.* @param 狀態描述.*/public void setStatus(int sc, String sm);/** 服務端響應狀態碼. 參考查看RFC 2068標準.*//*** CONTINUE:繼續,客戶端應繼續其請求.*/public static final int SC_CONTINUE = 100;/*** SWITCHING_PROTOCOLS:切換協議。服務器根據客戶端的請求切換協議.只能切換到更高級的協議,例如,切換到HTTP的新版本協議.*/public static final int SC_SWITCHING_PROTOCOLS = 101;/*** OK:請求成功.一般用于GET與POST請求.*/public static final int SC_OK = 200;/*** CREATED:已創建.成功請求并創建了新的資源.*/public static final int SC_CREATED = 201;/*** ACCEPTED:已接受.已經接受請求,但未處理完成.*/public static final int SC_ACCEPTED = 202;/*** NON_AUTHORITATIVE_INFORMATION:非授權信息.請求成功.但返回的meta信息不在原始的服務器,而是一個副本.*/public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;/*** NO_CONTENT:無內容.服務器成功處理,但未返回內容.在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔.*/public static final int SC_NO_CONTENT = 204;/*** RESET_CONTENT:重置內容.服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖.可通過此返回碼清除瀏覽器的表單域.*/public static final int SC_RESET_CONTENT = 205;/*** PARTIAL_CONTENT:部分內容.服務器成功處理了部分GET請求.*/public static final int SC_PARTIAL_CONTENT = 206;/*** MULTIPLE_CHOICES:多種選擇.請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇.*/public static final int SC_MULTIPLE_CHOICES = 300;/*** SC_MOVED_PERMANENTLY:永久移動.請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI.今后任何新的請求都應使用新的URI代替.*/public static final int SC_MOVED_PERMANENTLY = 301;/*** MOVED_TEMPORARILY:臨時移動.與301類似.但資源只是臨時被移動.客戶端應繼續使用原有URI.*/public static final int SC_MOVED_TEMPORARILY = 302;/*** SC_FOUND:臨時移動.與301類似.但資源只是臨時被移動.客戶端應繼續使用原有URI.*/public static final int SC_FOUND = 302;/*** SEE_OTHER:查看其它地址.與301類似.使用GET和POST請求查看.*/public static final int SC_SEE_OTHER = 303;/*** NOT_MODIFIED:未修改.所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源.客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之后修改的資源.*/public static final int SC_NOT_MODIFIED = 304;/*** USE_PROXY:使用代理.所請求的資源必須通過代理訪問.*/public static final int SC_USE_PROXY = 305;/*** TEMPORARY_REDIRECT:臨時重定向.與302類似.使用GET請求重定向.*/public static final int SC_TEMPORARY_REDIRECT = 307;/*** BAD_REQUEST:客戶端請求的語法錯誤,服務器無法理解.*/public static final int SC_BAD_REQUEST = 400;/*** UNAUTHORIZED:請求要求用戶的身份認證.*/public static final int SC_UNAUTHORIZED = 401;/*** PAYMENT_REQUIRED:保留,將來使用.*/public static final int SC_PAYMENT_REQUIRED = 402;/*** FORBIDDEN:服務器理解請求客戶端的請求,但是拒絕執行此請求.*/public static final int SC_FORBIDDEN = 403;/*** NOT_FOUND:服務器無法根據客戶端的請求找到資源(網頁).通過此代碼,網站設計人員可設置"您所請求的資源無法找到"的個性頁面.*/public static final int SC_NOT_FOUND = 404;/*** METHOD_NOT_ALLOWED:客戶端請求中的方法被禁止.*/public static final int SC_METHOD_NOT_ALLOWED = 405;/*** NOT_ACCEPTABLE:服務器無法根據客戶端請求的內容特性完成請求.*/public static final int SC_NOT_ACCEPTABLE = 406;/*** PROXY_AUTHENTICATION_REQUIRED:請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權.*/public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;/*** REQUEST_TIMEOUT:服務器等待客戶端發送的請求時間過長,超時.*/public static final int SC_REQUEST_TIMEOUT = 408;/*** CONFLICT:服務器完成客戶端的PUT請求時可能返回此代碼,服務器處理請求時發生了沖突.*/public static final int SC_CONFLICT = 409;/*** GONE:客戶端請求的資源已經不存在.410不同于404,如果資源以前有現在被永久刪除了可使用410代碼,網站設計人員可通過301代碼指定資源的新位置.*/public static final int SC_GONE = 410;/*** LENGTH_REQUIRED:服務器無法處理客戶端發送的不帶Content-Length的請求信息.*/public static final int SC_LENGTH_REQUIRED = 411;/*** PRECONDITION_FAILED:客戶端請求信息的先決條件錯誤.*/public static final int SC_PRECONDITION_FAILED = 412;/*** REQUEST_ENTITY_TOO_LARGE:由于請求的實體過大,服務器無法處理,因此拒絕請求.為防止客戶端的連續請求,服務器可能會關閉連接.如果只是服務器暫時無法處理,則會包含一個Retry-After的響應信息.*/public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;/*** SC_REQUEST_URI_TOO_LONG:請求的URI過長(URI通常為網址),服務器無法處理.*/public static final int SC_REQUEST_URI_TOO_LONG = 414;/*** UNSUPPORTED_MEDIA_TYPE:服務器無法處理請求附帶的媒體格式.*/public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;/*** REQUESTED_RANGE_NOT_SATISFIABLE:客戶端請求的范圍無效.*/public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;/*** EXPECTATION_FAILED:服務器無法滿足Expect的請求頭信息.*/public static final int SC_EXPECTATION_FAILED = 417;/*** INTERNAL_SERVER_ERROR:服務器內部錯誤,無法完成請求.*/public static final int SC_INTERNAL_SERVER_ERROR = 500;/*** NOT_IMPLEMENTED:服務器不支持請求的功能,無法完成請求.*/public static final int SC_NOT_IMPLEMENTED = 501;/*** BAD_GATEWAY:作為網關或者代理工作的服務器嘗試執行請求時,從遠程服務器接收到了一個無效的響應.*/public static final int SC_BAD_GATEWAY = 502;/*** SERVICE_UNAVAILABLE:由于超載或系統維護,服務器暫時的無法處理客戶端的請求.延時的長度可包含在服務器的Retry-After頭信息中.*/public static final int SC_SERVICE_UNAVAILABLE = 503;/*** GATEWAY_TIMEOUT:充當網關或代理的服務器,未及時從遠端服務器獲取請求.*/public static final int SC_GATEWAY_TIMEOUT = 504;/*** GATEWAY_TIMEOUT:服務器不支持請求的HTTP協議的版本,無法完成處理.*/public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;}