HttpServletResponse

HttpServletResponse簡介
1、 WEB服務器回送給WEB客戶端的HTTP響應消息分爲三個部分:
(1)狀態行
(2)響應消息頭
(3)消息正文(也叫實體內容)
2、 Servlet API中定義的ServletResponse接口類用於創建響應消息。
3、 HttpServletResponse是專用於HTTP協議的ServletResponse子接口,它用於封裝HTTP響應消息。
4、 HttpServletResponse定義了一系列用於描述各種HTTP狀態碼的常量。
5、 在service()方法內部調用HttpServletResponse對象的各種方法來創建響應消息。
產生響應狀態行
1、 HTTP響應消息的響應狀態行包括HTTP版本、狀態代碼和一條相關的提示信息:
HTTP/1.1 200 OK
2、 HttpServletResponse中定義了若干與狀態碼數值對應的常量,每個常量的名稱以前綴SC(Status Code的簡寫)開頭,然後是狀態碼在HTTP 1.1規範中所表示的狀態信息的英文單詞的組合,每個單詞之間用下劃線連接,且所有字母都大寫。
狀態碼404 對應的常量爲HttpServletResponse.SC_NOT_FOUND
3、 setStatus方法用於設置HTTP響應消息的狀態碼,並生成響應狀態行。
4、 sendError方法用於發送表示錯誤信息的狀態碼(一般是404,找不到客戶機所請求的資源)到客戶端,並清除緩衝區中的內容。
響應消息頭的實用案例
Servlet的中文輸出問題
原理:
1、 瀏覽器接收到的中文字符並不是中文符號本身,而是它的某種字符集編碼的數據。
2、 瀏覽器必須使用正確的字符集編碼進行查看,才能將它所接收到的數據顯示爲正確的中文字符。
3、 當Servlet程序僅僅需要輸出純文本格式的響應正文時,通常應調用ServletResponse對象的getWriter方法返回一個PrintWriter對象,然後使用這個PrintWriter對象將文本內容寫入到客戶端。
4、 Java程序中的字符文本在內存中是以unicode編碼的形式存在的,PrintWriter對象在輸出字符文本時,需要先將它們轉換成其他某種字符集編碼的字節數組後輸出。
5、 ServletResponse對象的getWriter方法返回的PrintWriter對象默認使用ISO8859-1字符集編碼進行Unicode字符串到字節數組的轉換,由於ISO8859-1字符集中根本就沒有中文字符,Unicode編碼的中文字符將被轉換成無效的字符編碼後輸出給客戶端。
解決辦法:
1、 ServletResponse接口中定義了setCharacterEncoding、setContentType和setLocale等方法來指定ServletResponse.getWriter方法返回的PrintWriter對象所使用的字符集編碼。
2、 調用ServletResponse接口中定義的setContentType方法,在HTTP響應消息的Content-Type頭字段中指定響應正文的字符集編碼。
response.setContentType(“text/html;charset=utf-8”);
Html文檔
瀏覽器對請求參數中的字符(中國)的某種字符集編碼(utf-8)進行了url編碼
中 utf-8的編碼是E4B8AD ——>url編碼
請求消息發送到web服務器
Web服務器從請求消息把每一個參數名和參數值分離出來
對每一個參數名和參數值針對某種字符集編碼()進行url解碼(解碼後是字節數組E4 B8 AD)——按照某種字符集編碼(utf-8)(中)
讓瀏覽器定時刷新網頁
1、 HTTP協議中定義了一個Refresh頭字段,用於告訴瀏覽器過多少秒後自動刷新頁面。
2、 在Refresh頭字段的時間設置值後面還可以用分號(;)分隔後,再指定一個URL地址,這將讓瀏覽器在指定的時間值後自動去訪問該URL地址指向的資源。
response.setHeader(“Refresh”,”2);
禁止瀏覽器緩存當前文檔內容
//以下3條語句是設置瀏覽器不緩存,因爲各個瀏覽器的支持不同,所以寫3個
response.setDateHeader(“Expires”,0 );
response.setHeader(“Cache-Controll”,”no-cache”);
response.setHeader(“pragma”,”no-cache”);

