JavaWeb學習第三天:
http協定:
網絡之間傳輸資訊,通訊需要遵守協定。
例如你要傳輸一個123資料,它會一層一層給你把資料封裝,然後在解封裝,最後你看看的就是123.
HTTP 協定一般指 HTTP(超文本傳輸協定)。
超文本傳輸協定(英語:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式、協作式和超媒體資訊系統的應用層協定,是網際網路上應用最為廣泛的一種網絡傳輸協定,所有的 WWW 檔案都必須遵守這個标準。
HTTP是一個基于TCP/IP通信協定來傳遞資料(HTML 檔案, 圖檔檔案, 查詢結果等)。
注意:
http在傳輸資料之前先要建立連接配接
http協定是基于TCP協定
http 在傳輸資料之前先要建立連接配接
發送http請求
http協定不同的版本
三個版本
http1.0
連接配接不可以複用(隻用一次)
用戶端發送請求到伺服器
建立連接配接
傳輸資料
關閉連接配接
浏覽器展示資料
http1.1
連接配接可複用
http2.0
HTTP是無狀态:HTTP協定是無狀态協定。無狀态是指協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊,則它必須重傳,這樣可能導緻每次連接配接傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
http請求之間不能共享資料
get請求和post請求的差別
1. get請求請求參數是放在浏覽器位址欄中送出的 post請求的請求參數是放在請求體中
2. get請求相對不安全,post請求相對安全
3. get請求送出的請求資料大小有限制4kb post請求沒有大小限制(檔案上傳)
2.HttpServletrequest
1. 擷取用戶端傳過來的三部分資訊
分别是請求行,請求頭和請求體
代碼如下:
package com.swlz.request;
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("/requestDemo")
public class RequestDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("處理get請求");
//請求行相關方法 請求行資訊擷取
String method = req.getMethod();
System.out.println("請求方式"+method);
String requestURL = req.getRequestURL().toString();
System.out.println("請求路徑URL"+requestURL);//http://localhost:8080/tomcat/requestDemo
String requestURI = req.getRequestURI();
System.out.println("請求路徑URI"+requestURI);///tomcat/requestDemo
String protocol = req.getProtocol();
System.out.println("請求協定"+protocol);
//請求頭資訊擷取:從浏覽器傳到伺服器中去,一般是浏覽器告訴伺服器本次請求的基本資訊
// GET /tomcat/requestDemo?username=admin&password=12345 HTTP/1.1
// Host: localhost:8080
// Connection: keep-alive
// Upgrade-Insecure-Requests: 1
// User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
// Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
// Sec-Fetch-Site: same-origin
// Sec-Fetch-Mode: navigate
// Sec-Fetch-User: ?1
// Sec-Fetch-Dest: document
// Referer: http://localhost:8080/tomcat/
// Accept-Encoding: gzip, deflate, br
// Accept-Language: zh-CN,zh;q=0.9
// Cookie: Hm_lvt_1cd9bcbaae133f03a6eb19da6579aaba=1632280557; username=admin; rememberMe=true; password=cRM1L2ln+WnKDx+fqJmgc+ZdVQKlLP/IzLXKMBx5bdBuMofh/Z4t0r50cE0js72EE2zmJUkl7NhNQTrfd2d6Ug==; qx=AC8E9B7B1BC008998D7EF3CE50A0A9C3
// req.getHeader(" ")
String host = req.getHeader("Host");
System.out.println("Host"+host);
//http1.1支援長連接配接
String connection = req.getHeader("Connection");
System.out.println("connection"+connection);
//告訴伺服器本次請求的浏覽器版本資訊
String header = req.getHeader("User-Agent");
System.out.println("User-Agent"+header);
//告訴伺服器本次請求響應的資料格式
String accept = req.getHeader("Accept");
System.out.println("Accept"+accept);
//Referer 告訴伺服器本次請求的來源http://localhost:8080/tomcat/ 防盜鍊
// 防盜鍊:防止其他人随便跳到你的網頁中來
String referer = req.getHeader("Referer");
System.out.println("Referer"+referer);
String header1 = req.getHeader("Accept-Encoding");
System.out.println("Accept-Encoding"+header1);
String header2 = req.getHeader("Accept-Language");
System.out.println("Accept-Language"+header2);
String cookie = req.getHeader("Cookie");
System.out.println("cookie:"+cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("處理post請求");
}
}
擷取請求參數的時候,由于get請求和post請求參數所在的位置不一樣,所有導緻我們get請求和post請求處理代碼也不一緻
2. 擷取請求參數相關的方法
httpServeltRequest對象總又給我們封裝了一些友善的統一擷取請求參數的方法對get和post都适用
package com.swlz.request;
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.Map;
import java.util.Set;
@WebServlet("/servletRequestDemo1")
public class ServletRequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//擷取請求參數username和password
// request.getParameter("username"); 根據參數名稱擷取唯一的參數值
String username = request.getParameter("username");
String password = request.getParameter("password");
//複選框 getParameterValues("hobby"); 根據參數名稱擷取一個或者多個參數值
String[] parameterValues = request.getParameterValues("hobby");
System.out.println(username+":"+password);
System.out.println(parameterValues[0]+":"+parameterValues[1]);
//ParameterMap的鍵對應的是你請求參數的名字,值對象的是你請求參數的值(資料) 一次擷取所有請求參數
//request.getParameterMap();一次擷取所有請求參數 map的key是請求參數的名稱 value請求參數值所對應的數組
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keySet = parameterMap.keySet();
for (String key : keySet) {
//通過鍵得到值
String[] values = parameterMap.get(key);
System.out.println(key+":"+values);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//擷取請求參數username和password
// String username = request.getParameter("username");
// String password = request.getParameter("password");
// System.out.println(username+":"+password);
doPost(request,response);
}
}
1. 請求亂碼問題
Post請求中文亂碼解決
package com.swlz.request;
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("/servletRequestDemo2")
public class ServletRequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//設定伺服器編碼格式 設定request緩沖區的編碼格式 在擷取請求參數之前設定編碼格式
String username = request.getParameter("username");
System.out.println("username:"+username);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
Get請求中文亂碼在tomcat8.5之後自動解決,在tomcat8之前會有亂碼問題
今日學習感受:多去了解,多敲代碼,多去思考,多去自己動手,争取不要看教程,把它成你自己的對象,這樣印象深刻一點,不然學完很容易忘記。最後一句話:千裡之行,始于足下。