Servlet--HttpServletResponse的2个操作流的方法

原创 2015年07月10日 16:43:03
前面已经说过无数多次了,我们的项目都是基于HTTP协议的一次请求,一次响应。实际编码中,我们在处理完逻辑后一般是跳转到一个页面上,或者用输出流返回json字符串。其实跳转到一个页面往往也就是JSP,JSP运行在tomcat里面编译处理后返回响应,最后一步都是通过response获得输出流来返回到浏览器。这里总结下response的2个输出流。
  • 首先我们翻下API:
public ServletOutputStream getOutputStream() throws IOException;
返回一个记录二进制的响应数据的输出流。
注意:如果这个响应对象已经调用getWriter,将会抛出IllegalStateException。
public PrintWriter getWriter() throws IOException;
这个方法返回一个PringWriter对象用来记录格式化的响应实体。如果要反映使用的字符编码,必须修改响应的MIME类型。
注意:在调用这个方法之前,必须设定响应的content类型。如果没有提供这样的编码类型,会抛出一个UnsupportedEncodingException,如果这个响应对象已调用getOutputStream,会抛出一个getOutputStream。

  • 对比上面的2个方法我们来整理一下:
1,getWriter()用于向客户机回送字符数据
2,getOutputStream()用于向客户机回送字符数据,也可以回送字节数据

  • 那么我们应该怎么选择这2种输出流呢?
如果我们回送字符数据,就用getWriter,效率高
如果我们回送的是字节数据,也就只能用getOutputStream了。


上面API上已经说的很明白,这2个方法不能同时使用,看下面的代码:
package linkin;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author LinkinPark
 * @author 2015-7-10
 * @Descri HttpServletResponse的2个输出流
 */
public class LinkinServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		//resp.setContentType("text/html;charset=UTF-8");
		resp.getWriter().write("林肯公园");
		resp.getOutputStream().write("林肯公园".getBytes());
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		this.doGet(req, resp);
	}
	
}

我们现在访问下:http://localhost:8080/linkin/LinkinServlet结果报错了,报错说:

getWriter() has already been called for this response

什么意思呢?就是说上面第一次使用流返回响应已经将这个流关闭了,这个是Servlet引擎自动帮我们做的,所以就不能第2次再去获得这个流来操作了。当然这里我们也可以自己来将输出流关闭,不过即使我们不关闭,引擎也会自动帮我关闭了。




版权声明:本文为博主原创文章,欢迎大家转载。如有错误请多多指教。

HttpServletResponse的getWriter()和getOutputStream()以及sendRedirect()方法

HttpServletResponse: 注明: 1.HttpServletResponse实例对象获得输出流有两种方式 ①PrintWriter out=response.getWriter(); ...
  • nihaowoshiyudong
  • nihaowoshiyudong
  • 2016年12月04日 19:31
  • 5164

Servlet技术浅析(四)之-----ServletResponse接口和HttpServletResponse接口

ServletResponse接口 在Servlet接口的service(ServletReuqest req , ServletResponse res)方法中有一个ServletResponse类...
  • u011159417
  • u011159417
  • 2017年01月04日 18:07
  • 892

response细节--重定向的用处和getWrite/getOutputStream的用法冲突问题

1.重定向的实现: //和下句代码可互换位置,此两行相当于response.sendRedirect(""); response.setStatus(302); //或者"locat...
  • xh16319
  • xh16319
  • 2012年12月28日 23:38
  • 24540

在servlet中 PrintWriter out=response.getWriter()

1,从HttpServletResponse中get一个PrintWriter;, 2,打个通俗的比方就是通过HttpServletResponse对象得到一支笔,然后就可以用out.print()...
  • qq_21371027
  • qq_21371027
  • 2015年07月21日 16:51
  • 1372

servletResponse写入数据的方法

javax.servlet.http.HttpResponse类用于产生返回页面 通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStr...
  • M4A1CHENG
  • M4A1CHENG
  • 2016年04月01日 13:56
  • 1855

过滤器通过HttpServletResponseWrapper包装HttpServletResponse实现获取response中的返回数据,以及对数据进行gzip压缩

前几天我们项目总监给了我一个任务,就是将请求的接口数据进行压缩,以达到节省流量的目的。对于实现该功能,有以下思路:1.获取到response中的值, 2.对数据进行gzip压缩(因为要求前端不变,所...
  • qq_33206732
  • qq_33206732
  • 2017年11月24日 11:47
  • 473

HttpServletResponse对象实现文件下载

文件下载在我们的项目中是很常见的需求,实现文件下载功能的方式有很多,spring-mvc框架也提供了文件下载的功能。我们本次探讨的功能是利用HttpServletResponse对象来实现文件下载的功...
  • Berey_diligent
  • Berey_diligent
  • 2017年02月15日 10:07
  • 1076

servlet返回数据的方法

servlet返回数据的方法方法 RequestDispatcher.forward()界面跳转 HttpSession session =request.getSession(); ...
  • java_trainee
  • java_trainee
  • 2017年12月13日 09:37
  • 358

在servlet中用outputStream输出数据的问题,以及输出中文的问题

在servlet中用outputStream输出数据的问题,以及输出中文的问题
  • cckevincyh
  • cckevincyh
  • 2016年09月09日 15:14
  • 4199

HttpServletrequest 与HttpServletResponse总结

如果说DOM是javascript与HTML的桥梁,那么servlet就是前端与后端的桥梁,HttpServletRequest和HttpServletResponse就是之间的信使,好了,废话不多说...
  • qq877507054
  • qq877507054
  • 2016年05月13日 15:36
  • 8315
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Servlet--HttpServletResponse的2个操作流的方法
举报原因:
原因补充:

(最多只允许输入30个字)