# 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的原因
![](https://box.kancloud.cn/2016-02-23_56cbf5ff7730b.jpg)
结论: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》