# HttpServletResponse說明
### 基本概述
????HttpServletResponse是用于將Servlet處理好的內容發送給瀏覽器的類,服務器通過對HttpServletResponse對象中的內容進行截取、拼接就能獲得一個完整的HTTP響應信息。
參考文檔:[http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html](http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html)
### 常用方法
????public?void?addHeader(String?name,String?value)?//添加一個消息頭到HttpServletResponse對象中去。
????public?void?setHeader(String?name,String?value)?//重設一個消息頭,其與addHeader的區別是,add是添加(重復也行),set表示的是,如果有該消息頭就覆蓋它,沒有就創建它
????public?void?setStatus(int?sc)?//設置響應消息的狀態碼,具體可以參照我的另一篇博客HTTP協議入門
????public?void?sendRedirect(String?location)?throws?java.io.IOException?//?這個方法在與request的getRequestDispatch()比較時,會探討
????public?ServletOutputStream?getOutputStream()?throws?java.io.IOException?//得到一個二進制輸出流,可以回送任意格式數據數據
????public?java.io.PrintWriter?getWriter()?throws?java.io.IOException?//得到一個字符輸出流,可以回送字符數據
### getWriter()和getOutputStream()的區別
getWriter()?用于向客戶機回送字符數據
getOutputStream()?返回的對象,可以回送字符數據,也可以回送字節數據(二進制數據)
OutputStream?os=response.getOutputStream();
os.write("hello,world".getBytes());
PS:通過該方法也能用getOutputStream()回送字符數據
#### 如何選擇
如果是回送字符數據,則使用??PrintWriter對象?,效率高
如果是回送字節數據(binary?date)?,則只能使用?OutputStream
?
#### 注意事項
PrintWriter,OutputStream?這兩個流不能同時使用
比如:
OutputStream?os=response.getOutputStream();
os.write("hello,world".getBytes());
PrintWriter?out=response.getWriter();
out.println("abc");
?
會報錯:
java.lang.IllegalStateException:?getOutputStream()?has?already?been?called?for?this?response
?
#### 不能同時使用PrintWriter和OutputStream的原因

結論:Web服務器在完成一次service之后會自動關閉流,并銷毀當前的request和response對象,故無法同時使用兩個流。
案例:
~~~
package com.pc;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
// 演示下載文件
response.setHeader("Content-Disposition", "attachment; filename=EVO_120G.jpg");
// 打開文件
// 1.獲取到要下載文件的全路徑
String path = this.getServletContext().getRealPath("/EVO_120G.jpg");
// 測試
System.out.println("path=" + path);
// 2.創建文件輸入流
FileInputStream fis = new FileInputStream(new File(path));
// 做一個緩沖字符數組
byte buff[] = new byte[1024];
int length = 0;
// 3.指向response的輸出流
OutputStream os = response.getOutputStream();
// 4.循環讀出
// length表示每次實際讀入的字節數
while((length = fis.read(buff)) != -1){
os.write(buff, 0, length);
}
// 關閉
os.close();
fis.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
~~~
----------參考《韓順平.細說Servlet》