JavaWeb學習總結(四)HttpServletResponse對象(一)

       Web服務器收到客戶端的http請求,會針對每一次請求,分別創建一個用於代表請求的request對象、和代表響應的response對象。

request和response對象即然代表請求和響應,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象就行了。

一、HttpServletResponse對象常見應用

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

      

public class demoResponse extends HttpServlet {

    private static final long serialVersionUID = 4312868947607181532L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        outputChineseByOutputStream(response);//使用OutputStream流輸出中文
    }
    
    /**
     * 使用OutputStream流輸出中文
     * @param request
     * @param response
     * @throws IOException 
     */
    public void outputChineseByOutputStream(HttpServletResponse response) throws IOException{
        /**使用OutputStream輸出中文注意問題:
         * 在服務器端,數據是以哪個碼錶輸出的,那麼就要控制客戶端瀏覽器以相應的碼錶打開,
         * 比如:outputStream.write("中國".getBytes("UTF-8"));//使用OutputStream流向客戶端瀏覽器輸出中文,以UTF-8的編碼進行輸出
         * 此時就要控制客戶端瀏覽器以UTF-8的編碼打開,否則顯示的時候就會出現中文亂碼,那麼在服務器端如何控制客戶端瀏覽器以以UTF-8的編碼顯示數據呢?
         * 可以通過設置響應頭控制瀏覽器的行爲,例如:
         * response.setHeader("content-type", "text/html;charset=UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據
         */
        String data = "中國";
        OutputStream outputStream = response.getOutputStream();//獲取OutputStream輸出流
        response.setHeader("content-type", "text/html;charset=UTF-8");//通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那麼瀏覽器顯示的將是亂碼
        /**
         * data.getBytes()是一個將字符轉換成字節數組的過程,這個過程中一定會去查碼錶,
         * 如果是中文的操作系統環境,默認就是查找查GB2312的碼錶,
         * 將字符轉換成字節數組的過程就是將中文字符轉換成GB2312的碼錶上對應的數字
         * 比如: "中"在GB2312的碼錶上對應的數字是98
         *         "國"在GB2312的碼錶上對應的數字是99
         */
        /**
         * getBytes()方法如果不帶參數,那麼就會根據操作系統的語言環境來選擇轉換碼錶,如果是中文操作系統,那麼就使用GB2312的碼錶
         */
        byte[] dataByteArr = data.getBytes("UTF-8");//將字符轉換成字節數組,指定以UTF-8編碼進行轉換
        outputStream.write(dataByteArr);//使用OutputStream流向客戶端輸出字節數組
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

        看一下結果:

       

       

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

         
public class demoResponse2 extends HttpServlet {

    private static final long serialVersionUID = 4312868947607181532L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        outputChineseByPrintWriter(response);//使用PrintWriter流輸出中文
    }

    /**
     * 使用PrintWriter流輸出中文
     * @param request
     * @param response
     * @throws IOException 
     */
    public void outputChineseByPrintWriter(HttpServletResponse response) throws IOException{
        String data = "中國";
        
        //通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那麼瀏覽器顯示的將是亂碼
        //response.setHeader("content-type", "text/html;charset=UTF-8");
        
        response.setCharacterEncoding("UTF-8");//設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器
        /**
         * PrintWriter out = response.getWriter();這句代碼必須放在response.setCharacterEncoding("UTF-8");之後
         * 否則response.setCharacterEncoding("UTF-8")這行代碼的設置將無效,瀏覽器顯示的時候還是亂碼
         */
        PrintWriter out = response.getWriter();//獲取PrintWriter輸出流
        /**
         * 多學一招:使用HTML語言裏面的<meta>標籤來控制瀏覽器行爲,模擬通過設置響應頭控制瀏覽器行爲
         * out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
         * 等同於response.setHeader("content-type", "text/html;charset=UTF-8");
         */
        out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
        out.write(data);//使用PrintWriter流向客戶端輸出字符
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

        查看一下結果:

                 


        注意點:

    1)在開發過程中,如果希望服務器輸出什麼瀏覽器就能看到什麼,那麼在服務器端都要以字符串的形式進行輸

          出。如果使用PrintWriter流輸出數字,那麼也要先將數字轉換成字符串後再輸出。

      2)文件下載注意事項:編寫文件下載功能時推薦使用OutputStream流,避免使用PrintWriter流,

          因爲OutputStream流是字節流,可以處理任意類型的數據,而PrintWriter流是字符流,

          只能處理字符數據,如果用字符流處理字節數據,會導致數據丟失


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