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方法關閉輸出流對象