1. 程式人生 > >Servlet中Response物件應用1(輸出簡單文字、實現檔案下載)

Servlet中Response物件應用1(輸出簡單文字、實現檔案下載)

通過response物件可以實現很多功能,下面的程式碼都是在myeclipse上實現過的,整理下路,以備後用。

response物件應用1
1向客戶端傳送簡單訊息
A利用已經宣告的物件,呼叫其getOutputStream()方法,向客戶端輸出內容

response.getOutputStream().write("輸出,以預設編碼形式".getBytes());
System.out.println(response.getCharacterEncoding());

2向客戶端傳送中文訊息,並指定編碼

//下面語句設定了響應內容型別和編碼方式
//response.setContentType("text/html;charset=GBK");
public void test3(HttpServletResponse response) throws IOException{

        OutputStream out = response.getOutputStream();
        out.write(1);//會亂碼,伺服器傳送預設是以ISO編碼,瀏覽器解析預設是gb2312
    }
    //不指定編碼,傳送資料,中文
    public void test2(HttpServletResponse response) throws IOException{

        OutputStream out
= response.getOutputStream(); out.write("中國".getBytes());//會亂碼,iso編碼中沒有漢字 } //以GBK編碼傳送資料 public void test1(HttpServletResponse response) throws IOException{ response.setContentType("text/html;charset=GBK");//設定響應內容和編碼規則 OutputStream out = response.getOutputStream(); out
.write("中國".getBytes());//可以正常現實出中文 }

3使用response物件實現使用者下載功能
步驟:

1、獲取檔案的真實路徑
2、獲取檔案的檔名(用於告訴使用者)
3、告知客戶這是一次下載響應,通過設定response物件的相關內容
4、開啟一 個輸入流,將檔案傳進來。(這個流是針對檔案的)
5、開啟一個輸出流,並將之前的檔案流傳進來,用response物件傳出去。

response.setContentType("text/html;charset=UTF-8");
        1、獲取檔案的真實路徑
        String path = getServletContext().getRealPath("/File/長大水塔.jpg");//獲取檔案的絕對路徑
        2、獲取檔案的檔名(用於告訴使用者)
        String filename = path.substring(path.lastIndexOf("\\")+1);//獲取檔名字
        System.out.println(filename);
        System.out.println(path);
        3、告知客戶這是一次下載響應,通過設定response物件的相關內容
        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename, "UTF-8"));//少了個等於號,attachment附件
        4、開啟一個輸入流,將檔案傳進來。(這個流是針對檔案的)
        InputStream in = new FileInputStream(path);//這個流是針對檔案的輸入的
        5、開啟一個輸出流,並將之前的檔案流傳進來,用response物件傳出去。
        OutputStream out = response.getOutputStream();//這個流是針對response的輸出的
        //傳遞這個流,固定套路
        byte[] buf = new byte[1024];
        int len = -1;
        while((len=in.read(buf)) != -1){
            out.write(buf);
        }
        in.close();

下面是一些關於response物件的細節

1、getOutputStream和getWriter方法分別用於得到輸出二進位制資料、輸出文字資料的ServletOuputStream、Printwriter物件。

2、getOutputStream和getWriter這兩個方法互相排斥,呼叫了其中的任何一個方法後,就不能再呼叫另一方法。 會拋異常。

3、Servlet程式向ServletOutputStream或PrintWriter物件中寫入的資料將被Servlet引擎從response裡面獲取,Servlet引擎將這些資料當作響應訊息的正文,然後再與響應狀態行和各響應頭組合後輸出到客戶端。

4、Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流物件是否已經呼叫過close方法,如果沒有,Servlet引擎將呼叫close方法關閉該輸出流物件。
對於第四條,我們也可以手動關閉輸出流,畢竟“有借有還再借不難”,因為一時偷懶,系統崩了,那就得不償失了。