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方法關閉該輸出流物件。
對於第四條,我們也可以手動關閉輸出流,畢竟“有借有還再借不難”,因為一時偷懶,系統崩了,那就得不償失了。