HttpServletResponse是用于将Servlet处理好的内容发送给浏览器的类,服务器通过对HttpServletResponse对象中的内容进行截取、拼接就能获得一个完整的HTTP响应信息。
参考文档: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() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)
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
结论: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》