HttpServletReponse创建响应正文

该博客探讨了如何利用HttpServletReponse的getOutputStream和getWriter方法来创建响应正文。通过实例展示了如何在网页中显示已浏览次数,例如通过<img>标签加载计数图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

getOutputStream与getWriter方法

getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。
getWriter方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。
getOutputStreamgetWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 
getOutputStream方法返回的字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。
getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返回,PrintWriter对象可以直接输出字符文本内容。
Servlet程序向ServletOutputStreamPrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
Serlvetservice方法结束后,Servlet引擎将检查getWritergetOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。    
选择getOutputStream和getWriter方法的要点

PrintWriter对象输出字符文本内容时,它内部还是将字符串转换成了某种字符集编码的字节数组后再进行输出,使用PrintWriter对象的好处就是不用编程人员自己来完成字符串到字节数组的转换。
使用ServletOutputStream对象也能输出内容全为文本字符的网页文档,但是,如果网页文档内容是在Servlet程序内部使用文本字符串动态拼凑和创建出来的,则需要先将字符文本转换成字节数组后输出。
如果一个网页文档内容全部为字符文本,但是这些内容可以直接从一个字节输入流中读取出来,然后再原封不动地输出到客户端,那么就应该使用ServletOutputStream对象直接进行输出,而不要使用PrintWriter对象进行输出。     
输出缓冲区

Servlet程序输出的HTTP消息的响应正文首先被写入到Servlet引擎提供的一个输出缓冲区中,直到输出缓冲区被填满或者Servlet程序已经写入了所有的响应内容,缓冲区中的内容才会被Servlet引擎发送到客户端。
使用输出缓冲区后,Servlet引擎就可以将响应状态行、各响应头和响应正文严格按照HTTP消息的位置顺序进行调整后再输出到客户端。
如果在提交响应到客户端时,输出缓冲区中已经装入了所有的响应内容,Servlet引擎将计算响应正文部分的大小并自动设置Content-Length头字段。
如果在提交响应到客户端时,输出缓冲区中装入的内容只是全部响应内容的一部分,Servlet引擎将使用HTTP 1.1chunked编码方式(通过设置Transfer-Encoding头字段来指定)传输响应内容。
输出缓冲区à有关方法

setBufferSize方法
getBufferSize方法
flushBuffer方法
reset方法
isCommitted方法 
如何实现动态文件内容的下载

需要通过HttpServletResponse.setContentType方法设置Content-Type头字段的值为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如,“application/octet-stream”或“application/x-msdownload”等。
需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为“attachment; filename =文件名”。
应该调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入附件文件内容,而不应使用HttpServletResponse.getWriter方法返回的PrintWriter对象。 
图像访问计数器à介绍

网页每次被访问时,页面的访问次数都要发生改变,所以这个功能必须通过服务器端的程序来实现。
一些WEB站点只能输出静态页面内容,没有开放运行服务器端程序的功能,无法直接在这些只支持静态内容的WEB站点上编写服务器端程序来实现页面访问次数的统计和显示功能。 
一些具有执行服务器端程序功能的WEB站点推出了免费的页面访问计数器,只要在位于任何站点的一个静态HTML页面中增加一条该站点提供的HTML语句,该语句就能显示出该静态页面的访问次数。
一个站点要想能统计另外一个站点上的某个HTML页面的访问次数,必须让任何一个浏览器在每次访问那个HTML页面都通知这个一下站点,这可以通过在静态HTML页面中增加两种特殊的标签来实现:<img>标签和设置src属性的<script>标签。  
<img>标签的三个重要特性

一个包含有图像的网页文件中并没有包含真正的图像数据内容,而只是使用<img>标签指明了图像的URL地址。

  举例:本网页已被浏览了<img src="count.gif ">

<img>标签的src属性也可以指向当前页面所在WEB服务器之外的其他WEB服务器上的图像文件。
浏览器并不关心<img>标签所需的图像数据在服务器端是如何产生,它只知道去访问src属性指定的URL资源,并把服务器返回的数据当作一个图像的内容来显示。服务器返回的图像数据可以直接从一个静态图像文件中读取,也可以通过Servlet程序在内存中动态创建。 
页面访问计数器的技术实现细节

Servlet程序输出的图像格式为jpeg,它应告诉浏览器其所输出的实体内容的MIME类型为image/jpeg
因为图像是二进制数据,所以应该调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入图像数据。
java.awt.image.BufferedImage类用于在内存中创建一幅图像,具体的图像内容则可以通过调用其图形上下文对象(java.awt.Graphics)的各种绘图方法生成。
在内存图像中绘制访问次数时,必须限定显示的位数,如果访问次数超过七位,则用数字9999999显示,如果访问次数不足七位,则在前面补充相应个数的0
每个引用该Servlet程序的静态页面的URL都对应一个各自的访问次数,每个URL及其访问次数需要使用数据库系统来进行存储,对于简单的实验,也可以采用一个属性文件来进行存储。当前引用页面的URL可以通过Referer请求头获取。
JDK中提供了一个javax.imageio.ImageIO类,它的write方法可以将BufferedImage对象中的图像编码成jpeg格式的图像数据后写入到一个OutputStream流对象中。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值