(8)Servlet技術的使用(下篇)

1,什麼是 HTTP 協議

2,請求的 HTTP 協議格式

3,HttpServletRequest 類

4,HttpServletRequest 類

什麼是 HTTP 協議

  • 協議是指雙方,或多方,相互約定好,大家都需要遵守的規則,叫協議
  • 所謂 HTTP 協議,就是指,客戶端和服務器之間通信時,發送的數據,需要遵守的規則,叫 HTTP 協議
  • HTTP 協議中的數據又叫報文

請求的 HTTP 協議格式

  • 客戶端給服務器發送數據叫請求
  • 服務器給客戶端回傳數據叫響應
  • 請求又分爲 GET 請求,和 POST 請求兩種

1,GET 請求和POST請求的區別

①,get請求參數通過url傳遞,post請求放在Request body中

②,get請求不安全,因爲參數直接暴露在url上,所以不能傳遞敏感信息

③,get請求在url中傳送的參數是有長度限制的,而post請求沒有,對於參數數據類型,get請求只接受ASCII字符,而post請求沒有限制

④,get請求只能進行url編碼,而post請求支持多種編碼方式

⑤,get請求參數會被完整保留在瀏覽器歷史記錄裏,而post請求中的參數不能保留

⑥,get請求在瀏覽器回退是無害的,而post請求會再次提交

⑦,get請求產生的url地址可以被Bookmark,而post請求不可以

⑧,get請求會被瀏覽器主動cache,而post不會,除非手動設置

2,哪些是 GET 請求,哪些是 POST 請求

  • GET 請求有哪些

    ①,form 標籤 method=get
    ②,a 標籤
    ③,link 標籤引入 css
    ④,Script 標籤引入 js 文件
    ⑤,img 標籤引入圖片
    ⑥,iframe 引入 html 頁面
    ⑦,在瀏覽器地址欄中輸入地址後敲回車

  • POST 請求有哪些

    ⑧,form 標籤 method=post

3,常用的響應碼說明

  • 1XX Informational(信息性狀態碼)接收的請求正在處理
  • 2XX Success(成功狀態碼) 請求正常處理完畢
  • 3XX Redirection(重定向狀態碼) 需要進行附加操作以完成請求
  • 4XX Client Error(客戶端錯誤狀態碼)服務器無法處理請求
  • 5XX Server Error(服務器錯誤狀態碼)服務器處理請求出錯
  • 200 表示請求成功
  • 302 表示請求重定向
  • 404 表示請求服務器已經收到了,但是你要的數據不存在(請求地址錯誤)
  • 500 表示服務器已經收到請求,但是服務器內部錯誤(代碼錯誤)

4,谷歌瀏覽器如何查看 HTTP 協議

在這裏插入圖片描述

HttpServletRequest 類

1,HttpServletRequest 類有什麼作用

  • 每次只要有請求進入 Tomcat 服務器,Tomcat 服務器就會把請求過來的 HTTP 協議信息解析好封裝到 Request 對象中。然後傳遞到 service 方法(doGet 和 doPost)中給我們使用。我們可以通過 HttpServletRequest 對象,獲取到所有請求的信息。

2,HttpServletRequest 類的常用方法

方法 解釋
getRequestURI() 獲取請求的資源路徑
getRequestURL() 獲取請求的統一資源定位符(絕對路徑)
getRemoteHost() 獲取客戶端的 ip 地址
getHeader() 獲取請求頭
getParameter() 獲取請求的參數
getParameterValues() 獲取請求的參數(多個值的時候使用)
getMethod() 獲取請求的方式 GET 或 POST
setAttribute(key, value) 設置域數據
getAttribute(key) 獲取域數據
getRequestDispatcher() 獲取請求轉發對象

3,如何獲取請求參數

  • 表單:
<form action="http://localhost:8080/ServletTest/demo" method="get">
    用戶名:<input type="text" name="username"><br/>
    密碼:<input type="password" name="password"><br/>
    興趣愛好:<input type="checkbox" name="hobby" value="cpp">C++
    <input type="checkbox" name="hobby" value="java">Java
    <input type="checkbox" name="hobby" value="js">JavaScript<br/>
    <input type="submit">
</form>
  • Java 代碼:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 獲取請求參數
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String[] hobby = request.getParameterValues("hobby");
    System.out.println(" 用戶名:" + username);
    System.out.println(" 密碼:" + password);
    System.out.println(" 興趣愛好:" + Arrays.asList(hobby));
}

4,doGet 請求的中文亂碼解決

// 獲取請求參數
String username = req.getParameter("username");
//1 先以 iso8859-1 進行編碼
//2 再以 utf-8 進行解碼
username = new String(username.getBytes("iso-8859-1"), "UTF-8");

5,POST 請求的中文亂碼解決

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 設置請求體的字符集爲 UTF-8 ,從而解決 post 請求的中文亂碼問題
    req.setCharacterEncoding("UTF-8");
    System.out.println("-------------doPost------------");
    // 獲取請求參數
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String[] hobby = req.getParameterValues("hobby");
    System.out.println(" 用戶名:" + username);
    System.out.println(" 密碼:" + password);
    System.out.println(" 興趣愛好:" + Arrays.asList(hobby));
}

6,請求的轉發

  • 什麼是請求的轉發?

    請求轉發是指,服務器收到請求後,從一次資源跳轉到另一個資源的操作叫請求轉發。

