- 定義:(Hyper Test Transfer Protocol) 超文本傳輸協定
- 傳輸協定:定義了用戶端和伺服器端通信時發送資料的格式。
- 曆史版本:
- 版本1.0:每次請求響應都會建立新的連接配接。
- 版本1.1:複用連接配接。
- 特點:
- 基于TCP/IP的進階協定;
- 預設端口号:80;
- 基于請求/響應模型,即一次請求對應一次響應;
- 無狀态的:每次請求之間互相獨立,不能互動資料。
- HTTP請求消息資料格式:
- 請求行:請求方式 url 協定/版本,例:GET /login.html HTTP/1.1
- 請求方式:
- GET:
- 請求參數在請求行中,在url後面。
- 請求的url長度有限
- 不太安全
- POST:
- 請求參數在請求體中
- 請求的url長度沒有限制
- 相對安全
- GET:
- 請求方式:
- 請求頭:請求頭名稱:請求頭值(鍵值對格式)
- Host:請求的主機
- User-Agent:浏覽器的版本資訊,伺服器端擷取該資訊後可以解決浏覽器相容問題。
- Referer:告訴伺服器目前請求從哪裡來,作用1,防止盜取連結。作用2,統計工作。
- 請求空行:空行,用來分隔請求頭與請求體
- 請求體(正文):封裝POST請求消息的請求參數(POST請求有,GET請求沒有)
Request:用戶端發送給伺服器的消息
- request對象和response對象原理
- request和response對象是由伺服器建立。
- request對象是來擷取請求消息,response對象是來設定響應消息。
- request對象繼承體系結構:
- ServletRequest---接口
- HttpServletRequest---接口(繼承ServletRequest接口)
- org.apache.catalina.connector.TequestFacde---實作類
- request功能:擷取請求消息
- 擷取請求消息資料
- 擷取請求行資料(例:GET /king/test?nema=zhangsan HTTP/1.1)
- 擷取請求方法:String getMethod(),GET
- 擷取虛拟目錄:String getContextPath(),/king
- 擷取Servlet路徑:String getServletPath(),/test
- 擷取get方法請求參數:String getQueryString(),nema=zhangsan
- 擷取請求URI(統一資源辨別符):String getRequestURI(),/king/test
- 擷取請求URL(統一資源定位符):String getRequestURL(),http://localhost/king/test
- 擷取協定及版本:String getProtocol(),HTTP/1.1
- 擷取客戶機的IP位址:String getRemoteAddr()
- 擷取請求頭資料
- String getHeader(String name):根據請求頭的名稱擷取請求頭的值。
- Enumeration<String> getHeaderNames():擷取所有請求頭名稱。
- 擷取請求體資料(POST方法才有)
- 擷取流對象
- BufferReader getReader():擷取字元輸入流,隻能操作字元資料。
- ServletInputStream getInputStream():擷取位元組輸入流,可以操作所有類型資料。
- 從流對象中取資料
- 擷取流對象
- 擷取請求行資料(例:GET /king/test?nema=zhangsan HTTP/1.1)
- 其他功能:
- 擷取請求參數通用方式
- String getParameter(String name):根據參數名稱擷取參數值
- Sting[] getParameterValues(String name):根據參數名稱擷取參數值的數組(多用于複選框情況)
- Enumeration<String> getParameterNames():擷取所有請求的參數名稱
- Map<String,String[]> getParameterMap():擷取所有參數的map集合
- 注意中文亂碼問題:
- get方式:tomcat8已将get方式亂碼問題解決
- post方式:需要在擷取參數前,設定request編碼方式request.setCharacterEncoding("utf-8");
- 請求轉發:一種在伺服器内部資源跳轉的方式。
- 轉發步驟:
- 通過request對象擷取請求轉發器對象RequestDispatcher getRequestDispatcher(string path)
- 使用RequestDispatcher對象進行轉發forward(ServletRequest request, ServletResponse response)
- 特點:
- 浏覽器位址欄路徑不發生變化。
- 隻能轉發到目前伺服器内部資源中。
- 轉發是一次請求。
- 轉發步驟:
- 共享資料
- 域對象:一個有作用範圍的對象,可以在範圍内共享資料。
- request域代表一次請求的範圍,一般用于請求轉發的多個資源中共享資料。
- 方法:
- void setAttribute(String name, Object obj) 存儲資料
- Object getAttribute(String name) 通過鍵擷取值
- void removeAttribute(String name) 通過鍵删除鍵值對
- 擷取ServletContext
- 擷取請求參數通用方式
- 擷取請求消息資料
Response:伺服器端發送給用戶端的消息
資料格式:
1.響應行:HTTP/1.1 200 OK
1.組成:協定/版本 響應狀态碼 狀态碼描述
2.響應的狀态碼:伺服器告訴用戶端浏覽器這次請求響應的一個狀态。
1.狀态碼都是三位數字;
2.分類:
1.1XX:伺服器接收用戶端的消息,但是還沒有接收完成,等待一段時候後,伺服器向浏覽器發送一個1XX的狀态碼。
2.2XX:成功
3.3XX:重定向,
典型代表:
302:重定向
304:通路緩存
4.4XX:用戶端錯誤。
典型代表:
404:表示請求路徑沒有對應的資源
405:表示請求方式沒有對應的方法
5.5XX:伺服器端錯誤。
典型代表:
500:伺服器内部出現異常;502 Bad Gateway是指錯誤網關,無效網關
2.響應頭
格式:鍵值對(名稱:值)
常見的響應頭:
1.Content-Type:伺服器告訴用戶端本次響應體資料格式以及編碼格式。
2.Content-disposition:伺服器告訴用戶端以什麼格式打開響應體資料。
in-line:預設值,在目前頁面内打開。
attachment:以附件形式打開,如檔案下載下傳。
3.響應空行
4.響應體:傳輸的資料。
Response對象:
功能:設定響應消息。
1.設定響應行;
1.格式:HTTP/1.1 200 OK
2.設定狀态碼;setStatus(int sc)
2.設定響應頭:setHeader(String name, String value)
3.設定響應體:
使用步驟:
1.擷取輸出流;
*字元輸出流:PrintWriter getWriter()
*位元組輸出流:ServletOutPutStream getOutPutStream()
2.使用輸出流,将資料輸出到用戶端浏覽器中。
案例:
1.重定向:資源跳轉的方式
實作:response.sendRedirect("目标url")
重定向的特點:redirect
1.位址欄路徑發生改變
2.重定向可以通路其他伺服器的資源
3.重定向是兩次請求。不能使用request對象來共享資料了
轉發的特點:forward
1.轉發位址欄路徑不變
2.轉發隻能通路目前伺服器下的資源
3.轉發是一次請求
注:面試中常問到redirect和forward的差別
路徑的寫法:
路徑分類:
1.相對路徑:通過相對路徑不可以确定唯一資源
* 如:./index.xml
* 不以/開頭的,以.開頭的路徑
* 規則:判斷目前資源和目标資源的相對位置關系。
./:代表目前路徑
../:代表後退一級目錄
2.絕對路徑:通過絕對路徑可以确定唯一資源。
* 如:http://localhost/servlet/demo1 /servlet/demo1
* 以/開頭的為絕對路徑
* 規則:判斷定義的路徑是給誰用的?判斷請求将來從哪發出
1.給用戶端浏覽器使用:需要加虛拟目錄(項目的通路路徑)
重定向
建議虛拟目錄動态擷取,動态擷取虛拟目錄: String contextPath = request.getContextPath();
2.給伺服器使用:不需要加虛拟目錄
轉發
2.伺服器輸出字元資料到浏覽器
步驟:
1.擷取字元輸出流:
PrintWriter pw = response.getWriter();
2.輸出資料
pw.write("hello");
注:可能存在中文亂碼問題,如果出現亂碼,那麼一定是編解碼使用的字元集不一緻導緻
解決方法:在擷取流對象之前設定流編碼,預設為ISO-8899-1
-1.設定流編碼
response.setCharacterEncoding("GBK");//想要的編碼格式,這裡僅作舉例。
0.告訴浏覽器使用特定的編碼格式
response.setHeader("content-type","text/html;charset=utf-8");
-1和0可以簡寫為:response.setContentType("text/html;charset=utf-8");
3.伺服器輸出位元組資料到浏覽器
步驟:
1.擷取位元組輸出流
ServletOutPutStream sos = response.getOutPutStream();
2.輸出資料
sos.write("hello".getBytes());
注:同樣會出現中文亂碼問題,解決方法同上。
4.驗證碼
1.本質:圖檔
2.目的:防止惡意表單注冊