HttpServletResponse
HttpServletResponse
简介
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
HttpServletResponse用途
- 1、向客户端写入Cookie
- 2、重写URL
- 3、获取输出流对象,向客户端写入文本或者二进制数据
- 4、设置响应客户端浏览器的字符编码类型
- 5、设置客户端浏览器的MIME类型。
HttpServletResponse对象向客户端发送数据格式如下:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 5 Jan 2004 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT
Content-Length: 112
<html><head><title>HTTP Response Example</title></head>....</html>
负责向客户端(浏览器)发送响应头的相关方法
addHeader(String name,String value) //将指定的名字和值加入到响应的头信息中
encodeURL(String url) //编码指定的URL
sendError(int sc) //使用指定状态码发送一个错误到客户端
setDateHeader(String name,long date) //将给出的名字和日期设置响应的头部
setHeader(String name,String value) //将给出的名字和值设置响应的头部 eg:response.setHeader(“Refresh”,”2;url=”http://www.baidu.com”); 页面的刷新
setStatus(int sc) //给当前响应设置状态码
getOutputStream() //字节输出流对象
getWriter() //字符的输出流对象(这个一般用于输出汉字内容,一般不用这个)
sendRedirect () //请求重定向,对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
setContentType(String ContentType) //设置响应的MIME类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。
setCharacterEncoding(String charset) //告知服务器用什么方式编码解析
响应状态码(setStatus()、sendError())
HttpServletResponse定义了很多状态码的常量(具体可以查看Servlet的API),当需要向客户端发送响应状态码时,可以使用这些常量,避免了直接写数字,常见的状态码对应的常量:
- 状态码404对应的常量 SC_NOT_FOUND
- 状态码200对应的常量 SC_OK
- 状态码500对应的常量 SC_INTERNAL_SERVER_ERROR
HttpServletResponse对象的常见应用
1、输出中文
/** * 使用OutputStream流输出中文 * @param request * @param response * @throws IOException */ String data = "中国"; OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流 response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码 /** * data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表, * 如果是中文的操作系统环境,默认就是查找查GB2312的码表, * 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字 * 比如: "中"在GB2312的码表上对应的数字是98 * "国"在GB2312的码表上对应的数字是99 */ /** * getBytes()方法如果不带参数,那么就会根据操作系统的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表 */ byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换 outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组
2、文件下载
文件下载功能的实现思路:
1.获取要下载的文件的绝对路径
2.获取要下载的文件名
3.设置content-disposition响应头控制浏览器以下载的形式打开文件
4.获取要下载的文件输入流
5.创建数据缓冲区
6.通过response对象获取OutputStream流
7.将FileInputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区的数据输出到客户端浏览器
OutputStream下载xls文件例子如下:
//HttpServletResponse OutputStream下载xls文件
@RequestMapping("/download")
public void download(HttpServletRequest req,HttpServletResponse res){
String fileName = "java教程.xls";//要下载的文件名
String realPath = req.getSession().getServletContext().getRealPath("/wbms/download");
File file=new File(realPath+"/"+fileName);
// 设置响应的编码UTF-8
res.setCharacterEncoding("utf-8");
// 响应头的类型(xls)
res.setContentType("application/octet-stream");
//设置content-disposition响应头控制浏览器以下载的形式打开文件
res.setHeader("Content-Disposition", "attachment;fileName="+ URLEncoder.encode("javaschool.xls", "UTF-8"));
InputStream inputStream=new FileInputStream(file);根据路径获取要下载的文件输入流
OutputStream out = res.getOutputStream();
byte[] b=new byte[1024]; //创建数据缓冲区
int length;
while((length=inputStream.read(b))>0){ 把文件流写到缓冲区里
out.write(b,0,length);
}
out.flush();
out.close();
inputStream.close();
}
推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。
3、HttpServletResponse设置http控制浏览器禁止缓存当前文档内容
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
}
4、HttpServletResponse sendRedirect重定向
用法:
HttpServletResponse.sendRedirect("url?参数名1=参数值&参数名2=参数值");
实例:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
/*方法一:使用response.sendRedirect*/
// response.sendRedirect("index.html");
/*方法二:设置响应头和重定向地址*/
response.setHeader("Location", "index.html");
response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码,等同于response.setStatus(302);
}
sendRedirect重定向不可以在页面中共享HttpServletRequest对象中的数据。但是可以通过重定向的url中携带需要的参数,但这里的参数只能携带字符串的参数。但是其优点是重定向时浏览器默认是使用get请求方式,这样的请求方式速度更快一点。但是安全性却不高。
5、HttpServletResponse设置http定时刷新网页(refresh)
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("refresh", "5");//设置refresh响应头控制浏览器每隔5秒钟刷新一次
}