一、定义

  HttpServletResponse对象代表服务端的响应,通过这个对象提供的方法,可以向客户机输出数据。

二、常用方法

  在JavaWeb开发中,只要是写URL地址,那么建议最好以" "开头,也就是使用绝对路径的方式,如果"/"是给服务器用的,则代表当前的web工程,如果"/"是给浏览器用的,则代表webapps目录。

  也可以使用request.getContextPath()来代替" /项目名称 "的方式,这样更加灵活。

  1.     /**
  2. * 1.向客户端(浏览器)发送数据
  3. * 原理:Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
  4. * PS:getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
  5. * PS:Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
  6. */
  7. OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流(输出二进制数据
  8. PrintWriter out = response.getWriter();//获取PrintWriter输出流(输出文本数据
  9.  
  10. /**
  11. * 2.设置响应头相关(设置响应头可以控制浏览器的行为)
  12. */
  13. response.setCharacterEncoding("UTF-8");//设置将数据以"UTF-8"编码输出到客户端浏览器
  14. response.setHeader("content-type", "text/html;charset=UTF-8");//控制浏览器以UTF-8的编码显示数据
  15. response.setStatus(HttpServletResponse.SC_OK);//设置响应码
  16. response.setHeader("refresh", "5");//控制浏览器每隔5秒钟刷新一次
  17. response.setContentType("image/jpeg");//告诉浏览器以该类型处理数据(控制浏览器以图片的方式打开)
  18. response.setDateHeader("expries", -1);//控制浏览器不缓存数据
  19. response.setHeader("Cache-Control", "no-cache");//控制浏览器不缓存数据
  20. response.setHeader("Pragma", "no-cache");//控制浏览器不缓存数据
  21.  
  22. /**
  23. * 3.重定向
  24. */
  25. //法1:调用sendRedirect()方法
  26. response.sendRedirect("重定向地址");//重定向(内部的实现原理:使用response设置302状态码和设置location响应头实现重定向)
  27. //法2:设置响应头的Location属性和Status状态码
  28. response.setHeader("Location", "跳转地址");//设置跳转地址
  29. response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);

三、字符解析详解(中文乱码的问题)

  1. /**
  2. * 服务器响应(中文乱码问题)
  3. * PS:在开发过程中,如果希望服务器输出什么浏览器就能看到什么,那么在服务器端都要以字符串的形式进行输出(无论输出的是字符还是数字)。
  4. */
  5. public class ResponseDemo extends HttpServlet {
  6.  
  7. /**
  8. * 输出中文
  9. *
  10. * @param response
  11. * @throws IOException
  12. */
  13. public void outputChinese(HttpServletResponse response) throws IOException {
  14.  
  15. String data = "中国";
  16.  
  17. /**
  18. * 1.使用OutputStream流向客户端浏览器输出中文数据
  19. * PS:服务器端可以通过设置响应头控制浏览器的行为
  20. * 例:设置响应头控制浏览器以UTF-8的编码显示数据:response.setHeader("content-type", "text/html;charset=UTF-8");
  21. */
  22. byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换(将字符转换成字节数组的过程,这个过程中一定会去查码表,如果是中文的操作系统环境,默认就是查找查GB2312的码表)
  23. OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
  24. response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
  25. outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组
  26.  
  27. /**
  28. * 2.使用PrintWriter流向客户端浏览器输出中文数据
  29. * PS:当需要向浏览器输出字符数据时,使用PrintWriter比较方便,省去了将字符转换成字节数组那一步。
  30. */
  31. response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
  32. PrintWriter out = response.getWriter();//获取PrintWriter输出流(PS:这句代码必须放在response.setCharacterEncoding("UTF-8");之后,否则response.setCharacterEncoding("UTF-8")这行代码的设置将无效,浏览器显示的时候还是乱码)
  33. response.setHeader("content-type", "text/html;charset=UTF-8");//设置响应头,控制浏览器以指定的字符编码编码进行显示
  34. out.write(data);//使用PrintWriter流向客户端输出字符
  35. }
  36.  
  37. }

