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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556220.html
標籤:其他
上一篇:Golang 簡單的資料對齊可提高程式速度和記憶體使用率
下一篇:返回列表