🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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》