JavaWeb 之 HttpServletResponse 對象


一、Response 原理和繼承結構

  原理和繼承結構參考 request。

二、HttpServletResponse 類的作用

    HttpServletResponse 類和 HttpServletRequest 類一樣。 每次請求進來, Tomcat 服務器都會創建一個 Response 對象傳遞給 Servlet 程序去使用。

    HttpServletRequest 表示請求過來的信息, HttpServletResponse 表示所有響應的信息,我們如果需要設置返回給客戶端的信息, 都可以通過 HttpServletResponse 對象來進行設置。

二、設置響應信息

  1、設置響應行

      響應頭格式:

HTTP/1.1 200 ok

     設置狀態碼:

setStatus(int sc);  // sc為狀態碼

  2、設置響應頭

    設置響應頭信息:

setHeader(String name, String value);//通過name來給指定的響應頭設置信息 

  3、設置響應體

     使用步驟:

      (1)獲取輸出流

字符輸出流:PrintWriter getWriter()
字節輸出流:ServletOutputStream getOutputStream()

      (2)使用輸出流,將數據輸出到客戶端瀏覽器。

三、獲取輸出流及回傳數據

  1、兩個輸出流

    通過 HttpServletResponse 對象可以獲取兩個輸出流:

字節流 ServletOutputStream getOutputStream();     常用於下載(傳遞二進制數據)
字符流 PrintWriter getWriter();                   常用於回傳字符串(常用)

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

    

  2、服務器輸出字符數據到瀏覽器    

    步驟

     (1)獲取字符輸出流

     (2)輸出數據

    Demo:

1 //1.獲取字符輸出流
2 PrintWriter pw = response.getWriter();    獲取的流的默認編碼是ISO-8859-1
3 //2.輸出數據
4 //pw.write("<h1>hello response</h1>");
5 pw.write("你好啊啊啊 response");

    上面的這種方式,向頁面輸出英文沒有問題,而且HTML標簽也會被正常解析,但是如果輸出中文,就會產生亂碼。    

    亂碼問題:

    

     解決亂碼:

 1 //獲取流對象之前,設置流的默認編碼:ISO-8859-1 設置為:utf-8
 2 // response.setCharacterEncoding("utf-8");
 3 //告訴瀏覽器,服務器發送的消息體數據的編碼。建議瀏覽器使用該編碼解碼
 4 //response.setHeader("content-type","text/html;charset=utf-8");
 5 
 6 //簡單的形式,設置編碼
 7 response.setContentType("text/html;charset=utf-8"); 8 
 9 //1.獲取字符輸出流
10 PrintWriter pw = response.getWriter(); 11 //2.輸出數據
12 //pw.write("<h1>hello response</h1>");
13 pw.write("你好啊啊啊 response"); 

    注意:一定要在獲取流之前設置編碼。

 

  3、服務器輸出字節數據到瀏覽器(一般用於非文字的傳輸)

    步驟

     (1)獲取字節輸出流

     (2)輸出數據

    Demo:

1  // 設置消息體數據及編碼
2  response.setContentType("text/html;charset=utf-8"); 3 
4  //1.獲取字節輸出流
5  ServletOutputStream sos = response.getOutputStream(); 6  //2.輸出數據
7  sos.write("你好".getBytes("utf-8"));

 

四、請求重定向

    請求重定向是指客戶端給服務器發請求, 然后服務器告訴客戶端說一些新地址,讓客戶端去新地址訪問。 叫請求重定向(因為之前的地址可能已經被廢棄)
    請求重定向:是一種客戶端資源跳轉的方式。

    原理圖:

    

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

// 設置響應狀態碼 302 , 表示重定向
response.setStatus(302);
// 設置響應頭, 說明 新的地址在哪里
response.setHeader("Location", "http://localhost:8080");

    請求重定向的第二種方法(推薦使用):

response.sendRedirect("http://localhost:8080");

  

    重定向與轉發特點

      重定向(redirect)的特點:[重要]

        ① 地址欄會發生變化;

        ② 重定向可以訪問其他站點(服務器)的資源;

        ③ 重定向是兩次請求,不能使用 request 對象來共享數據;

        ④ 不能訪問 WEB-INF 下的資源,但是可以訪問工程外的資源;

        請求轉發(forward)的特點:[重要]

        ① 轉發地址欄路徑不變

        ② 轉發只能訪問當前工程內容下的資源

        ③ 轉發是一次請求,可以使用 request 對象來共享數據

    路徑問題

       相對路徑:通過性對路徑不可以確定唯一資源

               如:./index.html;

               特點:不以 / 開頭,以 . (點)開頭

               規則:找到當前資源和目標資源之間的相對位置關系

                  ./ :表示當前目錄

                 ../ :表示后退返回上一級目錄

        絕對路徑:通過絕對路徑可以確定唯一資源

               如:http://localhost/web/demo1

               特點:以 / 開頭

               規則:判斷定義的路徑是給誰用的,判斷請求將來從哪里發出

                 ① 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)

                  如:頁面中的超鏈接,form表單,重定向等。

                  注意:不建議把虛擬目錄寫死,一般都是動態獲取。獲取方法:

request.getContextPath()

                 ② 給服務器使用:不需要加虛擬目錄

                  如:轉發路徑; 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM