天天看點

JavaWeb複習鞏固

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之前會有亂碼問題

今日學習感受:多去了解,多敲代碼,多去思考,多去自己動手,争取不要看教程,把它成你自己的對象,這樣印象深刻一點,不然學完很容易忘記。最後一句話:千裡之行,始于足下。