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