四、文件下载

  编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

  1.   /**
  2. * 下载文件,通过OutputStream流
  3. * @param response
  4. * @throws FileNotFoundException
  5. * @throws IOException
  6. */
  7. private void downloadFileByOutputStream(HttpServletResponse response)
  8. throws FileNotFoundException, IOException {
  9. //1.获取要下载的文件的绝对路径
  10. String realPath = this.getServletContext().getRealPath("/download/1.JPG");
  11. //2.获取要下载的文件名
  12. String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
  13. //3.设置content-disposition响应头控制浏览器以下载的形式打开文件(PS:中文文件名的情况要使用URLEncoder.encode方法进行编码:response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));)
  14. response.setHeader("content-disposition", "attachment;filename="+fileName);
  15. //4.获取要下载的文件输入流
  16. InputStream in = new FileInputStream(realPath);
  17. int len = 0;
  18. //5.创建数据缓冲区(一次读取1024个字节)
  19. byte[] buffer = new byte[1024];
  20. //6.通过response对象获取OutputStream流
  21. OutputStream out = response.getOutputStream();
  22. //7.将FileInputStream流写入到buffer缓冲区
  23. while ((len = in.read(buffer)) > 0) {
  24. //8.使用OutputStream将缓冲区的数据输出到客户端浏览器
  25. out.write(buffer,0,len);
  26. }
  27. in.close();
  28. }

Java Web学习(七)HttpServletResponse(客户端响应)的更多相关文章

  1. Java Web学习(1): 客户端请求、服务器响应及其HTTP状态码

    一JSP客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信 息头的一部分来传送的.我们可以查阅HTTP协议来获得更多的信息. 下表列出了浏 ...

  2. java web 学习七(HttpServletResponse对象1)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  3. Java Web 学习笔记 1

    Java Web 学习笔记 1 一.Web开发基础 1-1 Java Web 应用开发概述 1.1.1 C/S C/S(Client/Server)服务器通常采用高性能的PC机或工作站,并采用大型数据 ...

  4. Java Web学习笔记之---JSP

    Java Web学习笔记之---JSP (一)JSP常用语法 (1)HTML注释 <!--所要注释的内容 --> 在客户端显示一个注释. (2)隐藏注释 <%--所要注释的内容--% ...

  5. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  6. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  7. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. java web 学习笔记 编码问题总结

       java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...

  9. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  10. Java Web学习笔记之---EL和JSTL

    Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression  Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...

随机推荐

  1. Public-Key Cryptosystems Based on Composite Degree Residuosity Classes

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. 论文未全部翻译 Abstract. 本文研究了一个新的计算问题,即合数剩余阶问题(Com ...

  2. Flink启动脚本改造--制作适用于CDH的Flink parcel包

    #!/usr/bin/env bash ################################################################################ ...

  3. SpringBoot系列——MyBatis-Plus整合封装

    前言 MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发.提高效率,但我们并没有直接使用MP的CRUD接口,而是在原来的基础上封装一层通用代码,单表继承我们的通用代码,实现 ...

  4. vscode 安装go插件失败后,最简单的方法

    vscode 安装go插件 参考: https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md https://goproxy. ...

  5. Spring 的Controller 是单例or多例

    Spring 的Controller 是单例or多例 你什么也不肯放弃,又得到了什么? 背景:今天写代码遇到一个Controller 中的线程安全问题,那么Spring 的Controller 是单例 ...

  6. js大数字转换,将大额数字转换为万、千万、亿等

    代码 /** * 大数字转换,将大额数字转换为万.千万.亿等 * @param value 数字值 */ export function bigNumberTransform (value) { co ...

  7. Vue 开发技巧总结

    ​博客地址:https://ainyi.com/95 本人玩了 Vue 两年多,在此总结一下开发时的一些技巧和方法 自定义组件 v-model v-model 是 Vue 提供的一个语法糖,它本质上是 ...

  8. FormData格式的数据

    向服务器提交的是FormData格式的数据 || 必须添加以下两个配置项 contentType:false, processData:false,

  9. Python发送get、post请求

    import json import requests #获取北京天气 # #url= "https://wis.qq.com/weather/common?source=xw&we ...

  10. 接口测试中GET方法的获取

    今天在这里给大家介绍一下get方法,其实这些方法大家可以看一下源码里面的介绍只需要在代码中输入: import requests help(requests) 就可以看到带有示例的解释: 现在我们来完 ...