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

前面已经说过无数多次了,我们的项目都是基于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次再去获得这个流来操作了。当然这里我们也可以自己来将输出流关闭,不过即使我们不关闭,引擎也会自动帮我关闭了。




转载于:https://www.cnblogs.com/LinkinPark/p/5233000.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用ServletResponse对象来直接返回一个文件并在浏览器上显示。以下是一个简单的示例代码: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取文件路径 String filePath = "/path/to/your/file.pdf"; // 替换为您的文件路径 // 设置响应的内容类型 response.setContentType("application/pdf"); // 设置响应的头信息,指定文件名 response.setHeader("Content-Disposition", "inline; filename=file.pdf"); // 读取文件并写入响应输出 try (InputStream inputStream = new FileInputStream(filePath); OutputStream outputStream = response.getOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } } ``` 在上述示例中,`doGet`方法用于处理HTTP GET请求。首先,您需要设置正确的文件路径,将其替换为您的实际文件路径。然后,通过调用`setContentType`方法设置响应的内容类型,这里使用`application/pdf`表示PDF文件。接下来,通过调用`setHeader`方法设置响应的头信息,其中`Content-Disposition`指定文件名为`file.pdf`,并将`inline`作为参数表示在浏览器上直接显示。最后,通过读取文件并将其写入响应的输出,实现将文件内容返回给浏览器。 请注意,上述代码中使用了try-with-resources语句,以确保在完成操作后正确关闭输入和输出。此外,还应该处理可能发生的异常情况,例如文件不存在或读取失败等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值