response簡介

response request

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

我們要獲取客戶機提交過來的數據,只需要找request對象

要向客戶機輸出數據,只需要找response對象

HttpServletResponse對象服務器的響應,這個對象中封裝了向客戶端發送數據,發送響應頭,發送響應狀態碼的方法

getStatus(int sc)狀態碼
getHeader(java.lang.String name,java.lang.String value)頭
getWriter()數據 字符流寫文本
getOutputStream()數據 字節流寫任何

對應的set方法

response常見應用

1.向客戶端輸出中文數據
分別以OutputStream和PrintWriter輸出
OutputStream輸出編碼問題 
通過response.setHeader("Content-type","text/html;charset=UTF-8");
控制瀏覽器以什麼碼錶打開

用HTML中的<meta>標籤控制瀏覽器行爲
<meta>可以模擬一個http響應頭
out.writer("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());

寫錯了瀏覽器會提示下載
PrintWriter輸出只能寫字符和字符串
可以設置response使用的碼錶,控制response以什麼碼錶向瀏覽器寫出數據
response.setCharacterEncoding("UTF-8");
指定瀏覽器以什麼碼錶打開服務器發送的數據
response.setHeader("content-type","text/html;charset=UTF-8");
保證沒有錯誤
便捷寫法response.setContentType("text/html;charset=UTF-8");起到了上面兩句話的作用

out.writer(1);瀏覽器顯示文本1會編碼解碼出r(非1) 要寫out.writer((1+"").getBytes());

2.文件下載和中文文件下載
response.setHeader("content-disposition","attachment;filename="+filename);//添加頭告訴瀏覽器要下載文件

String path = this.getServletContext().getRealPath(download/1.jpg);//找到絕對路徑
String filename = path.substring(path.lastIndexOf("\\")+1);//通過\找到資源文件名1.jpg
InputStream in = null;
OutputStream out = null;
try{
    in = new FileInputStream(path);
    int len = 0;
    byte buffer[] = new byte[1024];
    out = response.getOutputStream();
    while((len = in.read(buffer)) > 0){
         out.writer(buffer,0,len);
    }
}finally{
    if(in != null){
try{
    in.close();
}catch(Exception e){
        e.printStackTrace();
}
    }
}

如果下載文件名是中文文件,則文件名需要經過url編碼
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
//以UTF-8編碼文件名
3.輸出隨機圖片
4.發送http頭,控制瀏覽器定時刷新網頁(refresh)

控制瀏覽器定時刷新

Response.setHeader(“refresh”,”3”);

String data = new Random().nextInt(10000)+””;

Response.getWriter().writer(data);

對於一個用於處理登錄的servlet

假設程序運行到此,用戶登陸成功了

response.setCharacterEncoding(“UTF-8”);

response.setContentType(“text/html;charset=UTF-8”);//解決中文編碼問題

response.setHeader(“refresh”,”3;url=’/xxx/index.jsp’”);

response.getWriter().write(“恭喜登陸成功,3秒後跳轉到首頁,沒有跳請點<ahref=’ ’>超鏈接</a>”);

5.發送http頭,控制瀏覽器禁止緩存當前文檔內容

控制瀏覽器實現緩存

response.setDateHeader(“expires”,System.currentTimeMillis()+1000*3600);

String data = “aaaaaaaaaa”;

response.getWriter().writer(data);

6.重定向和細節

Response實現請求重定向

response.setStatus(302);

response.setHeader(“location”,”/xxx/index.jsp”);//基於http協議

response.sendRedirect(“/xxx/index.jsp”);//servlet提供的方法

登陸要用,重定向會導致地址欄地址改變,表示登陸了

購買要用,重定向到購物車,轉發刷新會又處理一次請求

其他地方儘量不用

重定向特點:

       1.瀏覽器會向服務器發送2次,有2個request/response

       2.重定向技術瀏覽器地址欄會發生變化

Response一些細節

1.getOutputStream方法得到輸出二進制數據的ServletOutputStream對象

  getWriter方法得到輸出文本數據的Printwriter對象

兩個方法互相排斥,調用其一,就不能調用另外一個,會拋異常500

2.Servlet程序向ServletOutputStream對象Printwriter對象寫入的數據將被Servlet引擎從response裏面獲取,Servlet引擎將這些數據當作響應消息的正文,再與響應狀態行和各響應頭組合後輸出到客戶端

service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,沒有將調用close方法關閉輸出流對象


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