在這裏插入圖片描述

  • 請求轉發的特點

    ①,瀏覽器地址欄沒有變化

    ②,他們是一次請求

    ③,他們共享Request域中的數據

    ④,可以轉發到WEB-INF目錄下

    ⑤,不可以訪問工程以外的資源

  • Servlet1 代碼:

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 獲取請求的參數(辦事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在 Servlet1 中查看參數(材料):" + username);
        // 給材料 蓋一個章,並傳遞到 Servlet2 去查看
        req.setAttribute("key1", " Servlet1 的章");
        // 問路: Servlet2 怎麼走
        /**
        * 請求轉發必須要以斜槓打頭, / 斜槓表示地址爲: http://ip:port/ 工程名 / , 映射到 IDEA 代碼的 web 目錄
        */
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
        // RequestDispatcher requestDispatcher = req.getRequestDispatcher("https://blog.csdn.net/qq_41530004);
        // 走向 Sevlet2
        requestDispatcher.forward(req, resp);
    }
  • Servlet2 代碼:
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 獲取請求的參數(辦事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在 Servlet2中查看參數(材料):" + username);
        // 查看 Servlet 1 是否有蓋章
        Object key1 = req.getAttribute("key1");
        System.out.println(" Servlet 1  是否有章:" + key1);
        // 處理自己的業務
        System.out.println("Servlet2 務 處理自己的業務 ");
    }
}  
  • xml 代碼:
  <servlet>
    <servlet-name>Servlet2</servlet-name>
    <servlet-class>com.Servlet2</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Servlet2</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

7,base 標籤的作用

  • base標籤可以設置當前頁面中所有相對路徑工作時,參照那個路徑來進行跳轉
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--base 標籤設置頁面相對路徑工作時參照的地址
href 屬性就是參數的地址值
-->
<base href="http://localhost:8080/ServletDemo/a/b/">
</head>
<body>
這是 a 下的 b 下的 c.html 頁面<br/>
<a href="../../index.html">跳回首頁</a><br/>
</body>
</html>

8,Web 中的相對路徑和絕對路徑

在 javaWeb 中,路徑分爲相對路徑和絕對路徑兩種:

  • 相對路徑:

    . :表示當前目錄

    … :表示上一級目錄

    資源名: 表示當前目錄/資源名

  • 絕對路徑:

    http://ip:port/工程路徑/資源路徑

  • 在實際開發中,路徑都使用絕對路徑,而不簡單的使用相對路徑。

    ①、絕對路徑

    ②、base+相對

9,web 中 / 斜槓的不同意義

  • 在 web 中 / 斜槓 是一種絕對路徑。

  • / 斜槓 如果被瀏覽器解析,得到的地址是:http://ip:port/

    <a href="/">斜槓</a>

  • / 斜槓 如果被服務器解析,得到的地址是:http://ip:port/工程路徑

    ①、/servlet1

    ②、servletContext.getRealPath(“/”);

    ③、request.getRequestDispatcher(“/”);

  • 特殊情況: response.sendRediect(“/”); 把斜槓發送給瀏覽器解析。得到 http://ip:port/

HttpServletResponse 類

1,HttpServletResponse 類的作用

  • HttpServletResponse 類和 HttpServletRequest 類一樣。每次請求進來,Tomcat 服務器都會創建一個 Response 對象傳遞給 Servlet 程序去使用。HttpServletRequest 表示請求過來的信息,HttpServletResponse 表示所有響應的信息,我們如果需要設置返回給客戶端的信息,都可以通過 HttpServletResponse 對象來進行設置

2,兩個輸出流的說明

  • 字節流 getOutputStream(); ---------- > 常用於下載(傳遞二進制數據)

  • 字符流 getWriter(); ---------- > 常用於回傳字符串(常用)

  • 兩個流同時只能使用一個。使用了字節流,就不能再使用字符流,反之亦然,否則就會報錯。

  • 案例:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getOutputStream();
    resp.getWriter();
}

在這裏插入圖片描述

3,如何往客戶端回傳數據

  • 往客戶端回傳 字符串 數據
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //往客戶端回傳 字符串 數據
    PrintWriter writer = resp.getWriter();
    writer.write("我是Tommey呀");
}

4,響應的亂碼解決

  • 解決響應中文亂碼方案一(不推薦使用):
        // 設置服務器字符集爲 UTF-8
        resp.setCharacterEncoding("UTF-8");
        // 通過響應頭,設置瀏覽器也使用 UTF-8 字符集
        resp.setHeader("Content-Type", "text/html; charset=UTF-8");
  • 解決響應中文亂碼方案二(推薦):
        /**
         * 它會同時設置服務器和客戶端都使用 UTF-8 字符集,還設置了響應頭
         * 此方法一定要在獲取流對象之前調用纔有效
         */
        resp.setContentType("text/html; charset=UTF-8");

5,請求重定向

  • 請求重定向,是指客戶端給服務器發請求,然後服務器告訴客戶端說。我給你一些地址。你去新地址訪問。叫請求
    重定向(因爲之前的地址可能已經被廢棄)。

  • 示意圖:
    在這裏插入圖片描述

  • 請求重定向的特點:

    ①,瀏覽器地址會發生變化

    ②,兩次請求

    ③,不能共享Request域中數據

    ④,不能訪問WEB-INF下的資源

    ⑤,可以訪問工程外的資源

  • 請求重定向的第一種方案:

	// 設置響應狀態碼 302 ,表示重定向,(已搬遷)
	resp.setStatus(302);
	// 設置響應頭,說明 新的地址在哪裏
	resp.setHeader("Location", "http://localhost:8080");
  • 請求重定向的第二種方案(推薦使用):
	resp.sendRedirect("http://localhost:8080");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章