Requset對象

Request和Response原理

  1. TomCat根據請求url當中的資源路徑創建對應的servlet類
  2. TomCat會創建request對象和response對象,request對象當中封裝請求消息數據
  3. TomCat將Request和Response兩個對象傳遞給service方法,並且調用service方法
  4. 我們可以來操作request和response兩個對象,request獲取請求消息數據,response獲取響應消息數據
  5. 服務器再給瀏覽器做出響應之前,會從response對象中獲取程序員設置的響應消息數據

Request的體系結構

ServletRequest:接口
	||繼承
	\/
HttpServletRequest:接口
	||實現
	\/
RequestFacade:實現類

Request功能

獲取請求消息數據

獲取請求行數據

  • 方法
 GET /day/demo?name=zhangsan HTTP/1.1
 // 獲取請求方式
 String getMethod();
 // *獲取虛擬目錄:/day
 String getContextPath();
 // 獲取servlet路徑:/demo
 String getServletPath();
 // 獲取請求參數
 String getQueryString();
 // *獲取請求的URI
 String getRequestURI();/day/demo
 StringBuffer getRequestURL();http://localhost/day/demo
 // 獲取協議和版本
 String getProtocol();
 // 獲取客戶機的ip地址
 String getRemoteAddr();
  • 實例
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(urlPatterns = "*.demo")
public class RequestDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 獲取請求方式
        System.out.println(request.getMethod());
        // *獲取虛擬目錄
        System.out.println(request.getContextPath());
        // 獲取servlet路徑
        System.out.println(request.getServletPath());
        // 獲取get方式的請求參數
        System.out.println(request.getQueryString());
        // *獲取URI
        /**
         * URL:統一資源定位符,http://localhost/servlet/cjd.demo
         * URI:統一資源標識符,/servlet/cjd.demo
         */
        System.out.println(request.getRequestURI());
        System.out.println(request.getRequestURL());
        // 獲取版本協議
        System.out.println(request.getProtocol());
        // 獲取客戶機ip地址
        System.out.println(request.getRemoteAddr());
    }
}
GET
/servlet
/cjd.demo
username=627715324%40qq.com
/servlet/cjd.demo
http://localhost/servlet/cjd.demo
HTTP/1.1
0:0:0:0:0:0:0:1

獲取請求頭數據

  • 方法
// 通過頭名稱獲取頭的值
String getHeader(String var1);
// 獲取所有的請求頭名稱
Enumeration<String> getHeaderNames(String var1);
  • 代碼實例
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.Enumeration;

@WebServlet(urlPatterns = "*.demo")
public class RequestDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Enumeration<String> stringEnumeration = request.getHeaderNames();

        while(stringEnumeration.hasMoreElements()) {
            String header = stringEnumeration.nextElement();
            System.out.println(header + " : " + request.getHeader(header));
        }
    }
}
host : localhost
connection : keep-alive
upgrade-insecure-requests : 1
user-agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4023.0 Safari/537.36 Edg/81.0.396.0
accept : text/html,application/xhtml+xml,application/xml;q=0.9,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/servlet/login.html
accept-encoding : gzip, deflate, br
accept-language : en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7

獲取請求體數據

  • 方法
/**
 * 1.獲取流對象
 * 2.從流對象當中獲取數據
 */
 ServletInputStream getInputStream() throws IOException;
 BufferedReader getReader() throws IOException;
  • regist頁面HTML代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊頁面</title>
</head>
<body>
<form action="/servlet/do.demo" method="POST">
    <input type="text" placeholder="請輸入用戶名" name="username"><br>
    <input type="text" placeholder="請輸入密碼" name="password"><br>
    <input type="submit" value="註冊">
</form>
</body>
</html>
  • demo類代碼
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.BufferedReader;
import java.io.IOException;
import java.nio.Buffer;

@WebServlet(urlPatterns = {"*.demo"})
public class ServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader bufferedReader = req.getReader();
        String line = null;
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    }
}
username=chinese&password=china

其他功能

獲取請求參數通用方式:GET和POST都可以

  • 代碼實例
// 根據參數名稱獲取參數值
String getParameter(String var1);
String[] getParameterValues(String var1);
// 獲取所有請求的參數名稱
Enumeration<String> getParameterNames();
// 獲取所有參數的map集合
Map<String, String[]> getParameterMap();

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Enumeration<String> parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()) {
            String element = parameterNames.nextElement();
            System.out.println(element + " : " + req.getParameter(element));
        }
    }

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Map<String, String[]> map = req.getParameterMap();
        for(Map.Entry<String, String[]> entry : map.entrySet()) {
            String key = entry.getKey();
            String[] values = entry.getValue();
            System.out.println(key + " : ");
            for(String s : values) {
                System.out.println(s);
            }
        }
    }
  • 中文亂碼問題
/**
 * 1.GET方式無亂碼,tomcat8已經解決
 * 2.POST方式的解決方式就是在獲取參數之前重新編碼
 */
 request.setCharacterEncoding("utf-8");

請求轉發

  • 定義:一種在服務器內部的資源跳轉方式
  • 步驟
/**
 * 1.通過Request對象獲取請求轉發器對象
 * 2.通過請求轉發器對象進行轉發
 */
 RequestDispatcher getRequestDispatcher(String var1);
 req.getRequestDispatcher("/servlet/cjd.demo2").forward(req, resp);

  • 特點
    1.瀏覽器的地址欄不發生變化
    2.只能訪問當前服務器內部資源當中,不能訪問服務器外部的其他資源
    3.轉發是一次請求,也就是多個資源使用的是同一個請求

共享數據

  • 域對象:一個有作用範圍的對象,可以在範圍之內共享數據
  • request的域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據
  • 方法
// 存儲數據(鍵值對)
void setAttribute(String var1, Object var2);
// 獲取共享數據(根據鍵值獲取Object對象)
Object getAttribute(String var1);
// 刪除鍵值對
void removeAttribute(String var1);

獲取ServletContext

  • ServletContext getServletContext();

Request獲取請求消息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章