Response

今日內(nèi)容

1. HTTP協(xié)議:響應(yīng)消息
2. Response對象
3. ServletContext對象

HTTP協(xié)議:

1. 請求消息:客戶端發(fā)送給服務(wù)器端的數(shù)據(jù)
    * 數(shù)據(jù)格式:
        1. 請求行
        2. 請求頭
        3. 請求空行
        4. 請求體
2. 響應(yīng)消息:服務(wù)器端發(fā)送給客戶端的數(shù)據(jù)
    * 數(shù)據(jù)格式:
        1. 響應(yīng)行
            1. 組成:協(xié)議/版本 響應(yīng)狀態(tài)碼 狀態(tài)碼描述
            2. 響應(yīng)狀態(tài)碼:服務(wù)器告訴客戶端瀏覽器本次請求和響應(yīng)的一個狀態(tài)。
                1. 狀態(tài)碼都是3位數(shù)字 
                2. 分類:
                    1. 1xx:服務(wù)器就收客戶端消息,但沒有接受完成,等待一段時間后,發(fā)送1xx多狀態(tài)碼
                    2. 2xx:成功。代表:200
                    3. 3xx:重定向。代表:302(重定向),304(訪問緩存)
                    4. 4xx:客戶端錯誤。
                        * 代表:
                            * 404(請求路徑?jīng)]有對應(yīng)的資源) 
                            * 405:請求方式?jīng)]有對應(yīng)的doXxx方法
                    5. 5xx:服務(wù)器端錯誤。代表:500(服務(wù)器內(nèi)部出現(xiàn)異常)
                        
                
        2. 響應(yīng)頭:
            1. 格式:頭名稱: 值
            2. 常見的響應(yīng)頭:
                1. Content-Type:服務(wù)器告訴客戶端本次響應(yīng)體數(shù)據(jù)格式以及編碼格式
                2. Content-disposition:服務(wù)器告訴客戶端以什么格式打開響應(yīng)體數(shù)據(jù)
                    * 值:
                        * in-line:默認(rèn)值,在當(dāng)前頁面內(nèi)打開
                        * attachment;filename=xxx:以附件形式打開響應(yīng)體。文件下載
        3. 響應(yīng)空行
        4. 響應(yīng)體:傳輸?shù)臄?shù)據(jù)


    * 響應(yīng)字符串格式
        HTTP/1.1 200 OK
        Content-Type: text/html;charset=UTF-8
        Content-Length: 101
        Date: Wed, 06 Jun 2018 07:08:42 GMT

        <html>
          <head>
            <title>$Title$</title>
          </head>
          <body>
          hello , response
          </body>
        </html>

Response對象

* 功能:設(shè)置響應(yīng)消息
    1. 設(shè)置響應(yīng)行
        1. 格式:HTTP/1.1 200 ok
        2. 設(shè)置狀態(tài)碼:setStatus(int sc) 
    2. 設(shè)置響應(yīng)頭:setHeader(String name, String value) 
        
    3. 設(shè)置響應(yīng)體:
        * 使用步驟:
            1. 獲取輸出流
                * 字符輸出流:PrintWriter getWriter()

                * 字節(jié)輸出流:ServletOutputStream getOutputStream()

            2. 使用輸出流,將數(shù)據(jù)輸出到客戶端瀏覽器


