個人博客網: https://wushaopei.github.io/ (你想要這裏多有)
1、Http協議
1.1 什麼是HTTP協議
什麼是協議?
雙方相互約定好,都需要遵守的規則。叫協議。
http協議:客戶端和服務器之間通知走的是http協議。
那麼這個協議指的是客戶端發送數據給服務器和服務器回傳數據給客戶端,這個數據需要遵守的數據格式。
http報文 ,所謂報文就是發送的數據。
1.2 請求的HTTP協議格式
- GET請求
(1)請求行
1.1請求的方式GET
1.2請求的資源地址?參數
1.3請求的協議和版本號 HTTP/1.1
(2)請求頭
- POST請求
(1)請求行
1.1請求的方式POST
1.2請求的資源地址
1.3請求的協議和版本號 HTTP/1.1
(2)請求頭
空行
(3)請求體
在谷歌瀏覽器下如何查看HTTP協議
火狐瀏覽器如何查看HTTP協議內容:
GET請求HTTP協議分爲兩部分:
請求行
1 請求的方式GET
2 請求的資源?參數
3 請求的協議和版本號 HTTP/1.1
請求頭
POST請求的HTTP協議分爲三部分:
請求行
1 請求的方式POST
2 請求的資源
3 請求的協議和版本號 HTTP/1.1
請求頭
空行
請求體
常用請求頭的說明
Accept: 告訴服務器客戶端可以接收的數據類型
Accept-Language: 告訴服務器客戶端希望接收的語言
Host: 告訴服務器。客戶端請求的服務器IP和端口號
User-Agent: 告訴服務器瀏覽器的信息
哪些是GET請求,哪些是POST請求
GET請求有哪些
1.在瀏覽器地址欄中輸入地址,敲回車。是GET請求
2.a標籤,都是get請求
3.form標籤 method=get也是get請求
4.link標籤用來引入css樣式,是get請求
5.script標籤用來引入js文件,也是get請求
6.img標籤引入圖片是get請求
7.iframe標籤用來引入單獨的html,也是Get請求
POST請求
form標籤 method=post是POST請求
響應的HTTP協議格式
響應行
響應的協議和版本號 HTTP/1.1
響應狀態碼
響應狀態描述符
響應頭
空行
響應體
常用的響應碼說明
200 請求響應成功
404 請求的資源不存在
302 請求重定向
500 請求已經被服務器接收到,但是服務器內部錯誤
MIME類型說明
MIME是HTTP協議中數據類型。
MIME的英文全稱是"Multipurpose Internet Mail Extensions" 多功能Internet 郵件擴充服務。MIME類型的格式是“大類型/小類型”,並與某一種文件的擴展名相對應。
text/html .html .htm
text是大類型
html是小類型
MIME 就是數據類型字符串描述符
常見的MIME類型:
我們的Tomcat支持哪些類型,可以到web.xml中去查看
谷歌瀏覽器查看HTTP響應
火狐瀏覽器查看HTTP響應
2、HttpServletRequest類
2.1 HttpServletRequest類有什麼作用。
它表示請求的信息,每次請求進來。Tomcat服務器就會創建一個HttpServletRequest對象。然後把請求的數據封裝到request對象中
我們可以從request對象中獲取到所有請求有關的信息。
2.2 HttpServletRequest類的常用方法
常用API
public class RequestAPI extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// i.getRequestURI() 獲取請求資源地址
System.out.println("請求的資源地址:" + request.getRequestURI());
// ii.getRequestURL() 獲取請求的統一資源定位符(絕對路徑)
System.out.println( "請求的統一資源定位符:" + request.getRequestURL() );
// iii.getRemoteHost() 獲取客戶端的IP
System.out.println( "客戶端的IP:" + request.getRemoteHost() );
// iv.getHeader() 獲取請求頭信息
System.out.println( "請求頭:" + request.getHeader("Accept-Language") );
System.out.println( "請求頭:" + request.getHeader("User-Agent") );
// vii.getMethod() 獲取請求的方式 GET或POST
System.out.println( "請求的方式:" + request.getMethod() );
}
}
2.3 如何獲取請求參數
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// getParameter獲取請求的參數,這個方法的參數是請求的參數名
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobbies = request.getParameterValues("hobby");
System.out.println("用戶名:" + username);
System.out.println("密碼:" + password);
if (hobbies != null) {
Arrays.asList(hobbies).forEach(System.out::println);
}
}
2.4 GET請求的中文亂碼解決
GET請求中文亂碼解決方案一:
// 先使用iso-8859-1進行編碼
byte[] buffer = username.getBytes("iso-8859-1");
// 再使用UTF-8字符集進行解碼
username = new String(buffer, "UTF-8");
GET請求中文亂碼解決方案二:
找到Tomcat的server.xml配置文件。找到Connector標籤,添加URIEncoding屬性
2.5 POST請求的中文亂碼解決
POST請求解決中亂碼方案一:
// 先使用iso-8859-1進行編碼
byte[] buffer = username.getBytes("iso-8859-1");
// 再使用UTF-8字符集進行解碼
username = new String(buffer, "UTF-8");
POST請求解決中文亂碼方案二:
// 解決post中文亂碼(通過設置請求體的字符集)
// 必須在getParameter方法之前調用纔有效
request.setCharacterEncoding("UTF-8");
中文亂碼解決,需要注意的點:
1、request.setCharacterEncoding("UTF-8");
不能解決GET請求的中文亂碼
2、Tomcat8之後,GET請求默認是沒有中文亂碼的
2.6 請求的轉發(需要結合jsp一起)
2.7 Base標籤的作用
2.8 Web中的相對路徑和絕對路徑
2.9 web中/斜槓的不同意義
3、 HttpServletResponse類
3.1 概述
a) HttpServletResponse類的作用
所響應的信息,都可以通過httpServletResponse類進行設置。
b ) 兩個輸出流的說明。
字節流 response.getOutputStream(); 主要實現下載
字符流 response.getWriter() 主要輸出字符串
一個response對象,只能在一個時間內使用字節流,或字符流,兩個流不能同時使用。
c ) 如何往客戶端回傳數據
往客戶端輸出字符串
public class ResponseIO extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.write("this is the response's content!");
}
}
3.2 響應的亂碼解決
解決響應中文亂碼的第一種方案:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// System.out.println( response.getCharacterEncoding() );
// 設置服務器響應字符集爲UTF-8
response.setCharacterEncoding("UTF-8");
// 通過設置響應頭,告訴客戶端使用UTF-8查看
response.setHeader("Content-Type", "text/html; charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("這是響應返回的內容!");
}
解決響應中文亂碼的第二種方案:
// 解決響應中文亂碼。
// 必須要獲取流之前調用
//設置服務器使用UTF-8.並設置響應頭"Content-Type:text/html; charset=UTF-8"
response.setContentType("text/html;charset=UTF-8");
3.3 如何設置響應頭和響應狀態碼
請求重定向第一種實現方案:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("曾到此一遊Response1");
request.setAttribute("abc", "abcValue");
// 需要設置響應狀態碼和響應頭
response.setStatus(302); // 設置響應狀態碼爲302
// 設置響應頭
// response.setHeader("Location", "http://localhost:8080/day07/response2");
response.setHeader("Location", "http://www.baidu.com");
}
a) 請求重定向
// 請求重定向(推薦使用)
response.sendRedirect("http://localhost:8080/day07/response2");
4、請求轉發和重定向
如果兩種都可以實現。優先使用轉發。
如果轉發問題,再考慮使用重定向。