ttpServletRequest對象概述
在Servlet API中,定義了一個HttpServletRequest接口,它繼承自ServletReauest接口,專門用來封裝HTTP請求消息。由于HTTP請求消息分為請求行、請求消息頭和請求消息體三部分,是以,在HttpServletRequest接口中定義了擷取請求行、請求頭和請求消息體的相關方法。
我們在建立Servlet時會覆寫service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個為代表請求的request和代表響應response。
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大,今天我們學習HttpServletRequest。
request的運作流程
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1Y0RidXOxglZSdkY25kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxUTN2UTM0ETM3ETOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
通過抓包工具抓取HTTP請求
通過request獲得請求行資訊
當通路Servlet時,會在請求消息的請求行中,包含請求方法、請求資源名、請求路徑等資訊,為了擷取這些資訊,在HTTPServletRequest接口中,定義了一系列用于擷取請求行的方法,如下表:
方法聲明 | 功能描述 |
---|---|
String getmethod() | 該方法用于擷取HTTP請求消息中的請求方式(如GET、POST等) |
String getReauestURI() | 該方法用于擷取請求行中資源名稱部分,即位于URL的主機和端口之後、參數部分之前的部分 |
String getQueryString() | 該方法用于擷取請求行中的參數部分,也就是資源路徑後面問号以後的所有内容 |
String getProtocol() | 該方法用于擷取請求行中的協定名和版本,例如,HTTP/1.0 或 HTTP/1.1 |
String getContextPath( ) | 該方法用于擷取請求URL中屬于WEB應用程式的路徑,這個路徑以"/"開頭,表示相對于整個WEB站點的根目錄,路幾個結尾不含“/”。如果請求URL屬于web站點的根目錄,那麼傳回結果為空字元串“” |
String getServletPath() | 該方法用于擷取Servlet的名稱或Servlet所映射的路徑 |
String getRemoteAddr( ) | 該方法用于擷取請求用戶端的IP位址,其格式類似于"192.168.0.1" |
String getRemoteHost() | 該方法用于擷取請求用戶端的完整主機名,其格式類似于"pc1.xxxx.cn"。需要注意的是,如果無 |
int getRemotePort() | 該方法用于擷取請求用戶端網絡連接配接的端口号 |
String getLocalAddr() | 該方法用于擷取Web伺服器上接收目前請求網絡連接配接的IP位址 |
String getLocalName() | 該方法用于擷取Web伺服器上接收目前網絡連接配接IP所對應的主機名 |
int getLocalPort() | 該方法用于擷取Web伺服器上接收目前網絡連接配接的端口号 |
String getServerName() | 該方法用于擷取目前請求所指向的主機名,即HTTP請求消息中HOST頭字段所對應的主機名部分 |
int getServerPort() | 該方法用于擷取目前請求所連接配接的伺服器端口号,即如果HTTP請求消息中HOST頭字段所對應的端口号部分 |
String getScheme() | 該方法用于擷取請求的協定名,例如http、https或ftp |
StringBuffer getRequestURL() | 該方法用于擷取用戶端送出請求時的完整URL,包括協定、伺服器名、端口号、資源路徑等資訊,但不包括後面的查詢參數部分。注意,getRequestRUL()方法傳回的時StringBuffer類型,而不是String類型。 |
示例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//擷取請求行的相關資訊
out.println("getMethod:" + request.getMethod() + "<br/>");
out.println("getQueryString:" + request.getQueryString() + "<br/>");
out.println("getProtocol:" + request.getProtocol() + "<br/>");
out.println("getContextPath" + request.getContextPath() + "<br/>");
out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
out.println("getServletPath:" + request.getServletPath() + "<br/>");
out.println("getRemoteAddr:" + request.getRemoteAddr() + "<br/>");
out.println("getRemoteHost:" + request.getRemoteHost() + "<br/>");
out.println("getRemotePort:" + request.getRemotePort() + "<br/>");
out.println("getLocalAddr:" + request.getLocalAddr() + "<br/>");
out.println("getLocalName:" + request.getLocalName() + "<br/>");
out.println("getLocalPort:" + request.getLocalPort() + "<br/>");
out.println("getServerName:" + request.getServerName() + "<br/>");
out.println("getServerPort:" + request.getServerPort() + "<br/>");
out.println("getScheme:" + request.getScheme() + "<br/>");
out.println("getRequestURL:" + request.getRequestURL() + "<br/>");
}
通過浏覽器通路,頁面顯示:
通過request獲得請求頭
當請求Servlet時,需要通過請求頭向伺服器傳遞附加資訊,例如,用戶端可以接收的資料類型,壓縮方式,語言等。為此,在HttpServletRequest接口中,定義了一系列用于擷取HTTP請求頭字段的方法,如下表:
方法聲明 | 功能描述 |
---|---|
String getHeader(String name) | 該方法用于擷取一個指定頭字段的值,如果請求消息中沒有包含指定的頭字段,getHeader()方法傳回null;如果請求消息中包含有多個指定名稱的頭字段,getHeader()方法傳回其中第一個頭字段的值 |
Enumeration getHeaders(String name) | 該方法傳回一個Enumeration集合對象,該集合對象由請求消息中出現的某個指定名稱的所有頭字段值組成。在多數情況下,一個頭字段名在請求消息中隻出現一次,但有時候可能會出現多次 |
Enumeration getheaderNames() | 該方法用于擷取一個包含所有請求頭字段的Enumeration對象 |
int getIntHeader(String name) | 該方法用于擷取指定名稱的頭字段,并且将其值轉換為int類型。需要注意的是,如果指定名稱的頭字段不存在,傳回值為-1;如果擷取到的頭字段的值不能轉為int類型,将發生NumberFormatException異常 |
Long getDateHeader(String name) | 該方法用于擷取指定頭字段的值,并将其按GMT時間格式轉換成一個代表日期/時間的長整數,這個長整數是自1970年1月1日0點0分0秒算起的以毫秒為機關的時間值 |
String getContentType() | 該方法用于擷取Content-Type頭字段的值,結果為String類型 |
int getContentLength() | 該方法用于擷取Content-Length頭字段的值,結果為int類型 |
String getCharacterEncoding() | 該方法用于傳回請求消息的實體部分的字元集編碼,通常是從Content-Type頭字段中進行提取,結果為String類型 |
示例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//擷取請求頭資訊
Enumeration headerNames = request.getHeaderNames();
//使用循環周遊請求頭,并通過getHeader()方法擷取一個指定名稱的頭字段
while (headerNames.hasMoreElements()){
String headerName = (String) headerNames.nextElement();
out.println(headerName + " : " + request.getHeader(headerName) + "<br/>");
}
}
通過浏覽器通路,頁面顯示:
通過request獲得請求體(請求參數)
在實際開發中,經常需要擷取使用者送出的表單資料,例如,使用者名,密碼、電子郵件等,為了友善擷取表單中的請求參數,在HttpServletRequest接口總,定義了一些列擷取請求參數的方法,如下表所示:
方法聲明 | 功能描述 |
---|---|
String getParameter(String name) | 該方法用于擷取某個指定名稱的參數值,如果請求消息中沒有包含指定名稱的參數,getParameter()方法傳回null;如果指定名稱的參數存在但沒有設定值,則傳回一個空串;如果請求消息中包含有多個該指定名稱的參數,getParameter()方法傳回第一個出現的參數值 |
String[] getParameterValues(String name) | HTTP請求消息中可以有多個相同名稱的參數(通常由一個包含有多個同名的字段元素的FORM表單生成),如果要獲得HTTP請求消息中的同一個參數名所對應的所有參數值,那麼就應該使用getParameterValues()方法,該方法用于傳回一個String類型的數組 |
Enumeration getParameterNames() | 該方法用于傳回一個包含請求消息中所有參數名的Enumeration對象,在此基礎上,可以對請求消息中的所有參數進行周遊處理 |
Map getParameterMap() | 個體Parameter Map()方法用于将請求消息中的所有參數名和值裝入進一個Map對象中傳回 |
示例:
建立一個帶有表單的jsp頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>表單</title>
</head>
<body>
<form action="/JavaEEDemo/request" method="post">
使用者名:<input type="text" name="username"><br/>
密 碼:<input type="password" name="password"><br/>
愛 好:
<input type="checkbox" name="hobby" value="sing">唱歌
<input type="checkbox" name="hobby" value="dance">跳舞
<input type="checkbox" name="hobby" value="football">足球
<input type="submit" value="送出">
</form>
</body>
</html>
編寫Servlet的doPost方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("使用者名:" + username);
System.out.println("密碼:" + password);
//擷取參數名為hobby的值
String[] hobbys = request.getParameterValues("hobby");
System.out.println("愛好:");
for (int i = 0; i < hobbys.length; i++) {
System.out.println(hobbys[i] + ", ");
}
}
通過浏覽器通路jsp頁面:
Size:規定文本的尺寸大小。可能的值:從 1 到 7 的數字。浏覽器預設值是 3。
呈現效果:
我是黑體字
我是微軟雅黑
我是華文彩雲
color=#0099ff size=72 #00ffff" size="72">color=#00ffff
color=gray