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(); ...

HttpServletResponse

服务器端servlet程序中service()对客户端浏览器向web服务器发送的请求产生应答信息进行处理 HttpServletRequest对象——封装请求对象 (1)       请求行:请求...
  • w_l_j
  • w_l_j
  • 2011年10月21日 15:13
  • 9986

getOutputStream()异常的原因和解决方法

 getOutputStream()异常的原因和解决方法tomcat5下jsp出现getOutputStream() has already been called for this response...

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

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

java httpServletResponse返回流进行 下载

一、返回response流下载 response.setContentType("application/octet-stream"); response.setHeader("Content-dis...

【Servlet】把文件写到Respond输出流里面供用户下载

本文区分于《【Jsp】把Java写到Respond输出流里面供用户下载》(点击打开链接)把原本该打印到控制台的内容,直接打印到一个文本文件txt中给用户下载。 实际上是《【Struts2】中文文件的...

数独游戏-安卓版源代码和分析。

1.在创建的项目中,主要有以下类,其中, Game.java 是数独游戏的算法: keydialog:主要控制数据九宫格的显示和操作 MainActivity:主要加载主页面,代码只需改动一个setc...

java动态编程-操作字节码

若想在运行时,动态编辑和创建类,通常有俩种方法 1.动态编译一个类,动态编译可以参考http://blog.csdn.net/yingxiake/article/details/51487730还有...

---servlet(三)HttpServletResponse对象和 HttpServletRequest对象

servlet总结四web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。request和response对象既然代表请...

servlet学习三--HttpServletResponse对象学习

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。 request和response对象即然代表请求和响应,那我们...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Servlet--HttpServletResponse的2个操作流的方法
举报原因:
原因补充:

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