標籤:
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對象(一)