- 3.1,HttpServletRequest 類有什麼作用
- 3.2,HttpServletRequest 類的常用方法
- 3.3,如何獲取請求參數
- 3.4,doGet 請求的中文亂碼解決
- 3.5,POST 請求的中文亂碼解決
- 3.6,請求的轉發
- 3.7,base 標籤的作用
- 3.8,Web 中的相對路徑和絕對路徑
- 3.9,web 中 / 斜槓的不同意義
什麼是 HTTP 協議
- 協議是指雙方,或多方,相互約定好,大家都需要遵守的規則,叫協議
- 所謂 HTTP 協議,就是指,客戶端和服務器之間通信時,發送的數據,需要遵守的規則,叫 HTTP 協議
- HTTP 協議中的數據又叫報文
請求的 HTTP 協議格式
- 客戶端給服務器發送數據叫請求
- 服務器給客戶端回傳數據叫響應
- 請求又分爲 GET 請求,和 POST 請求兩種
①,get請求參數通過url傳遞,post請求放在Request body中
②,get請求不安全,因爲參數直接暴露在url上,所以不能傳遞敏感信息
③,get請求在url中傳送的參數是有長度限制的,而post請求沒有,對於參數數據類型,get請求只接受ASCII字符,而post請求沒有限制
④,get請求只能進行url編碼,而post請求支持多種編碼方式
⑤,get請求參數會被完整保留在瀏覽器歷史記錄裏,而post請求中的參數不能保留
⑥,get請求在瀏覽器回退是無害的,而post請求會再次提交
⑦,get請求產生的url地址可以被Bookmark,而post請求不可以
⑧,get請求會被瀏覽器主動cache,而post不會,除非手動設置
-
GET 請求有哪些
①,form 標籤 method=get
②,a 標籤
③,link 標籤引入 css
④,Script 標籤引入 js 文件
⑤,img 標籤引入圖片
⑥,iframe 引入 html 頁面
⑦,在瀏覽器地址欄中輸入地址後敲回車 -
POST 請求有哪些
⑧,form 標籤 method=post
- 1XX Informational(信息性狀態碼)接收的請求正在處理
- 2XX Success(成功狀態碼) 請求正常處理完畢
- 3XX Redirection(重定向狀態碼) 需要進行附加操作以完成請求
- 4XX Client Error(客戶端錯誤狀態碼)服務器無法處理請求
- 5XX Server Error(服務器錯誤狀態碼)服務器處理請求出錯
- 200 表示請求成功
- 302 表示請求重定向
- 404 表示請求服務器已經收到了,但是你要的數據不存在(請求地址錯誤)
- 500 表示服務器已經收到請求,但是服務器內部錯誤(代碼錯誤)
HttpServletRequest 類
- 每次只要有請求進入 Tomcat 服務器,Tomcat 服務器就會把請求過來的 HTTP 協議信息解析好封裝到 Request 對象中。然後傳遞到 service 方法(doGet 和 doPost)中給我們使用。我們可以通過 HttpServletRequest 對象,獲取到所有請求的信息。
方法 | 解釋 |
---|---|
getRequestURI() | 獲取請求的資源路徑 |
getRequestURL() | 獲取請求的統一資源定位符(絕對路徑) |
getRemoteHost() | 獲取客戶端的 ip 地址 |
getHeader() | 獲取請求頭 |
getParameter() | 獲取請求的參數 |
getParameterValues() | 獲取請求的參數(多個值的時候使用) |
getMethod() | 獲取請求的方式 GET 或 POST |
setAttribute(key, value) | 設置域數據 |
getAttribute(key) | 獲取域數據 |
getRequestDispatcher() | 獲取請求轉發對象 |
- 表單:
<form action="http://localhost:8080/ServletTest/demo" method="get">
用戶名:<input type="text" name="username"><br/>
密碼:<input type="password" name="password"><br/>
興趣愛好:<input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="java">Java
<input type="checkbox" name="hobby" value="js">JavaScript<br/>
<input type="submit">
</form>
- Java 代碼:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 獲取請求參數
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println(" 用戶名:" + username);
System.out.println(" 密碼:" + password);
System.out.println(" 興趣愛好:" + Arrays.asList(hobby));
}
// 獲取請求參數
String username = req.getParameter("username");
//1 先以 iso8859-1 進行編碼
//2 再以 utf-8 進行解碼
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設置請求體的字符集爲 UTF-8 ,從而解決 post 請求的中文亂碼問題
req.setCharacterEncoding("UTF-8");
System.out.println("-------------doPost------------");
// 獲取請求參數
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println(" 用戶名:" + username);
System.out.println(" 密碼:" + password);
System.out.println(" 興趣愛好:" + Arrays.asList(hobby));
}
-
什麼是請求的轉發?
請求轉發是指,服務器收到請求後,從一次資源跳轉到另一個資源的操作叫請求轉發。
-
請求轉發的特點
①,瀏覽器地址欄沒有變化
②,他們是一次請求
③,他們共享Request域中的數據
④,可以轉發到WEB-INF目錄下
⑤,不可以訪問工程以外的資源
-
Servlet1 代碼:
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取請求的參數(辦事的材料)查看
String username = req.getParameter("username");
System.out.println("在 Servlet1 中查看參數(材料):" + username);
// 給材料 蓋一個章,並傳遞到 Servlet2 去查看
req.setAttribute("key1", " Servlet1 的章");
// 問路: Servlet2 怎麼走
/**
* 請求轉發必須要以斜槓打頭, / 斜槓表示地址爲: http://ip:port/ 工程名 / , 映射到 IDEA 代碼的 web 目錄
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("https://blog.csdn.net/qq_41530004);
// 走向 Sevlet2
requestDispatcher.forward(req, resp);
}
- Servlet2 代碼:
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取請求的參數(辦事的材料)查看
String username = req.getParameter("username");
System.out.println("在 Servlet2中查看參數(材料):" + username);
// 查看 Servlet 1 是否有蓋章
Object key1 = req.getAttribute("key1");
System.out.println(" Servlet 1 是否有章:" + key1);
// 處理自己的業務
System.out.println("Servlet2 務 處理自己的業務 ");
}
}
- xml 代碼:
<servlet>
<servlet-name>Servlet2</servlet-name>
<servlet-class>com.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet2</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
- base標籤可以設置當前頁面中所有相對路徑工作時,參照那個路徑來進行跳轉
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--base 標籤設置頁面相對路徑工作時參照的地址
href 屬性就是參數的地址值
-->
<base href="http://localhost:8080/ServletDemo/a/b/">
</head>
<body>
這是 a 下的 b 下的 c.html 頁面<br/>
<a href="../../index.html">跳回首頁</a><br/>
</body>
</html>
在 javaWeb 中,路徑分爲相對路徑和絕對路徑兩種:
-
相對路徑:
. :表示當前目錄
… :表示上一級目錄
資源名: 表示當前目錄/資源名
-
絕對路徑:
http://ip:port/工程路徑/資源路徑
-
在實際開發中,路徑都使用絕對路徑,而不簡單的使用相對路徑。
①、絕對路徑
②、base+相對
-
在 web 中 / 斜槓 是一種絕對路徑。
-
/ 斜槓 如果被瀏覽器解析,得到的地址是:http://ip:port/
<a href="/">斜槓</a>
-
/ 斜槓 如果被服務器解析,得到的地址是:http://ip:port/工程路徑
①、/servlet1
②、servletContext.getRealPath(“/”);
③、request.getRequestDispatcher(“/”);
-
特殊情況: response.sendRediect(“/”); 把斜槓發送給瀏覽器解析。得到 http://ip:port/
HttpServletResponse 類
- HttpServletResponse 類和 HttpServletRequest 類一樣。每次請求進來,Tomcat 服務器都會創建一個 Response 對象傳遞給 Servlet 程序去使用。HttpServletRequest 表示請求過來的信息,HttpServletResponse 表示所有響應的信息,我們如果需要設置返回給客戶端的信息,都可以通過 HttpServletResponse 對象來進行設置
-
字節流 getOutputStream(); ---------- > 常用於下載(傳遞二進制數據)
-
字符流 getWriter(); ---------- > 常用於回傳字符串(常用)
-
兩個流同時只能使用一個。使用了字節流,就不能再使用字符流,反之亦然,否則就會報錯。
-
案例:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getOutputStream();
resp.getWriter();
}
- 往客戶端回傳 字符串 數據
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//往客戶端回傳 字符串 數據
PrintWriter writer = resp.getWriter();
writer.write("我是Tommey呀");
}
- 解決響應中文亂碼方案一(不推薦使用):
// 設置服務器字符集爲 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通過響應頭,設置瀏覽器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
- 解決響應中文亂碼方案二(推薦):
/**
* 它會同時設置服務器和客戶端都使用 UTF-8 字符集,還設置了響應頭
* 此方法一定要在獲取流對象之前調用纔有效
*/
resp.setContentType("text/html; charset=UTF-8");
-
請求重定向,是指客戶端給服務器發請求,然後服務器告訴客戶端說。我給你一些地址。你去新地址訪問。叫請求
重定向(因爲之前的地址可能已經被廢棄)。 -
示意圖:
-
請求重定向的特點:
①,瀏覽器地址會發生變化
②,兩次請求
③,不能共享Request域中數據
④,不能訪問WEB-INF下的資源
⑤,可以訪問工程外的資源
-
請求重定向的第一種方案:
// 設置響應狀態碼 302 ,表示重定向,(已搬遷)
resp.setStatus(302);
// 設置響應頭,說明 新的地址在哪裏
resp.setHeader("Location", "http://localhost:8080");
- 請求重定向的第二種方案(推薦使用):
resp.sendRedirect("http://localhost:8080");