【JAVA】HttpServletResponse

Web服務器收到客戶端的http請求,會針對每一次請求,分別創建一個用于代表請求的request對象、和代表響應的response對象。
request和response對象即然代表請求和響應,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象就行了。

使用OutputStream流向客戶端瀏覽器輸出中文數據

使用OutputStream流輸出中文注意問題:
在服務器端,數據是以哪個碼表輸出的,那么就要控制客戶端瀏覽器以相應的碼表打開,比如:outputStream.write("中國".getBytes("UTF-8"));
使用OutputStream流向客戶端瀏覽器輸出中文,以UTF-8的編碼進行輸出,此時就要控制客戶端瀏覽器以UTF-8的編碼打開,否則顯示的時候就會出現中文亂碼,那么在服務器端如何控制客戶端瀏覽器以以UTF-8的編碼顯示數據呢?可以通過設置響應頭控制瀏覽器的行為,例如:response.setHeader("content-type", "text/html;charset=UTF-8");通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據。

范例:使用OutputStream流向客戶端瀏覽器輸出"中國"這兩個漢字

 public class ResponseDemo01 extends HttpServlet {
19     /**
20      * 使用OutputStream流輸出中文
21      * @param request
22      * @param response
23      * @throws IOException 
24      */
25     public void outputChineseByOutputStream(HttpServletResponse response) throws IOException{
26         /**使用OutputStream輸出中文注意問題:
27          * 在服務器端,數據是以哪個碼表輸出的,那么就要控制客戶端瀏覽器以相應的碼表打開,
28          * 比如:outputStream.write("中國".getBytes("UTF-8"));//使用OutputStream流向客戶端瀏覽器輸出中文,以UTF-8的編碼進行輸出
29          * 此時就要控制客戶端瀏覽器以UTF-8的編碼打開,否則顯示的時候就會出現中文亂碼,那么在服務器端如何控制客戶端瀏覽器以以UTF-8的編碼顯示數據呢?
30          * 可以通過設置響應頭控制瀏覽器的行為,例如:
31          * response.setHeader("content-type", "text/html;charset=UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據
32          */
33         String data = "中國";
34         OutputStream outputStream = response.getOutputStream();//獲取OutputStream輸出流
35         response.setHeader("content-type", "text/html;charset=UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那么瀏覽器顯示的將是亂碼
36         /**
37          * data.getBytes()是一個將字符轉換成字節數組的過程,這個過程中一定會去查碼表,
38          * 如果是中文的操作系統環境,默認就是查找查GB2312的碼表,
39          * 將字符轉換成字節數組的過程就是將中文字符轉換成GB2312的碼表上對應的數字
40          * 比如: "中"在GB2312的碼表上對應的數字是98
41          *         "國"在GB2312的碼表上對應的數字是99
42          */
43         /**
44          * getBytes()方法如果不帶參數,那么就會根據操作系統的語言環境來選擇轉換碼表,如果是中文操作系統,那么就使用GB2312的碼表
45          */
46         byte[] dataByteArr = data.getBytes("UTF-8");//將字符轉換成字節數組,指定以UTF-8編碼進行轉換
47         outputStream.write(dataByteArr);//使用OutputStream流向客戶端輸出字節數組
48     }
55 }

使用PrintWriter流向客戶端瀏覽器輸出中文數據
使用PrintWriter流輸出中文注意問題:
在獲取PrintWriter輸出流之前首先使用"response.setCharacterEncoding(charset)"設置字符以什么樣的編碼輸出到瀏覽器,如:response.setCharacterEncoding("UTF-8");設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器,然后再使用response.getWriter();獲取PrintWriter輸出流,這兩個步驟不能顛倒,如下:

1 response.setCharacterEncoding("UTF-8");//設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器

2 /**
3 * PrintWriter out = response.getWriter();這句代碼必須放在response.setCharacterEncoding("UTF-8");之后
4 * 否則response.setCharacterEncoding("UTF-8")這行代碼的設置將無效,瀏覽器顯示的時候還是亂碼
5 */

6 PrintWriter out = response.getWriter();//獲取PrintWriter輸出流

//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那么瀏覽器顯示的將是亂碼
2 response.setHeader("content-type", "text/html;charset=UTF-8");

/**
2 * 多學一招:使用HTML語言里面的<meta>標簽來控制瀏覽器行為,模擬通過設置響應頭控制瀏覽器行為
3  *response.getWriter().write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
4 * 等同于response.setHeader("content-type", "text/html;charset=UTF-8");
5 */
6 response.getWriter().write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");

/**
26      * 下載文件,通過OutputStream流
27      * @param response
28      * @throws FileNotFoundException
29      * @throws IOException
30      */
31     private void downloadFileByOutputStream(HttpServletResponse response)
32             throws FileNotFoundException, IOException {
33         //1.獲取要下載的文件的絕對路徑
34         String realPath = this.getServletContext().getRealPath("/download/1.JPG");
35         //2.獲取要下載的文件名
36         String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
37         //3.設置content-disposition響應頭控制瀏覽器以下載的形式打開文件
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
39         //4.獲取要下載的文件輸入流
40         InputStream in = new FileInputStream(realPath);
41         int len = 0;
42         //5.創建數據緩沖區
43         byte[] buffer = new byte[1024];
44         //6.通過response對象獲取OutputStream流
45         OutputStream out = response.getOutputStream();
46         //7.將FileInputStream流寫入到buffer緩沖區
47         while ((len = in.read(buffer)) > 0) {
48         //8.使用OutputStream將緩沖區的數據輸出到客戶端瀏覽器
49             out.write(buffer,0,len);
50         }
51         in.close();
52     }

在編寫下載文件功能時,要使用OutputStream流,避免使用PrintWriter流,因為OutputStream流是字節流,可以處理任意類型的數據,而PrintWriter流是字符流,只能處理字符數據,如果用字符流處理字節數據,會導致數據丟失。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,759評論 18 399
  • 編碼問題一直困擾著開發人員,尤其在 Java 中更加明顯,因為 Java 是跨平臺語言,不同平臺之間編碼之間的切換...
    x360閱讀 2,498評論 1 20
  • 重塑,品牌 1.工程訓練3.5h(熱處理)! a.為期三周的工訓到此結束,真正體驗到了工業加工是如何進行的,深化了...
    橘子俠閱讀 161評論 0 0
  • 前幾天有個書友說想看看《云中歌》和《大漠瑤》的讀后感。今天我就把《云中歌》的讀后感發上來。 其實《云中歌》這部小說...
    瀟逍閱讀 970評論 5 3