JavaWeb (七) Servlet : HTTP協議、HttpSerbletRequest、HttpServletResponse、轉發、重定向

個人博客網:   https://wushaopei.github.io/     (你想要這裏多有)

1、Http協議

1.1 什麼是HTTP協議
        什麼是協議?
            雙方相互約定好,都需要遵守的規則。叫協議。    
        
        http協議:客戶端和服務器之間通知走的是http協議。
            那麼這個協議指的是客戶端發送數據給服務器和服務器回傳數據給客戶端,這個數據需要遵守的數據格式。

        http報文 ,所謂報文就是發送的數據。

1.2 請求的HTTP協議格式

  • GET請求
         (1)請求行    
                 1.1請求的方式GET
                 1.2請求的資源地址?參數
                 1.3請求的協議和版本號      HTTP/1.1
         (2)請求頭

  • POST請求
           (1)請求行
                   1.1請求的方式POST
                   1.2請求的資源地址
                   1.3請求的協議和版本號    HTTP/1.1
           (2)請求頭
                    空行
           (3)請求體

在谷歌瀏覽器下如何查看HTTP協議

火狐瀏覽器如何查看HTTP協議內容:

 

GET請求HTTP協議分爲兩部分:	
請求行
        1 請求的方式GET
        2 請求的資源?參數
        3 請求的協議和版本號  HTTP/1.1
請求頭

POST請求的HTTP協議分爲三部分:
     請求行
        1 請求的方式POST
        2 請求的資源
        3 請求的協議和版本號	HTTP/1.1
     請求頭
            空行
     請求體


  常用請求頭的說明
	Accept:		        告訴服務器客戶端可以接收的數據類型
	Accept-Language:	告訴服務器客戶端希望接收的語言
	Host:			告訴服務器。客戶端請求的服務器IP和端口號
	User-Agent:		告訴服務器瀏覽器的信息

  哪些是GET請求,哪些是POST請求
	GET請求有哪些
            1.在瀏覽器地址欄中輸入地址,敲回車。是GET請求
            2.a標籤,都是get請求
            3.form標籤 method=get也是get請求
            4.link標籤用來引入css樣式,是get請求
            5.script標籤用來引入js文件,也是get請求
            6.img標籤引入圖片是get請求
            7.iframe標籤用來引入單獨的html,也是Get請求

	POST請求
	    form標籤	method=post是POST請求		

  響應的HTTP協議格式
	響應行	
		響應的協議和版本號	HTTP/1.1
		響應狀態碼
		響應狀態描述符
	響應頭
		空行
	響應體

常用的響應碼說明
		200				請求響應成功		
		404				請求的資源不存在
		302				請求重定向
		500				請求已經被服務器接收到,但是服務器內部錯誤

    
MIME類型說明

 MIME是HTTP協議中數據類型。
 MIME的英文全稱是"Multipurpose Internet Mail Extensions" 多功能Internet 郵件擴充服務。MIME類型的格式是“大類型/小類型”,並與某一種文件的擴展名相對應。

    text/html		.html	.htm
    text是大類型
    html是小類型

    MIME	    就是數據類型字符串描述符

常見的MIME類型:

         

我們的Tomcat支持哪些類型,可以到web.xml中去查看


谷歌瀏覽器查看HTTP響應

火狐瀏覽器查看HTTP響應

2、HttpServletRequest類

2.1 HttpServletRequest類有什麼作用。
    它表示請求的信息,每次請求進來。Tomcat服務器就會創建一個HttpServletRequest對象。然後把請求的數據封裝到request對象中
    我們可以從request對象中獲取到所有請求有關的信息。

2.2 HttpServletRequest類的常用方法

常用API

public class RequestAPI extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
//		i.getRequestURI()				獲取請求資源地址
		System.out.println("請求的資源地址:" + request.getRequestURI());
//		ii.getRequestURL()				獲取請求的統一資源定位符(絕對路徑)
		System.out.println( "請求的統一資源定位符:" + request.getRequestURL() );
//		iii.getRemoteHost()			獲取客戶端的IP
		System.out.println( "客戶端的IP:" + request.getRemoteHost() );
//		iv.getHeader()					獲取請求頭信息
		System.out.println( "請求頭:" + request.getHeader("Accept-Language") );
		System.out.println( "請求頭:" + request.getHeader("User-Agent") );
//		vii.getMethod()				獲取請求的方式	GET或POST
		System.out.println( "請求的方式:" + request.getMethod() );
	}

}

2.3 如何獲取請求參數

    protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// getParameter獲取請求的參數,這個方法的參數是請求的參數名
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String[] hobbies = request.getParameterValues("hobby");
		System.out.println("用戶名:" + username);
		System.out.println("密碼:" + password);
		if (hobbies != null) {
			Arrays.asList(hobbies).forEach(System.out::println);
		}
    }

2.4 GET請求的中文亂碼解決

    GET請求中文亂碼解決方案一:

                // 先使用iso-8859-1進行編碼
		byte[] buffer = username.getBytes("iso-8859-1");
		// 再使用UTF-8字符集進行解碼
		username = new String(buffer, "UTF-8");

GET請求中文亂碼解決方案二:
    找到Tomcat的server.xml配置文件。找到Connector標籤,添加URIEncoding屬性

2.5 POST請求的中文亂碼解決
    POST請求解決中亂碼方案一:

        // 先使用iso-8859-1進行編碼
		byte[] buffer = username.getBytes("iso-8859-1");
		// 再使用UTF-8字符集進行解碼
	username = new String(buffer, "UTF-8");

POST請求解決中文亂碼方案二:

        // 解決post中文亂碼(通過設置請求體的字符集)
		// 必須在getParameter方法之前調用纔有效
	request.setCharacterEncoding("UTF-8");

中文亂碼解決,需要注意的點:

        1、request.setCharacterEncoding("UTF-8");
            不能解決GET請求的中文亂碼

        2、Tomcat8之後,GET請求默認是沒有中文亂碼的

2.6 請求的轉發(需要結合jsp一起)

2.7 Base標籤的作用

         

        

2.8 Web中的相對路徑和絕對路徑

          

2.9 web中/斜槓的不同意義

3、 HttpServletResponse類

3.1 概述

a) HttpServletResponse類的作用
    所響應的信息,都可以通過httpServletResponse類進行設置。

b ) 兩個輸出流說明。
     字節流            response.getOutputStream();            主要實現下載
     字符流            response.getWriter()                           主要輸出字符串

    一個response對象,只能在一個時間內使用字節流,或字符流,兩個流不能同時使用。

c ) 如何往客戶端回傳數據
        往客戶端輸出字符串

    public class ResponseIO extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		
		writer.write("this is the response's content!");		
	}
}

3.2 響應的亂碼解決
        解決響應中文亂碼的第一種方案:

        protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
//		System.out.println( response.getCharacterEncoding() );
		// 設置服務器響應字符集爲UTF-8
		response.setCharacterEncoding("UTF-8");
		
		// 通過設置響應頭,告訴客戶端使用UTF-8查看
		response.setHeader("Content-Type", "text/html; charset=UTF-8");
		
		PrintWriter writer = response.getWriter();
		
		writer.write("這是響應返回的內容!");
		
}

解決響應中文亂碼的第二種方案:

                // 解決響應中文亂碼。
		// 必須要獲取流之前調用
		//設置服務器使用UTF-8.並設置響應頭"Content-Type:text/html; charset=UTF-8"
	response.setContentType("text/html;charset=UTF-8");

3.3 如何設置響應頭和響應狀態碼

請求重定向第一種實現方案:

    protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("曾到此一遊Response1");
		
		request.setAttribute("abc", "abcValue");
		
		// 需要設置響應狀態碼和響應頭
		response.setStatus(302); // 設置響應狀態碼爲302
		// 設置響應頭
//		response.setHeader("Location", "http://localhost:8080/day07/response2");
		response.setHeader("Location", "http://www.baidu.com");
    }

a)  請求重定向

        // 請求重定向(推薦使用)
	response.sendRedirect("http://localhost:8080/day07/response2");

4、請求轉發和重定向

 

如果兩種都可以實現。優先使用轉發
如果轉發問題,再考慮使用重定向

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