服務器端servlet程序中service()對客戶端瀏覽器向web服務器發送的請求產生應答信息進行處理
HttpServletRequest對象——封裝請求對象
(1) 請求行:請求類型/請求路徑/參數/http協議——GET/demo/test?username=xxx HTTP/1.1
(2) 請求消息頭:getHeader(“頭字段的名稱”)
(3) (前一個表單所獲得的數據作爲參數封裝在請求消息中)getParameter(“參數名”)參數
(4) 消息實體的內容 getInputStream()——得到字節輸入流 getReader——得到字符輸入流 這兩個方法互斥 流對象.read()
HttpServletResponse對象——封裝應答對象
(1) 狀態行 HTTP/1.1 200 OK
Response.setStatus(HttpServletResponse.SC_OK)//自己寫狀態碼,這樣寫,一般不寫,因爲系統會自動自動生成狀態碼
(2)相應消息的消息頭
Context-Type
Response.setContextType(“text/html”);
Refresh:
Response.setHeader(“Refresh”,”2;URL=page.html”);
(3)消息實體內容
通過輸出流對象進行設置
response.getOutputStream() 字節輸出流對象——二進制數組
response.getWriter() 字符輸出流對象——【—-字節到字符流的轉換】——純文本
標籤——在靜態頁面中設置響應消息頭

getOutputStream與getWriter
1、 getOutputStream方法用於返回Servlet引擎創建的字節輸出流對象,Servlet程序可以按字節形式輸出響應正文。
2、 getWriter方法用於返回Servlet引擎創建的字符輸出流對象,Servlet程序可以按字符形式輸出響應正文。
3、 getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另一方法。
4、 getOutputStream方法返回的字節輸出流對象的類型爲ServletOutputStream,它可以直接輸出字節數組中的二進制數據。
5、 getWriter方法將Servlet引擎的數據緩衝區包裝成PrintWriter類型的字符輸出流對象後返回,PrintWriter對象可以直接輸出字符文本內容。
6、 Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎獲取,Servlet引擎將這些數據當作響應消息的正文,然後再與響應狀態行和各響應頭組合後輸出到客戶端。
7、 Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎將調用close方法關閉該輸出流對象。
選擇getOUtputStream和getWriter方法的要點:
1、 PrintWriter對象輸出字符文本內容時,它內部還是將字符串轉換成了某種字符集編碼的字節數組後再進行輸出,使用PrintWriter對象的好處就是不用編程人員自己來完成字符串到字節數組的轉換。
2、 使用ServletOutputStream對象也能輸出內容全爲文本字符的網頁文檔,但是,如果網頁文檔內容是在Servlet程序內部使用文本字符串動態拼湊和創建出來的,則需要先將字符文本轉換成字節數組後輸出。
3、 如果一個網頁文檔內容全部爲字符文本,但是這些內容可以直接從一個字節輸入流中讀取出來,然後再原封不動地輸出到客戶端,那麼就應該使用ServletOutputStream對象直接進行輸出,而不要使用PrintWriter對象進行輸出。
輸出緩衝區:
1、 Servlet程序輸出的HTTP消息的響應正文首先被寫入到Servlet引擎提供的一個輸出緩衝區中,直到輸出緩衝區被填滿或者Servlet程序已經寫入了所有的響應內容,緩衝區中的內容纔會被Servlet引擎發送到客戶端。
2、 使用輸出緩衝區後,Servlet引擎就可以將響應狀態行、各響應頭和響應正文嚴格按照HTTP消息的位置順序進行調整後再輸出到客戶端。
3、 如果在提交響應到客戶端時,輸出緩衝區中已經裝入了所有的響應內容,Servlet引擎將計算響應正文部分的大小並自動設置Content-Length頭字段。
4、 如果在提交響應到客戶端時,輸出緩衝區中裝入的內容只是全部響應內容的一部分, Servlet引擎將使用HTTP 1.1的chunked編碼方式(通過設置Transfer-Encoding頭字段來指定)傳輸響應內容。
動態文件內容的下載:

1、 需要通過HttpServletResponse.setContentType方法設置Content-Type頭字段的值爲瀏覽器無法使用某種方式或激活某個程序來處理的MIME類型,例如,“application/octet-stream”或“application/x-msdownload”等。
2、 需要通過HttpServletResponse.setHeader方法設置Content-Disposition頭的值爲“attachment; filename =文件名”。
3、 應該調用HttpServletResponse.getOutputStream方法返回的ServletOutputStream對象來向客戶端寫入附件文件內容,而不應使用HttpServletResponse.getWriter方法返回的PrintWriter對象。
response.setContentType(“application/x-msdownload”);
response.addHeader(“Content-Disposition”, “attachment;filename=a.txt”);
ServletOutputStream sos=response.getOutputStream();
sos.write(“hello”.getBytes());//動態生成下載的內容
sos.close();
瀏覽器:
Java程序:中文字符——unicode
字符輸出流對象out.printen();按照某種字符集編碼的方式轉換成字節數組
瀏覽器:字節數組——轉換成字符
轉自http://my.csdn.net/w_l_j

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