response的一些笔记

本文详细阐述了HTTP响应对象的几种常见应用,包括数据输出、文件下载、定时刷新页面、控制浏览器缓存以及请求重定向。通过设置响应编码、使用输出流与设置HTTP头等方式实现不同的功能。

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

web服务器针对客户端的每次Http请求,会创建一个代表请求的request和代表响应的response,如此我们如果想得到客户端提交的数据,只要找request对象,而想要向客户端输出数据,只要找response对象。response的一些方法看一看API就知道,一直听着这样的话,学java,要有面向对象的思想,并要联系生活,不需要记各个方法,只需要记一个个对象,并理解这些对象,那么在联想什么样的对象应该具有什么方法就行。另外,学习新的知识,就是学习它的API,所以要经常翻API,如果搞清楚了API,也就理解了这个技术。
下面是一些response的常见应用。
(1)向客户端输出数据。
response得到输出流有两种,一种字节流OutputStream,一种字符流PrintWriter。字节流什么数据都能输出,而字符流只能输出字符串。
数据输出最需要注意的问题就是乱码问题,因为各个编码表编码方式不一样,如果服务器和客户机采取的编码表不一致,就很容易出现乱码。所以要在数据输出前告诉客户机打开数据应该采用的编码表。
	  //设置response编码码表
response.setCharacterEncoding("UTF-8");
//设置浏览器打开编码码表方法一
response.setHeader("content-type", "text/html;charset=UTF-8");
//设置浏览器打开编码码表方法二
response.setContentType("text/html;charset=UTF-8");
//设置浏览器打开编码码表方法三
response.getWriter().write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>");

(2)文件下载。
   //得到资源在硬盘的绝对地址
String path=this.getServletContext().getRealPath("/download/qq.jpg");
//得到文件的名称
String name=path.substring(path.lastIndexOf("\\")+1);
//设置浏览器以下载方式打开
response.setHeader("content-disposition", "attachment;filename="+name);
InputStream ins=null;
OutputStream ous=null;
try{
ins=new FileInputStream(path);
int len=0;
byte[] buffer=new byte[1024];
ous=response.getOutputStream();
while((len=ins.read(buffer))>0){
ous.write(buffer,0,len);
}
}finally{
if(ins!=null){
try{
ins.close();
}catch(Exception e){
e.printStackTrace();
}
}
}

此处,如果文件名为中文,也会出现问题,下载文件名将会消失。需要在文件名使用前加上一行代码,将文件名进行URL编码。
	String name1=URLEncoder.encode(name, "UTF-8");

(3)发送http头控制定时刷新页面。
这也是web开发中经常使用的,比如注册或登陆成功后会出现一个消息提示页面,并在3秒后自动跳转。

response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
response.setHeader("refresh", "3;url='/Test/index.jsp'");
writer.write("恭喜您登陆成功,页面将于3秒后自动跳转到首页,如果没有跳转,<a href='/Test/index.jsp'>请点击这里</a>");

(4)发送http头控制浏览器禁止缓存当前文档内容。
有时要让浏览器不缓存文档内容,比如随机图片(验证码)。
//控制所有浏览器不要缓存
response.setDateHeader("expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");

当然也可以控制缓存时间。
//注意此处时间单位毫秒,并要加上当前时间
response.setDateHeader("expires", System.currentTimeMillis()+1000*3600);

(5)请求重定向。
web资源受到客户机的请求后,通知客户机去访问另一个文web资源,即为请求重定向。此处初学时容易和request的请求转发混淆,并且不能很清楚什么时候用什么方式。请求重定向一个特点就是浏览器的地址栏地址会发生变化,也就是浏览器实际发出了两次访问请求,以此,比如在用户登陆后,显示登陆成功消息后,就要用请求重定向,这样用户体验感更好。实现代码。
 response.sendRedirect("/Test/index.jsp");


另外还有一些细节:(1)getOutputStream()和getWriter()方法互斥,调用其中之一后就不能再使用另一个,开发中要注意。(2)servlet向ServletOutputStream或PrintWriter对象中写入的数据将会被servlet引擎从response中获取,并将其作为响应消息的正文,与响应状态码和个响应头组合后输出给客户端。(3)servlet调用完service方法后会检查ServletOutputStream或PrintWriter对象是否已经调用close方法,如果没有,servlet引擎将调用close方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值