JavaWeb基础--HttpServletResponse
2017-12-11 23:09
525 查看
一.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 ResponseDemo1 extends 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对象的内容转换成响应格式内容,再发送给浏览器解析。 */ } |
新建一个动态web项目——day04,该项目的结构图如下: 设置Location响应头,实现请求重定向 @WebServlet("/ServletDemo1") public class ServletDemo1 extends HttpServlet { // 用location和302实现请求重定向 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302); response.setHeader("location", "/day04/1.html"); } protected void doPost(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 ResponseDemo3
extends 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 } } |
(1)压缩数据的好处: 假设数据有1M,浏览器为了显示这个资源,要从服务器上下载1M的数据,才能打开整个页面,打开速度就慢,你如果一压缩,可能1M的数据只有300K,对浏览器而言,只需要接收300K的数据就可打开整个页面,所以压缩会提供整个页面的访问性能。 为了省钱,因为大型的网站,比如新浪、搜狐这样的门户网站,电信对它们的收费是按照出口流量收费的,出去了多少数据,电信找它们收多少钱,为了省钱,数据在发出去的时候一定要压缩,不压缩就亏大发了。 (2)怎么实现数据的压缩?需要使用GZIPOutputStream流来压缩数据。 @WebServlet("/ServletDemo1") public class ServletDemo1 extends HttpServlet { // 压缩数据输出 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+ "aaaaaa 10fff aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+ "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 void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } } (3)服务器发给浏览器的响应信息如下: 此时Eclipse控制台打印如下信息: |
public class ResponseDemo4 extends 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")); } } |
//1.示例代码 @WebServlet("/ServletDemo1") public class ServletDemo1 extends HttpServlet { //浏览器下载一张图片的基本代码,以后的下载都是在此基础上进行的封装 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Content-Type", "image/jpeg"); // 读取位于项目根目录下的Krystal.jpg这张图片,返回一个输入流 InputStream in = 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 void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } //2.提示:Content-Type头字段对应的值可通过tomcat服务器下conf/web.xml文件查找。 服务器发给浏览器的响应信息如下: ServletDemo1的运行结果如下图所示: 在浏览器中显示出了图片。 |
@WebServlet("/ServletDemo1") public class ServletDemo1 extends HttpServlet { // 定时刷新 protected void doGet(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 void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 在浏览器中访问ServletDemo1就会弹出文件下载框,如下图所示: 可保存到桌面上。 |
相关文章推荐
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletRequest
- JavaWeb基础--HttpServletRequest
- JavaWeb基础--HttpServletRequest
- JavaWeb基础—HttpServletResponse
- JavaWeb基础--HttpServletRequest
- 10006---JavaWeb基础--HttpServletResponse
- JavaWeb基础--HttpServletRequest