# HttpServletRequest對象 ## 基本介紹 **HttpServletRequest對象:**HttpServletRequest 對象專門用於封裝 HTTP 請求消息,簡稱 request 對象。主要作用是用來接收客戶端發送過來的請求信息,該對象是由Tomcat封裝好傳遞過來 ...
HttpServletRequest對象
基本介紹
HttpServletRequest對象:HttpServletRequest 對象專門用於封裝 HTTP 請求消息,簡稱 request 對象。主要作用是用來接收客戶端發送過來的請求信息,該對象是由Tomcat封裝好傳遞過來。
HttpServletRequest介面是ServletRequest的子介面。HTTP 請求消息分為請求行、請求消息頭和請求消息體三部分,所以 HttpServletRequest 介面中定義了獲取請求行、請求頭和請求消息體的相關方法。
在HttpServletRequest對象在Service方法中由容器傳入過來,無需自己創建。
接收請求
常用方法
返回值類型 | 方法聲明 | 描述 |
---|---|---|
StringBuffer | getRequestURL() | 返回客服端發出請求時的完整URL |
String | getRequestURI() | 該方法用於獲取請求行中的資源名稱部分,即位於 URL 的主機和埠之後,參數部分之(URL 中“?”以前)的部分。 |
String | getQueryString() | 該方法用於獲取請求行中的參數部分,也就是 URL 中“?”以後的所有內容。 |
String | getMethod() | 該方法用於獲取 HTTP 請求方式(如 GET、POST 等)。 |
String | getProtocol() | 返回HTTP版本號。 |
String | getContextPath() | 返回當前 Servlet 所在的應用的名字(上下文)。對於預設(ROOT)上下文中的 Servlet,此方法返回空字元串""。 |
代碼演示:
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s01")
public class servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*常用方法*/
//輸入的地址:http://localhost:8080/ser02/s01
//獲取請求時的完整路徑(從http開始,到 "?" 前面結束)
String url = req.getRequestURL() + "";
System.out.println("請求時的完整路徑:" + url);//請求時的完整路徑:http://localhost:8080/ser02/s01
//獲取請求時的部分路徑(從項目的站點名開始,到 "?" 前面結束)
String uri = req.getRequestURI();
System.out.println("請求時的部分路徑:" + uri);//請求時的部分路徑:/ser02/s01
//獲取請求時的參數字元串(從 "?" 後面開始,到最後的字元串)
String queryString = req.getQueryString();
System.out.println("請求時的參數字元串(從 \"?\" 後面開始,到最後的字元串):" + queryString);//請求時的參數字元串(從 "?" 後面開始,到最後的字元串):null
//獲取請求方式(GET和POST)
String method = req.getMethod();
System.out.println("獲取請求方式(GET和POST):" + method);//獲取請求方式(GET和POST):GET
//獲取當前的協議版本
String protocol = req.getProtocol();
System.out.println("當前的協議版本:" + protocol);//當前的協議版本:HTTP/1.1
//獲取項目的站點名(項目的對外訪問路徑)
String contextPath = req.getContextPath();//上下文路徑
System.out.println("項目的站點名(項目的對外訪問路徑):" + contextPath);//項目的站點名(項目的對外訪問路徑):/ser02
}
}
獲取請求參數
返回值類型 | 方法聲明 | 描述 |
---|---|---|
String | getParameter(String name) | 以字元串形式返回指定的請求參數的值,或者如果參數不存在則返回 null。 |
String[] | getParameterValues(String name) | 返回一個字元串對象的數組,包含所有指定的請求參數的值,如果參數不存在則返回 null。 |
代碼演示:
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s01")
public class servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*獲取請求參數*/
//輸入的地址:http://localhost:8080/ser02/s01?uname=abc&upwd=123&hobby=sing&hobby=dance&hobby=rap
// 獲取指定名稱的參數值(重點!!!)
String uname = req.getParameter("uname");
String upwd = req.getParameter("upwd");
System.out.println("uname:" + uname + "upwd:" + upwd);//uname:abcupwd:123
//獲取指定名稱參數的所有參數值(通常用於覆選框)
String[] hobbies = req.getParameterValues("hobby");
//判斷數組是否為空
if (hobbies != null && hobbies.length > 0){
for (String hobby : hobbies) {
System.out.println("愛好:" + hobby);
}
}
/*
愛好:sing
愛好:dance
愛好:rap
*/
}
}
請求亂碼問題
-
基本介紹
由於現在的request屬於接收客戶端的參數,所以必然有其預設的語言編碼,主要是由於在解析過程中預設使用的編碼方式為ISO-8859-1(此編碼不支持中文),所以解析時一定會出現亂碼。要想解決這種亂碼問題,需要設置request中的編碼方式,告訴伺服器以何種方式來解析數據。或者在接收到亂碼數據以後,再通過相應的編碼格式還原。
-
實現方式
- 方式一:
request.setcharacterEncoding("UTF-8");
這種方式只針對POST有效(必須在接收所有的數據之前設定) - 方式二:
new string(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
藉助了String對象的方法,該種方式對任何請求有效,是通用的。
- 方式一:
Tomcat8起,以後的GET方式請求是不會出現亂碼的。
請求轉發
-
基本介紹
請求轉發,是一種伺服器行為,當客戶端請求達到後,伺服器進行轉發,此時會將請求對象進行保存,地址欄中的URL地址不會改變,得到響應後,伺服器端再將響應發送個客服端,從始至終只有一個請求發出。
-
特點
- 伺服器行為
- 地址欄不發生改變
- 從始至終只有一個請求發出
- request數據可以共用
-
實現方式
req.getRequestDispatcher(url).forward(request, response);
-
代碼演示:
package com.xxxx.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author: 86199 * @date: 2023/6/16 9:00 * Description: 請求轉發,可以讓請求從服務端跳轉到客戶端(或則跳轉到指定Servlet) * * 特點: * 1. 服務端行為 * 2. 地址欄不發生改變 * 3. 從始至終都只有一個請求,s03的請求 * 4. req數據可以共用 */ @WebServlet("/s03") public class Servlet03 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //接收客戶端請求的參數 String uname = req.getParameter("uname"); System.out.println("Servlet03 uname = " + uname); //請求轉發跳轉到Servlet04(另一個Servlet對象) // req.getRequestDispatcher("s04").forward(req, resp); //請求轉發跳轉到jsp頁面 req.getRequestDispatcher("login.jsp").forward(req, resp); //請求轉發跳轉到html頁面 req.getRequestDispatcher("login.html").forward(req, resp); } }
request作用域
-
基本介紹
通過該對象可以在請求中傳遞數據,作用範圍:在一次請求中有效,即伺服器跳轉有效。
-
實現方式
//設置域對象內容 request.setAttribute(String name, Object o); //獲取域對象內容 request.getAttribute(String name); //刪除域對象內容 request.removeAttribute(String name);
request 域對象中的數據在一次請求中有效,經過請求轉發,request域中的數據依然存在,即在請求轉發的過程中可以通過 request 來傳輸/共用數據。
-
代碼演示
package com.xxxx.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; @WebServlet("/s05") public class Servlet05 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Servlet05..."); //設置域對象內容 req.setAttribute("name", "admin"); req.setAttribute("age", 18); ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); req.setAttribute("list", list); //請求轉發 // req.getRequestDispatcher("s06").forward(req, resp);//共用一個req對象,這裡只能有一個請求轉發 //請求轉發跳轉到jsp,並通過域對象傳遞數據 req.getRequestDispatcher("index.jsp").forward(req, resp); } }
index.jsp文件代碼:
<%@ page import="java.util.List" %><%-- Created by IntelliJ IDEA. User: 86199 Date: 2023/6/12 Time: 11:28 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <h2>index頁面</h2> <%-- 如果要在jsp中寫Java代碼,需要寫在腳本段中--%> <% //獲取域對象內容 String name = (String) request.getAttribute("name"); System.out.println("name = " + name); Integer age = (Integer) request.getAttribute("age"); System.out.println("age = " + age); List<String> list = (List<String>) request.getAttribute("list"); System.out.println("list = " + list); %> </body> </html>