目錄
Request(獲取請求信息)
1.獲取請求行內容
2.解決亂碼問題
?3.獲取請求頭部分
4.獲取請求體
?5.其他功能
Request(獲取請求信息)
工作流程:
1.通過請求的url的資源路徑,tomcat會生成相應的Servlet實現對象。
2.tomcat服務器會創建request對象和response對象,request對象接收請求消息數據。
3.tomcat將request和response方法傳遞給service方法并且調用service方法
4.程序員可以通過request對象獲取請求的消息數據,并且設置response的響應數據
5.服務器在給瀏覽器響應之前獲取response
1.獲取請求行內容
請求行部分 | 獲取請求行內容的方法 | 示例代碼 | 返回值 |
---|---|---|---|
請求方法(Method) | getMethod() | String method = request.getMethod(); | "GET" |
(重點)請求???? ? URI(URL) | getRequestURI() | String uri = request.getRequestURI(); | "/index.html" |
協議版本(Protocol) | getProtocol() | String protocol = request.getProtocol(); | "HTTP/1.1" |
查詢字符串(Query String) | getQueryString() | String queryString = request.getQueryString(); | null (如果沒有查詢字符串) |
(重點)上下文路徑(Context Path) | getContextPath() | String contextPath = request.getContextPath(); | "" (如果沒有上下文路徑,則為空字符串) |
?案例代碼:
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestHang")
public class RequestHang extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取方法String method =req.getMethod();System.out.println("使用的方法是"+method);
// * 獲取上下文路徑String contextPath = req.getContextPath();System.out.println("請求的上下文路徑是"+contextPath);
// * 獲取URIString Uri = req.getRequestURI();System.out.println("請求的URI是"+Uri);
// 獲取協議版本String version = req.getProtocol();System.out.println("請求的協議版本是"+version);
// 獲取查詢字符串String string = req.getQueryString();System.out.println("請求附帶的查詢字符串是"+string);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取方法String method =req.getMethod();System.out.println("使用的方法是"+method);
// * 獲取上下文路徑String contextPath = req.getContextPath();System.out.println("請求的上下文路徑是"+contextPath);
// * 獲取URIString Uri = req.getRequestURI();System.out.println("請求的URI是"+Uri);
// 獲取協議版本String version = req.getProtocol();System.out.println("請求的協議版本是"+version);
// 獲取參數String username = req.getParameter("username");System.out.println("Username is "+username);}
}
index.jsp代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>測試發送消息</title></head><body><form action="/com_alphamilk_war_exploded/requestHang" method="get"><input name="username"><input type="submit" value="提交"></form></body>
</html>
通過url訪問結果如下:
?可以看到請求出現了亂碼,下一步就是解決請求亂碼問題.
2.解決亂碼問題
1.控制臺輸出亂碼
如果tomcat的版本是在10以下的,用中文可能會出現亂碼問題,這里用的是9版本,解決方法:
打開tomcat文件夾找到conf配置文件
配置文件在conf下面,將配置中的字符集改成GBK,修改后的配置如下圖:
修改后重新啟動結果如下:
?2.post請求方式中參數中文亂碼
通過將表單提交方式改為post,再在內容輸入中文,通過request方法的getParameter獲取參數username
可以看到輸出的結果是一串亂碼。所以需要進行修補
解決方法:設置流的編碼即可
// 設置流的編碼req.setCharacterEncoding("utf-8");
重啟服務器并再次運行:
?3.獲取請求頭部分
示例:請求頭(Request Header):Accept-Language: en-US,en;q=0.9
請求頭名稱 | 獲取請求頭值的方法 | 示例代碼 | 返回值 |
---|---|---|---|
Accept-Language | getHeader("Accept-Language") | String acceptLanguage = request.getHeader("Accept-Language"); | "en-US,en;q=0.9" |
所有請求頭名稱 | getHeaderNames() | Enumeration<String> headerNames = request.getHeaderNames(); | 包含所有請求頭名稱的枚舉 |
案例代碼:獲取所有請求頭信息與對應的值
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/rsHead")
public class RequestHead extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通過迭代器Enumration遍歷請求頭Enumeration<String> enumeration = req.getHeaderNames();
// 開始遍歷while (enumeration.hasMoreElements()){String name = enumeration.nextElement();
// 找到獲取頭名稱的值String value = req.getHeader(name);System.out.println(name+" == " +value);}}
}
案例代碼2:設置外部跳轉無法訪問,只能通過項目內的頁面訪問資源
通過請求頭referer獲取訪問到當前頁面的來源(如果是直接輸入地址則referer為空)
首先桌面隨便創建一個html文件,然后通過文件的超鏈接實行跳轉到剛才頁面
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>冒牌登陸系統</title></head><body><a href="http://localhost:9998/com_alphamilk_war_exploded/rsHead">訪問嘗試</a></body>
</html>
既然能獲取到外部訪問源地址,那么現在通過限制請求頭的訪問,外部地址的訪問就會輸出非法訪問。
服務器Servlet類代碼:
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/refererTest")
public class rsRefer extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設置RefererString referer = req.getHeader("referer");
// 防盜鏈機制if (referer != null){if (referer.contains("/com_alphamilk_war_exploded")){System.out.println("正常訪問");}else {System.out.println("非法訪問,請從官網處進行訪問");}}}
}
重啟服務器后,此時再通過隨便創建的html文件修改路徑后訪問得到:
4.獲取請求體
只有post請求方式才有請求體
步驟:
1.獲取流對象 BufferReader
2.從流對象中獲取值 nextline();
常用方法:
方法名 | 作用 |
---|---|
getReader() | 獲取請求的輸入流,并返回一個BufferedReader 對象,用于讀取來自客戶端的請求數據。 |
getInputStream() | 獲取請求的輸入流,并返回一個ServletInputStream 對象,用于直接從客戶端請求中讀取字節數據。 |
案例代碼:
html代碼:
<html><head><title>測試發送消息</title></head><body><form action="http://localhost:9998/com_alphamilk_war_exploded/body" method="post"><input type="text" name="username" placeholder="用戶名"><br><input type="text" name="password" placeholder="密碼"><br><input type="submit"></form></body>
</html>
Servlet類代碼:
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;@WebServlet("/body")
public class RequestBody extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BufferedReader reader = req.getReader();String line;while (reader.readLine()!=null){line = reader.readLine();System.out.println(line);}}
}
?通過輸入用戶名與密碼再提交表單
?
?5.其他功能
1.獲取參數通用方式(不管post請求還是get請求都可以用、重點): ????
方法名 | 作用 |
---|---|
getParameter(String name) | 獲取指定名稱的請求參數的值。如果有多個同名參數,只返回第一個參數的值。 |
getParameterValues(String name) | 獲取指定名稱的請求參數的所有值。如果參數存在多個值,返回一個包含所有值的字符串數組。 |
Enumeration<String> getParameterNames() | 返回一個枚舉對象,包含所有請求參數的名稱。可以使用該枚舉對象遍歷所有請求參數的名稱。 |
getParameterMap() | 返回一個Map 對象,其中包含所有的請求參數和它們的值。鍵是參數名稱,值是參數的值(以字符串數組形式)。 |
案例代碼:
?服務器代碼
package com.company;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/Demo3")
public class ReqOther extends HttpServlet{HttpServletRequest req;HttpServletResponse resp;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Enumeration<String> enumeration = req.getParameterNames();String names;
// 通過迭代器遍歷輸出所有的參數名與對應的值while (enumeration.hasMoreElements()){names = enumeration.nextElement();System.out.println(names+":"+req.getParameter(names));}}
// 由于是通用方法,所以如果有post請求則更改為Get請求流程@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 注意post方法會出現中文亂碼問題,需要轉為utf-8格式編碼req.setCharacterEncoding("utf-8");this.req = req;this.resp = resp;this.doGet(req, resp);}
}
web代碼更改路徑地址后輸入,并提交
?
?當一個表單中出現多個相同的名字時候就需要用getParameterValues或者getParameterMap存放。
2.請求轉發(服務器內部資源的跳轉方式)
方法名 | 作用 |
---|---|
getRequestDispatcher(String path) | 獲取與給定相對路徑(path )相關聯的 RequestDispatcher 對象,用于在同一個 Web 應用程序內部的不同資源之間進行請求轉發。 |
forward(ServletRequest request, ServletResponse response) | 將請求和響應對象轉發給另一個資源(如 Servlet、JSP 頁面),停止當前資源的執行,并將控制權交給目標資源,由目標資源負責生成響應。 |
案例代碼:
創建一個資源類,一個訪問類,通過訪問類訪問資源類
訪問類:
package com.company;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;//資源跳轉
@WebServlet("/Demo4")
public class rsPatcher extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {System.out.println("3s后進行跳轉");
// 3秒后進行跳轉TimeUnit.SECONDS.sleep(3);}catch (Exception e){e.printStackTrace();}// 定義要跳轉的資源類路徑RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Demo5");
// 進行跳轉requestDispatcher.forward(req,resp);}
}
資源類:
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo5")
public class pro extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("我是資源類,我被訪問了");}
}
輸出:
?注意:跳轉只能跳轉到當前項目中的資源,如果把資源改為外部路徑,比如www.baidu.com這樣就無法進行跳轉。并且轉發知識一次的請求
3.共享數據
由于一個類中的數據往往只能該類使用,但是有些資源需要進行多個對象能共享使用,所以引入了共享數據
方法名 | 作用 |
---|---|
setAttribute(String name, Object value) | 將一個數據對象(value)與給定的名稱(name)關聯起來,將其存儲在 ServletContext、HttpSession 或 HttpServletRequest 中,以便多個對象之間共享使用。 |
getAttribute(String name) | 根據給定的名稱(name),從 ServletContext、HttpSession 或 HttpServletRequest 中獲取與之關聯的數據對象。 |
removeAttribute(String name) | 根據給定的名稱(name),從 ServletContext、HttpSession 或 HttpServletRequest 中刪除關聯的數據對象。 |
案例代碼:
設置一個運輸物資類,一個資源類
運輸物資類:
package com.company;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo6")
public class Demo6 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設置共享資源,格式為 鍵值->對象req.setAttribute("msg","物資");System.out.println("當前為跳轉類進行運輸:"+req.getAttribute("msg"));RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Demo7");
// 進行跳轉requestDispatcher.forward(req,resp);}
}
資源類
package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo7")
public class Demo7 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("資源類獲取到"+req.getAttribute("msg"));}
}
下一篇JavaWeb-Servlet服務連接器(三)_Alphamilk的博客-CSDN博客