HttpServletResponse對象(一)

來源:互聯網
上載者:User

標籤:

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

 request和response對象既然代表請求和響應,那麼我擷取客戶機提交過來的資料,找request對象,向客戶機輸出資料,只需要找response對象。

一:HttpServletResponse對象介紹

  

HttpServletResponse對象代表格服務器的響應。這個對象中封裝了向用戶端發送資料,發送回應標頭,發送響應狀態代碼的方法。

1.1:負責向用戶端(瀏覽器)發送資料的相關方法

  

1.2:發送回應標頭的相關方法

1.3:發送響應狀態代碼的相關方法

  

1.4:響應狀態代碼的常量

  HttpServletResponse定義了很多狀態代碼的常量,具體查看API

  常見的:404

200:

500:

二:HttpServletResponse對象常見應用

  2.1使用outputStream流向用戶端輸出中文資料

  範例:public class ResponseDemo01 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data="中國";
        OutputStream op=response.getOutputStream();
        response.setHeader("content-type", "text/html;charse=GBK");
        byte[] dataByteArr=data.getBytes("GBK");
        op.write(dataByteArr);
    }
}

  2.2:使用printwriter流向用戶端輸出中文資料

  public class ResponseDemo01 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data="中國";
        response.setHeader("content-type", "text/html;charset=GBK");
        response.setCharacterEncoding("GBK");
        PrintWriter out=response.getWriter();
        out.print(data);
    }
}

使用printwriter沒有將字串轉換成位元組數組那一步。

2.3:檔案下載

  實現的思路::

    1.擷取要下載的檔案的絕對路徑

    2.擷取要下載的檔案名稱

    3.設定content-disposition回應標頭控制瀏覽器以下載的形式開啟檔案

    4.擷取要下載的檔案輸入資料流

    5.建立資料緩衝區

    6.通過response對象擷取OutputStream流

    7.將FileInputStream流寫入到buffer緩衝區

    8.使用OutputStream將緩衝區的資料輸出到用戶端瀏覽器

代碼:

  public class ResponseDemo02 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1:擷取下載檔案的絕對路徑
        String realPath=this.getServletContext().getRealPath("/download/2.jpg");
        //2擷取下載的檔案名稱
        String fileName=realPath.substring(realPath.lastIndexOf("\\")+1);
        //3設定content-disposition回應標頭控制瀏覽器以下載的形式開啟檔案

中文檔案名稱要使用URLEncoder.encode方法進行編碼,否則會出現檔案名稱亂碼
 response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));

        response.setHeader("content-disposition", "attachment;filename="+fileName);
        //4:擷取要下載的檔案輸入資料流
        InputStream in=new FileInputStream(realPath);
        int len=0;
        //5:建立資料緩衝區
    byte[] buffer=new byte[1024];
        //6通過response對象擷取outputStream流
    OutputStream out=response.getOutputStream();
        //7將fileInputStream流寫入到buffer緩衝區
    while((len=in.read(buffer))>0){
        //8使用outputStream將緩衝區的資料輸出到用戶端瀏覽器
        out.write(buffer,0,len);
    }
        in.close();
    }
}

第三步是以下載的形式開啟檔案,然後inputsteam是把內容寫入到路徑中,然後outputstream輸出到用戶端展示出來。

檔案下載注意事項:編寫檔案下載功能時推薦使用OutputStream流,避免使用PrintWriter流,因為OutputStream流是位元組流,可以處理任意類型的資料,而PrintWriter流是字元流,只能處理字元資料,如果用字元流處理位元組資料,會導致資料丟失。

 response實現細節:  

    getOutputStream和getWriter方法分別用於得到輸出位元據、輸出文本資料的ServletOuputStream、Printwriter對象。
    getOutputStream和getWriter這兩個方法互斥,調用了其中的任何一個方法後,就不能再調用另一方法。  
    Servlet程式向ServletOutputStream或PrintWriter對象中寫入的資料將被Servlet引擎從response裡面擷取,Servlet引擎將這些資料當作響應訊息的本文,然後再與響應狀態行和各回應標頭組合後輸出到用戶端。
    Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出資料流對象是否已經調用過close方法,如果沒有,Servlet引擎將調用close方法關閉該輸出資料流對象。

  

HttpServletResponse對象(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.