Java Web学习总结(4)HttpServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。获取网页提交过来的数据,只需要找request对象就行了。要向网页输出数据,只需要找response对象。
一,HttpServletResponse对象介绍
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
二,HttpServletResponse对象常用方法
1,负责向客户端(浏览器)发送数据的相关方法
getOutputStream() |
该方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。 |
getWriter() |
该方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。 |
注意:
1,getOutputStream()和getWriter()这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
2,getOutputStream()返回的字节输出流对象,类型为:ServletOutputStream,直接输出字节数组中的二进制数据。
3,getWriter()方法将Servlet引擎的数据缓冲区包装成P:rintWriter类型的字符输出流对象后返回,PrintWriter对象只能输出字符文本内容。
2,负责向客户端(浏览器)发送响应头的相关方法
addDateHeader(String name ,long date) |
该方法是设置只有一个值且值的类型为long类型的响应头,例如expies响应头,表示过期时间 |
addHeader(String name,String value) |
该方法是设置有多个值的响应头,参数name表示响应头名称,参数value表示响应头的值 |
addIntHeader(String name,int value) |
该方法是设置有多个值且值的类型为int类型的响应头 |
setHeader(String name,String value) |
该方法是设置只有一个值的响应头,参数name表示响应头名称,参数value表示响应头的值 |
setDateHeader(String name,long value) |
该方法是设置只有一个值且值的类型为long类型的响应头,例如expies响应头,表示过期时间 |
setIntHeader(String name,int value) |
该方法是设置只有一个值且值的类型为int类型的响应头,例如Content-Length响应头,该响应头是代表响应内容有多少字节数 |
//设置Content-Type响应头
resp.setHeader("Content-Type","text/html;charset=utf-8");
//添加一个响应头:xxx是表示某一响应头
resp.addHeader("xxx", "123");
//通知客户端响应内容长度为888个字节
resp.setIntHeader("Context-Length", 5);
//设置过期时间为:5000毫秒
resp.setDateHeader("", 5000);
3,负责向客户端(浏览器)发送响应状态码的相关方法
setStatus(int value) |
设置临时定向响应码 |
4,响应状态码的常量
HttpServletResponse定义了很多状态码的常量(具体可以查看Servlet的API),当需要向客户端发送响应状态码时,可以使用这些常量,避免了直接写数字,常见的状态码对应的常量:
SC_NOT_FOUND |
状态码404对应的常量 |
SC_OK |
状态码200对应的常量 |
SC_INIERNAL_SERVER_ERROR |
状态码500对应的常量 |
三,HttpServletResponse对象常见应用
1,向客户端浏览器输出数据
例子1:使用OutputStream流向客户端浏览器输出数据
public class HelloResponse extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置Content-Type响应头,编码格式为UTF-8
resp.setHeader("Content-Type","text/html;charset=utf-8");
outPutOutputStream(resp);
}
/**
*
* @方法名: outPutOutputStream
* @描述: 使用OutputStream输出流输出数据
* @param resp
* @throws IOException
* @创建人 zender
*/
private void outPutOutputStream(HttpServletResponse resp) throws IOException{
String data = "输出的内容";
//获取OutputStream输出流
OutputStream outputStream = resp.getOutputStream();
//将字符转换成字节数组,指定以UTF-8编码进行转换
byte[] dataByteArr = data.getBytes("UTF-8");
//使用OutputStream流向客户端输出字节数组
outputStream.write(dataByteArr);
}
}
运行结果如下:
例子2:使用PrintWriter流向客户端浏览器输出数据
public class PrintWriterResponse extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
resp.setHeader("content-type", "text/html;charset=UTF-8");
outPutPrintWriter(resp);
}
/**
*
* @方法名: outPutPrintWriter
* @描述: 使用PrintWriter输出流输出数据
* @param resp
* @throws IOException
* @创建人 zender
*/
private void outPutPrintWriter(HttpServletResponse resp) throws IOException{
String data = "输出的内容";
//获取PrintWriter输出流
PrintWriter out = resp.getWriter();
//使用PrintWriter流向客户端输出字符
out.write(data);
}
}
运行结果如下:
注意:
1,在获取PrintWriter输出流之前首先使用"response.setCharacterEncoding(charset)"设置字符以什么样的编码输出到浏览器,再使用response.getWriter();获取PrintWriter输出流,这两个步骤不能颠倒。
2,在开发过程中,如果希望服务器输出什么浏览器就能看到什么,那么在服务器端都要以字符串的形式进行输出。
2,文件下载
文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载。
文件下载功能的实现思路:
1,获取要下载的文件的绝对路径
2,获取要下载的文件名
3,设置content-disposition响应头控制浏览器以下载的形式打开文件
4,获取要下载的文件输入流
5,创建数据缓冲区
6,通过response对象获取OutputStream流
7,将FileInputStream流写入到buffer缓冲区
8,使用OutputStream将缓冲区的数据输出到客户端浏览器
public class FileDownloadResponse extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取要下载的文件的绝对路径
String realPath = this.getServletContext().getRealPath("/下载.png");
//获取要下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//设置content-disposition响应头控制浏览器以下载的形式打开文件
//中文文件名要使用URLEncoder.encode方法进行编码,否则会出现文件名乱码
resp.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//获取文件输入流
InputStream in = new FileInputStream(realPath);
int len = 0;
byte[] buffer = new byte[1024];
OutputStream out = resp.getOutputStream();
while ((len = in.read(buffer)) > 0) {
out.write(buffer,0,len);//将缓冲区的数据输出到客户端浏览器
}
in.close();
out.close();
}
}
注意:
推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。
4,设置响应头控制浏览器的行为
1,定时刷新页面
response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次 |
2,禁止缓存当前文档内容
response.setDateHeader("expries", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); |
3,重定向
什么是重定向:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。
例如:
public class RedirectResponse extends HttpServlet{
private static final long serialVersionUID = 3903946972744326948L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//endRedirect方法实现请求重定向
resp.sendRedirect(req.getContextPath() + "/index.jsp");
}
}
访问:http://localhost:8081/ServletDemo/RedirectResponse.html,浏览器会跳转到:http://localhost:8081/ServletDemo/index.jsp
Java Web学习总结(4)HttpServletResponse的更多相关文章
- java web学习总结(八) -------------------HttpServletResponse对象(二)
一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类,
- java web学习总结(七) -------------------HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- java web 学习八(HttpServletResponse对象2)
一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类,
- java web 学习七(HttpServletResponse对象1)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- java web 学习笔记 编码问题总结
java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...
- [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Java Web学习笔记之---EL和JSTL
Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...
- Java Web 学习路线
实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
随机推荐
- (二)SQL -- 查询
主要包含以下内容: 单表查询.子查询.多表查询(左连接右连接等).合并查询 单表查询: 基础查询语句: select 列名 from 表名 where 条件 group by 列名 order by ...
- SQL server 从创建数据库到查询数据的简单操作
目录. 创建数据库 创建表 插入数据 查询 1.创建数据库 --创建数据库 create database db_Product go --使用数据库use db_Productgo 2.创建表 -- ...
- python之random随机函数
random.random()用于生成 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成随机数 1 n: a <= n <= b.如果 ...
- 利用IKVM在C#中调Java程序(总结+案例)
IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序.本文将比较详细的介绍这个工具的原理.使用入门(如何java应用转换为.NET应用.), ...
- 浅谈javaweb三大框架和MVC设计模式
一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(Vie ...
- SVN重命名后,不允许提交
在vs中对文件名重命名后,导致不能提交 解决: 在源码根目录下提交源码,提交完毕后,再使用如下菜单对需要命名的单个文件进行重命名,重命名完毕后,在源码根目录下提交源码即可
- Oracle Mysql MSSql 三种数据库 随机查询 条 语句
1. Oracle,随机查询查询语句-20条 select * from ( select * from 表名 order by dbms_random.value ) where rownum ...
- 用Vue来实现音乐播放器(二十一):歌手详情数据抓取
第一步:在api文件夹下的singer.js中抛出getSingerDetail方法 第二步:在singer-detail.vue组件中引入api文件夹下的singer.js和config.js 第三 ...
- handsonetable+vue 表格在线编辑
<template> <div> <div id="example-container" class="wrapper"> ...
- 【奇技淫巧】linux 定时任务 crontab 反弹 shell
日期:2018-11-26 13:47:34 介绍:如何使用定时任务来反弹 shell? 0x01. 基本命令 参数 -e:编辑该用户的计时器设置: -l:列出该用户的计时器设置: -r:删除该用户的 ...