HTTP 協議 Request 請求

 

目錄

一、Request 對象請求原理

二、Request 對象繼承體系結構

三、Request 功能

1、獲取請求消息數據

【1】獲取請求行數據

【2】獲取請求頭數據

【3】獲取請求體數據

2、其他常用獲取功能

【1】獲取請求參數通用方法(get和post都能用)

【2】請求轉發

【3】共享數據

【4】獲取 ServletContext 對象


一、Request 對象請求原理

request 和 response 對象是由服務器創建的,由開發人員來使用;request 對象是來獲取消息請求,response 對象是來設置響應消息的

  1. Tomcat 服務器會根據請求 URL 中的資源路徑,創建對應的 oneStar 對象
  2. Tomcat 服務器會創建 request 和 response 對象,request 對象中封裝請求消息數據;response 對象中封裝響應消息數據
  3. Tomcat 將 request 和 response 兩個對象傳遞給 service 方法,並調用 service 方法
  4. 開發人員可以通過 request 對象獲取請求消息數據,通過 response 對象設置響應消息數據
  5. 服務器在給瀏覽器做出響應之前,會從 response 對象中拿開發人員設置的響應消息數據

二、Request 對象繼承體系結構

  • ServletRequest:是一個接口
  • HttpServletRequest:是一個接口
  • org.apache.catalina.connector.RequestFacade:是 Tomcat 的一個類

RequestFacade 類實現了 HttpServletRequest 接口,HttpServletRequest 接口繼承了 ServletRequest 接口

三、Request 功能

1、獲取請求消息數據

【1】獲取請求行數據

GET /oneStar?name=qq HTTP/1.1

常用方法:

  • Sring getMethod():獲取請求方法:GET
  • String getContextPath():獲取虛擬目錄:/
  • String getServletPath():獲取 servlet 路徑:/oneStar
  • Sring getQuervletPath():獲取 get 方式請求參數:name=qq
  • String getRequestURI():獲取請求URI:/oneStar
  • StringBuffer getRequestURL():獲取請求URL:http://localhost/onestar/
  • String getProtocol():獲取協議版本:HTTP/1.1
  • String getRemoteAddr():獲取客戶機的IP地址

URL:統一資源定位符

URI:統一資源標識符(範圍更大)

//請求行數據
public static void requestHang(HttpServletRequest req){
    //1.獲取請求方法:GET
    String method = req.getMethod();
    System.out.println(method);

    //2.獲取虛擬目錄
    String Cpath = req.getContextPath();
    System.out.println(Cpath);

    //3.獲取 Servlet 路徑
    String Spath = req.getServletPath();
    System.out.println(Spath);

    //4.獲取get方式請求參數
    String Qpath = req.getQueryString();
    System.out.println(Qpath);

    //5.獲取請求URI
    String URI = req.getRequestURI();
    System.out.println(URI);

    //6.獲取請求URL
    StringBuffer URL = req.getRequestURL();
    System.out.println(URL);

    //7.獲取協議版本
    String pro = req.getProtocol();
    System.out.println(pro);

    //8.獲取客戶機IP地址
    String add = req.getRemoteAddr();
    System.out.println(add);
}

【2】獲取請求頭數據

常用方法:

  • String getHeader(String nem):通過請求頭的名稱獲取請求頭的值
  • Enumeration<String> getHeaderNames():獲取所有的請求頭名稱
//請求頭數據
public static void requestHead(HttpServletRequest req){
    //獲取所有請求頭名稱
    Enumeration<String> headernames = req.getHeaderNames();
    //遍歷
    while (headernames.hasMoreElements()){
        String name = headernames.nextElement();
        //根據名稱來獲取請求頭的值
        String value = req.getHeader(name);
        System.out.println(name + "--" + value);
    }
}

【3】獲取請求體數據

請求體只有POST請求方式纔有的,在請求體中封裝了POST請求參數

步驟:

  1. 獲取流對象
    • BuferedReader getReader():獲取字符輸入流
    • ServletInputStream getInputStream():獲取字節輸入流
  2. 從流對象中獲取數據
    • readLine():逐行獲取
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //請求消息體數據
    //1.獲取流對象
    BufferedReader br = request.getReader();
    //2.讀取數據
    String line = null;
    while ((line = br.readLine()) != null){
        System.out.println(line);
    }
}

2、其他常用獲取功能

【1】獲取請求參數通用方法(get和post都能用)

  • String getParameter(String name):根據參數名稱獲取參數值
  • String[ ]  getParameterValues(String name):根據參數名稱獲取參數值的數組(多用於複選框)
  • Enumeration<String> getParameterNames():獲取所有請求的參數名稱
  • Map<String,String[]> getParameterMap():獲取所有參數的map集合
public class regServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //request.setCharacterEncoding("UTF-8");
        //post獲取請求參數

        //1.根據參數名稱獲取參數值
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("post:" +name + password);

        //2.根據參數名稱獲取參數值的數組
        String[] hobbys = request.getParameterValues("hobby");
        for(String hobby : hobbys){
            System.out.println(hobby);
        }

        //3.獲取所有請求的參數名稱
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String name1 = parameterNames.nextElement();
            String value = request.getParameter(name1);
            System.out.println(name1 + "--" + value);
            System.out.println("*********");
        }

        //4.獲取所有參數的map集合
        Map<String,String[]> parameterMap = request.getParameterMap();
        Set<String> keySets = parameterMap.keySet();
        for(String key : keySets){
            String[] values = parameterMap.get(key);
            for(String value : values){
                System.out.println(value);
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //get獲取請求參數
        this.doPost(request,response);
    }
}

【2】請求轉發

請求轉發即一種在服務器內部的資源跳轉方式

  • 步驟
    1. 通過request對象獲取請求轉發器對象:RequestDispatcher  getRequestDispatcher(String path)
    2. 使用 RequestDispatcher 對象來進行轉發:forward(ServletRequest request,ServletResponse response)
  • 特點
    1. 瀏覽器地址欄路徑不發生變化
    2. 只能轉發到當前服務器內部資源中
    3. 轉發是一次請求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("訪問regSrevlet");
    request.getRequestDispatcher("/oneStar").forward(request,response);
}

【3】共享數據

域對象:首先要了解一下域對象,域對象即一個有作用範圍的對象,可以在範圍內共享數據

request 域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據,而請求轉發就是一次請求,因此可以通過request 域來實現共享數據

常用方法:

  • void setAttribute(String name,Object obj):存儲數據
  • Object getAttitude(String name):通過鍵獲取值
  • void removeAttribute(String name):通過鍵移除鍵值對
//存儲數據到request域中
request.setAttribute("sag","Hello");
request.getRequestDispatcher("/oneStar").forward(request,response);

//從域中獲取數據
Object mesage = req.getAttribute("sag");
System.out.println(mesage);

【4】獲取 ServletContext 對象

  • ServletContext getServletContext();
ServletContext context = request.getServletContext();
System.out.println(context);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章