HttpServletRequest 接口繼承自 ServletRequest 接口,其主要作用是封裝 HTTP 請求消息。由于 HTTP 請求消息分為請求行、請求消息頭和請求消息體三部分。因此,在 HttpServletRequest 接口中定義了獲取請求行、請求頭和請求消息體的相關方法。
本節(jié)將針對常用的獲取請求行和請求消息頭的相關方法進行講解,下節(jié)《Java servlet獲取form表單數(shù)據(jù)(參數(shù))》繼續(xù)講解如何通過 HttpServletRequest 接口獲取用戶提交的 form 表單數(shù)據(jù)。
當訪問 Servlet 時,所有請求消息將被封裝到 HttpServletRequest 對象中,請求消息的請求行中包含請求方法、請求資源名、請求路徑等信息,為了獲取這些信息,HttpServletRequest 接口定義了一系列方法,如表 1 所示。
表 1 獲取請求行信息的常用方法
方法聲明 |
功能描述 |
---|---|
String getMethod() |
該方法用于獲取 HTTP 請求消息中的請求方式(如 GET、POST 等) |
String getRequestURI() |
該方法用于獲取請求行中的資源名稱部分即位于 URL 的主機和端門之后、參數(shù)部分之前的部分 |
String getQueryString() |
該方法用于獲取請求行中的參數(shù)部分,也就是資源路徑后問號(?)以后的所有內(nèi)容 |
String getContextPath() |
該方法用于獲取請求 URL 中屬于 Web 應用程序的路徑,這個路徑以 / 開頭,表示相對于整個 Web 站點的根目錄,路徑結尾不含 /。如果請求 URL 屬于 Web 站點的根目錄,那么返回結果為空字符串("") |
String getServletPath() |
該方法用于獲取 Servlet 的名稱或 Servlet 所映射的路徑 |
String getRemoteAddr() |
該方法用于獲取請求客戶端的 IP 地址,其格式類似于 192.168.0.3 |
String getRemoteHost() |
該方法用于獲取請求客戶端的完整主機名,其格式類似于 pcl.mengma.com。需要注意的是,如果無法解析出客戶機的完整主機名,那么該方法將會返回客戶端的 IP 地址 |
int getRemotePort() |
該方法用于獲取請求客戶端網(wǎng)絡連接的端口號 |
String getLocaIAddr() |
該方法用于獲取 Web 服務器上接收當前請求網(wǎng)絡連接的 IP 地址 |
String getLocalName() |
該方法用于獲取 Web 服務器上接收當前網(wǎng)絡連接 IP 所對應的主機名 |
int getLocalPort() |
該方法用于獲取 Web 服務器上接收當前網(wǎng)絡連接的端口號 |
String getServerName() |
該方法用于獲取當前請求所指向的主機名,即 HTTP 請求消息中 Host 頭字段所對應的主機名部分 |
int gctServcrPort() |
該方法用于獲取當前請求所連接的服務器端口號,即 HTTP 請求消息中 Host 頭字段所對應的端口號部分 |
StringBuffcr getRequestURL() |
該方法用于獲取客戶端發(fā)出請求時的完整 URL,包括協(xié)議、服務器名、端口號、 資源路徑等信息,但不包括后面的査詢參數(shù)部分。注意,getRequcstURL() 方法返冋的結果是 StringBuffer 類型,而不是 String 類型,這樣更便于對結果進行修改 |
表 1 列出了一系列用于獲取請求消息行信息的方法,為了使讀者更好地理解這些方法,下面通過案例演示這些方法的使用。
在 MyEclipse 中創(chuàng)建一個名稱為 servletDemo02 的項目,在 src 下新建一個名稱為 com.mengma.request 的包,在包中創(chuàng)建一個名為 RequestLineServlet 的 Servlet 類,在該類中編寫用于獲取請求行中相關信息的方法,如下所示。
package com.mengma.request;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestLineServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
// 獲取請求行的相關信息
out.println("getMethod : " + request.getMethod());
out.println("getRequestURI:" + request.getRequestURL());
out.println("getQueryString:" + request.getQueryString());
out.println("getContextPath:" + request.getContextPath());
out.println("getServletPath:" + request.getServletPath());
out.println("getRemoteAddr : " + request.getRemoteAddr());
out.println("getRemoteHost : " + request.getRemoteHost());
out.println("getRemotePort : " + request.getRemotePort());
out.println("getLocalAddr : " + request.getLocalAddr());
out.println("getLocalName : " + request.getLocalName());
out.println("getLocalPort : " + request.getLocalPort());
out.println("getServerName : " + request.getServerName());
out.println("getServerPort : " + request.getServerPort());
out.println("getRequestURL : " + request.getRequestURL());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
啟動 Tomcat 服務器,在瀏覽器的地址欄中輸入地址 http://localhost:8080/servletDemo02/RequestLineServlet 訪問 RequestLineServlet,瀏覽器的顯示結果如圖 1 所示。
從圖 1 中可以看出,瀏覽器顯示出了請求 RequestLineServlet 時發(fā)送的請求行信息。由此可見,通過 HttpServletRequest 對象可以很方便地獲取請求行的相關信息。
圖 1 運行結果
當瀏覽器發(fā)送 Servlet 請求時,需要通過請求消息頭向服務器傳遞附加信息,例如,客戶端可以接收的數(shù)據(jù)類型、壓縮方式、語言等。為此,在 HttpServletRequest 接口中定義了一系列用于獲取 HTTP 請求頭字段的方法,如表 2 所示。
表 2 獲取請求消息頭的方法
方法聲明 |
功能描述 |
---|---|
String getHeader(String name) |
該方法用于獲取一個指定頭字段的值,如果請求消息中沒有包含指定的頭字段,則 getHeader() 方法返回 null;如果請求消息中包含多個指定名稱的頭字段,則 getHeader() 方法返回其中第一個頭字段的值 |
Enumeration getHeaders(String name) |
該方法返回一個 Enumeration 集合對象,該集合對象由請求消息中出現(xiàn)的某個指定名稱的所有頭字段值組成。在多數(shù)情況下,一個頭字段名在請求消息中只出現(xiàn)一次,但有時可能會出現(xiàn)多次 |
Enumeration getHeaderNames() |
該方法用于獲取一個包含所有請求頭字段的 Enumeration 對象
|
int getIntHeader(String name) | 該方法用于獲取指定名稱的頭字段,并且將其值轉為 int 類型。需要注意的是,如果指定名稱的頭字段不存在,則返回值為 -1;如果獲取到的頭字段的值不能轉為 int 類型,則將發(fā)生 NumberFormatException 異常 |
long getDateHeader(String name) |
該方法用于獲取指定頭字段的值,并將其按 GMT 時間格式轉換為一個代表日期/時間的長整數(shù),該長整數(shù)是自 1970 年 1 月 1 日 0 時 0 分 0 秒算起的以毫秒為單位的時間值 |
String getContentType() |
該方法用于獲取 Content-Type 頭字段的值,結果為 String 類型 |
int getContentLength() |
該方法用于獲取 Content-Length 頭字段的值,結果為 int 類型 |
String getCharacterEncoding() |
該方法用于返回請求消息的實體部分的字符集編碼,通常是從 Content-Type 頭字段中進行提取,結果為 String 類型 |
表 2 列出了一系列用于讀取 HTTP 請求消息頭字段的方法,為了更好地掌握這些方法,下面通過案例學習這些方法的使用。
在 com.mengma.request 包中創(chuàng)建一個名為 RequestHeadersServlet 的 Servlet 類,該類中使用 getHeaderNames() 方法獲取請求消息頭信息,如下所示。
package com.mengma.request;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestHeadersServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
// 獲取請求消息中的所有頭字段
Enumeration headerNames = request.getHeaderNames();
//用循環(huán)遍歷所有請求頭,并通過 getHeader() 方法獲取一個指定名稱的頭字段
while (headerNames.hasMoreElements()) {
String headerName = (String) headerNames.nextElement();
out.print(headerName + ":" + request.getHeader(headerName)
+ "<br />");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
啟動 Tomcat 服務器,在瀏覽器的地址欄中輸入 http://localhost:8080/servletDemo02/RequestHeadersServlet 訪問 RequestHeadersServlet,瀏覽器的顯示結果如圖 2 所示。
圖 2 運行結果