* 案例:
    1. 完成重定向
        * 重定向:資源跳轉(zhuǎn)的方式
        * 代碼實現(xiàn):
            //1. 設(shè)置狀態(tài)碼為302
            response.setStatus(302);
            //2.設(shè)置響應(yīng)頭location
            response.setHeader("location","/day15/responseDemo2");


            //簡單的重定向方法
            response.sendRedirect("/day15/responseDemo2");

        * 重定向的特點(diǎn):redirect
            1. 地址欄發(fā)生變化
            2. 重定向可以訪問其他站點(diǎn)(服務(wù)器)的資源
            3. 重定向是兩次請求。不能使用request對象來共享數(shù)據(jù)
        * 轉(zhuǎn)發(fā)的特點(diǎn):forward
            1. 轉(zhuǎn)發(fā)地址欄路徑不變
            2. 轉(zhuǎn)發(fā)只能訪問當(dāng)前服務(wù)器下的資源
            3. 轉(zhuǎn)發(fā)是一次請求,可以使用request對象來共享數(shù)據(jù)
        
        * forward 和  redirect 區(qū)別
            
        * 路徑寫法:
            1. 路徑分類
                1. 相對路徑:通過相對路徑不可以確定唯一資源
                    * 如:./index.html
                    * 不以/開頭,以.開頭路徑

                    * 規(guī)則:找到當(dāng)前資源和目標(biāo)資源之間的相對位置關(guān)系
                        * ./:當(dāng)前目錄
                        * ../:后退一級目錄
                2. 絕對路徑:通過絕對路徑可以確定唯一資源
                    * 如:http://localhost/day15/responseDemo2        /day15/responseDemo2
                    * 以/開頭的路徑

                    * 規(guī)則:判斷定義的路徑是給誰用的?判斷請求將來從哪兒發(fā)出
                        * 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)
                            * 建議虛擬目錄動態(tài)獲?。簉equest.getContextPath()
                            * <a> , <form> 重定向...
                        * 給服務(wù)器使用:不需要加虛擬目錄
                            * 轉(zhuǎn)發(fā)路徑
                            
                    
                    

    2. 服務(wù)器輸出字符數(shù)據(jù)到瀏覽器
        * 步驟:
            1. 獲取字符輸出流
            2. 輸出數(shù)據(jù)

        * 注意:
            * 亂碼問題:
                1. PrintWriter pw = response.getWriter();獲取的流的默認(rèn)編碼是ISO-8859-1
                2. 設(shè)置該流的默認(rèn)編碼
                3. 告訴瀏覽器響應(yīng)體使用的編碼

                //簡單的形式,設(shè)置編碼,是在獲取流之前設(shè)置
                response.setContentType("text/html;charset=utf-8");
    3. 服務(wù)器輸出字節(jié)數(shù)據(jù)到瀏覽器
        * 步驟:
            1. 獲取字節(jié)輸出流
            2. 輸出數(shù)據(jù)

    4. 驗證碼
        1. 本質(zhì):圖片
        2. 目的:防止惡意表單注冊

ServletContext對象:

1. 概念:代表整個web應(yīng)用,可以和程序的容器(服務(wù)器)來通信
2. 獲?。?    1. 通過request對象獲取
        request.getServletContext();
    2. 通過HttpServlet獲取
        this.getServletContext();
3. 功能:
    1. 獲取MIME類型:
        * MIME類型:在互聯(lián)網(wǎng)通信過程中定義的一種文件數(shù)據(jù)類型
            * 格式: 大類型/小類型   text/html       image/jpeg

        * 獲取:String getMimeType(String file)  
    2. 域?qū)ο螅汗蚕頂?shù)據(jù)
        1. setAttribute(String name,Object value)
        2. getAttribute(String name)
        3. removeAttribute(String name)

        * ServletContext對象范圍:所有用戶所有請求的數(shù)據(jù)
    3. 獲取文件的真實(服務(wù)器)路徑
        1. 方法:String getRealPath(String path)  
             String b = context.getRealPath("/b.txt");//web目錄下資源訪問
             System.out.println(b);
    
            String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目錄下的資源訪問
            System.out.println(c);
    
            String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的資源訪問
            System.out.println(a);

案例:

* 文件下載需求:
    1. 頁面顯示超鏈接
    2. 點(diǎn)擊超鏈接后彈出下載提示框
    3. 完成圖片文件下載


* 分析:
    1. 超鏈接指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示,如果不能解析,則彈出下載提示框。不滿足需求
    2. 任何資源都必須彈出下載提示框
    3. 使用響應(yīng)頭設(shè)置資源的打開方式:
        * content-disposition:attachment;filename=xxx


* 步驟:
    1. 定義頁面,編輯超鏈接href屬性,指向Servlet,傳遞資源名稱filename
    2. 定義Servlet
        1. 獲取文件名稱
        2. 使用字節(jié)輸入流加載文件進(jìn)內(nèi)存
        3. 指定response的響應(yīng)頭: content-disposition:attachment;filename=xxx
        4. 將數(shù)據(jù)寫出到response輸出流


* 問題:
    * 中文文件問題
        * 解決思路:
            1. 獲取客戶端使用的瀏覽器版本信息
            2. 根據(jù)不同的版本信息,設(shè)置filename的編碼方式不同
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容