JavaWeb基础--HttpServletResponse
来源:互联网 发布:网络诈骗的危害性 编辑:程序博客网 时间:2024/06/10 05:35
一.HttpServletResponse是什么?
1.HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
2.它也会在重写的doGet和doPost方法中出现:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
二.作用是什么?
可以修改响应信息;
三.request与response
1.Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
2.request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
四.核心API
1.响应行:
response.setStatus() 设置状态码
2.响应头:
response.setHeader("name","value") 设置响应头
3.实体内容:
(PrintWriter)response.getWriter().writer(); 发送字符实体内容
(OutputStream)response.getOutputStream().writer() 发送字节实体内容
4.重定向:
response.sendRedirect();
五.response细节
1.getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
2.getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
3.Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
4.Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
六.基于HttpServletResponse的示例:
1.常用API使用方法
/**
* 设置响应信息
*/
public class ResponseDemo1extends HttpServlet {
/**
* 1)tomcat服务器把请求信息封装到HttpServletRequest对象,且把响应信息封装到HttpServletResponse
* 2)tomcat服务器调用doGet方法,传入request,和response对象
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 3)通过response对象改变响应信息
*/
/**
* 3.1 响应行
*/
//response.setStatus(404);//修改状态码
//response.sendError(404); // 发送404的状态码+404的错误页面
/**
* 3.2 响应头
*/
response.setHeader("server", "JBoss");
/**
* 3.3 实体内容(浏览器直接能够看到的内容就是实体内容)
*/
//response.getWriter().write("01.hello world"); //字符内容。
response.getOutputStream().write("02.hello world".getBytes());//字节内容
}
/**
* 4)tomcat服务器把response对象的内容转换成响应格式内容,再发送给浏览器解析。
*/
}
2.请求重定向
新建一个动态web项目——day04,该项目的结构图如下:
设置Location响应头,实现请求重定向
@WebServlet("/ServletDemo1")
public class ServletDemo1extends HttpServlet {
// 用location和302实现请求重定向
protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setStatus(302);
response.setHeader("location", "/day04/1.html");
}
protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}
当在浏览器中使用URL地址http://localhost:8080/day04/ServletDemo1访问ServletDemo1时,就可以看到服务器作出响应后发送到浏览器的状态码和响应头信息,如下图所示:
服务器返回一个302状态码告诉浏览器,你要的资源我没有,但是我通过Location响应头告诉你哪里有,而浏览器解析响应头Location后知道要跳转到/day04/1.html页面,所以就会自动跳转到1.html,如下图所示:
3.定时刷新
public class ResponseDemo3extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 定时刷新
* 原理:浏览器认识refresh头,得到refresh头之后重新请求当前资源
*/
//response.setHeader("refresh", "1"); //每隔1秒刷新次页面
/**
* 隔n秒之后跳转另外的资源
*/
response.setHeader("refresh", "3;url=/day09/adv.html");//隔3秒之后跳转到adv.html
}
}
4.设置Content-Encoding响应头,告诉浏览器数据的压缩格式
(1)压缩数据的好处:
- 假设数据有1M,浏览器为了显示这个资源,要从服务器上下载1M的数据,才能打开整个页面,打开速度就慢,你如果一压缩,可能1M的数据只有300K,对浏览器而言,只需要接收300K的数据就可打开整个页面,所以压缩会提供整个页面的访问性能。
- 为了省钱,因为大型的网站,比如新浪、搜狐这样的门户网站,电信对它们的收费是按照出口流量收费的,出去了多少数据,电信找它们收多少钱,为了省钱,数据在发出去的时候一定要压缩,不压缩就亏大发了。
(2)怎么实现数据的压缩?需要使用GZIPOutputStream流来压缩数据。
@WebServlet("/ServletDemo1")
public class ServletDemo1extends HttpServlet {
// 压缩数据输出
protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
System.out.println("原始数据大小:"+data.getBytes().length);
ByteArrayOutputStream bout =new ByteArrayOutputStream();
GZIPOutputStream gout =new GZIPOutputStream(bout);
gout.write(data.getBytes());
/*
* GZIPOutputStream:包装流,一般都会有一个缓冲,
* 如果调用其write()方法在写数据时,
* 如果数据量没有把包装流的缓冲写满,它是不会往底层流写的。
*/
gout.close(); // 一定要有
// 得到压缩后的数据
byte[] gzip = bout.toByteArray();
System.out.println("压缩后的数据大小:"+gzip.length);
/*
* 将压缩数据发送给浏览器
*/
// 通知浏览器数据采用压缩格式
response.setHeader("Content-Encoding", "gzip");
// 告诉浏览器回送的压缩数据的长度
response.setHeader("Content-Length", gzip.length+"");
response.getOutputStream().write(gzip);
}
protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request,response);
}
}
(3)服务器发给浏览器的响应信息如下:
此时Eclipse控制台打印如下信息:
5.content-Type作用:引出-->:ContentType,乱码问题:中文乱码问题
public class ResponseDemo4extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应实体内容编码
//response.setCharacterEncoding("utf-8");
/**
* 1. 服务器发送给浏览器的数据类型和内容编码
* 浏览器会根据此方法,来解析传递来的参数
*/
//response.setHeader("content-type", "text/html");
response.setContentType("text/html;charset=utf-8");//和上面代码等价。推荐使用此方法
//setContentType的不同参数
//response.setContentType("text/xml");
//response.setContentType("image/jpg");
//发送字符串
//response.getWriter().write("<html><head><title>this is tilte</title></head><body>中国</body></html>");
//发送字节数组,并设置转码
response.getOutputStream().write("<html><head><title>this is tilte</title></head><body>中国</body></html>".getBytes("utf-8"));
}
}
6.设置content-type响应头,控制浏览器以图片方式处理数据
//1.示例代码
@WebServlet("/ServletDemo1")
public class ServletDemo1extends HttpServlet {
//浏览器下载一张图片的基本代码,以后的下载都是在此基础上进行的封装
protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setHeader("Content-Type", "image/jpeg");
// 读取位于项目根目录下的Krystal.jpg这张图片,返回一个输入流
InputStreamin = this.getServletContext().getResourceAsStream("/Krystal.jpg");
int len = 0;
byte[] buffer =new byte[1024];
OutputStream out = response.getOutputStream();
while((len=in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
}
protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}
//2.提示:Content-Type头字段对应的值可通过tomcat服务器下conf/web.xml文件查找。
服务器发给浏览器的响应信息如下:
ServletDemo1的运行结果如下图所示:
在浏览器中显示出了图片。
7.设置content-disposition响应头,让浏览器下载文件
@WebServlet("/ServletDemo1")
public class ServletDemo1extends HttpServlet {
// 定时刷新
protected voiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setHeader("Content-Disposition", "attachment;filename=Krystal.jpg");
InputStream in = this.getServletContext().getResourceAsStream("/Krystal(4).jpg");
int len = 0;
byte[] buffer =new byte[1024];
OutputStream out = response.getOutputStream();
while((len=in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
}
protected voiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doGet(request, response);
}
}
在浏览器中访问ServletDemo1就会弹出文件下载框,如下图所示:
可保存到桌面上。
- 10006---JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb 之 HttpServletResponse
- JavaWeb-HttpServletResponse、HttpServletRequest
- JavaWeb:HttpServletResponse和HttpServletRequest
- JavaWeb ( HttpServletRequest,HttpServletResponse)
- javaWeb之HttpServletResponse
- JavaWeb HttpServletRequest&HttpServletResponse小记
- JavaWeb 之 HttpServletResponse
- javaweb之HttpServletResponse响应头
- JavaWeb学习心得之HttpServletResponse对象
- HttpServletResponse&&HttpServletRequest基础
- 深入分析JavaWeb Item7 -- HttpServletResponse详解
- 深入分析JavaWeb Item8 -- HttpServletResponse常见应用
- 深入分析JavaWeb 7 -- HttpServletResponse详解
- javaweb学习总结——HttpServletResponse对象
- 深入分析JavaWeb 8 -- HttpServletResponse常见应用
- JavaWeb开发之五:HttpServletResponse对象
- 强大的Python
- CNN卷积神经网络实现验证码识别(准确率达99%)
- 设计模式(五)观察者模式
- idea中flex与java的交互
- JNA调用C++的相关点总结
- JavaWeb基础--HttpServletResponse
- 真实经历“grub2安装错误”
- Python3.6.3 程序.exe格式打包发布
- 使用HttpServletResponse提供文件下载
- PHP目前比较常见的五大运行模式
- Java开发微信公众号
- python一个精简的ORM框架(廖老师的python教程)理解
- 23种设计模式之-----适配器模式(Adapter Pattern)
- JavaWeb基础--HttpServletRequest