Response简介
1、 什么是Response
Response代表Http响应的对象
在服务器调用Service方法处理请求之前, 会创建代表Http响应的Response对象.
2、 Response继承关系
- ServletResponse接口 -- 定义Response应该具有哪些功能
|
|-- HttpServletResponse -- 继承了ServletResponse, 并且添加了很多和HTTP协议相关的方法
3、 Response常用方法
状态行
HTTP/1.1 200 OK
若干响应头
Context-Type: text/html..
Content-Length: 80
…
(空白行)
响应实体内容
xxxx
设置状态码的方法:
setStatus(int sm);
设置响应头的方法:
setHeader(String name, String value);
设置响应实体内容的方法:
getOutputStream();
getWriter();
(字节流和字符流在响应时不能同时用,否则会报错,下面会有详解)
Response功能
1、 向客户端发送数据
(1)、getOutputStream()
ServletOutputStream out = response.getOutputStream();
//out.write( "Hello".getBytes() );
//>>指定在服务器端发送数据时的编码为utf-8
out.write( "你好".getBytes("utf-8") );
//>>通知浏览器使用utf-8来接收服务器端发送的数据
response.setHeader("Content-Type","text/html;charset=utf-8");
注意:
字节流发送中文数据的乱码问题:
通过字节流向客户端发送中文数据, 底层需要先通过getBytes方法将字符转成字节. 这个方法默认使用的编码为系统平台码(GBK), 如果浏览器接收时使用的不是相同的编码, 就会出现乱码. 所以应该在发送数据时, 明确的使用指定的编码来发送数据, 以及明确的通知浏览器使用指定的编码来接收数据.
//>>先指定发送数据的编码为utf-8
out.write( "你好".getBytes("utf-8") );
//>>通知浏览器使用utf-8来接收服务器端发送的数据
response.setHeader("Content-Type","text/html;charset=utf-8");
// 上面的代码等价于 ===>
response.setContentType("text/html;charset=utf-8");
(2)getWriter() – 字符流发送数据底层有需要转成字节
注意:在通过字符流向客户端发送中文数据时, 也会出现乱码:
服务器端默认使用的编码是iso8859-1, 即发送数据使用的编码为iso8859-1, 这个码表中没有中文数据, 发送时必然会出现乱码(无论浏览器使用哪一个编码来接收数据.)
//>>通知服务器使用指定的编码来发送数据(默认iso8859-1)
response.setCharacterEncoding("utf-8");
//>>通知浏览器也使用utf-8来接收数据.
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你好");
其中上面通知服务器使用指定编码来发送数据的代码, 即:
response.setCharacterEncoding("utf-8");
可以省略不写, 因为下面这行代码:
response.setContentType("text/html;charset=utf-8");
既可以通知浏览器使用utf-8来接收数据, 也可以通知服务器使用utf-8来发送数据.!
总结:
(1)在通过字符流向客户端发送中文数据时,如果出现了乱码, 可以通过一行代码搞定, 在任何向外写数据的代码之前执行:
response.setContentType("text/html;charset=utf-8");
(2)在通过字节流向客户端发送中文数据时, 如果出现乱码, 需要指定:
//>>指定getBytes方法的编码
response.getOutputStream().write( "你好".getBytes("utf-8") )
//>>通知浏览器使用相同的编码来接收数据
response.setContentType("text/html;charset=utf-8");
细节问题:
(1) getOutputStream方法和getWriter方法这两个方法是互斥的, 不能同时使用!
(2) getOutputStream方法和getWriter方法获取到的流, 用完之后不需要关闭, 因为服务器会帮我们关闭!
(3) getOutputStream方法和getWriter方法获取到的流不是指向客户端浏览器, 而是指向response缓冲区, 请求处理完成, 请求会再次回到服务器, 服务器负责从response缓冲区中获取到数据, 再发送给浏览器.
实现请求重定向
重定向也可以实现资源的跳转
通过302状态码和location响应头就可以实现请求重定向
实现重定向:
response.setStatus( 302 );
response.setHeader( “location”, “重定向到资源的地址” );
例如:
//将请求重定向到index.jsp
response.setStatus(302);
response.setHeader("location", "/day15/index.jsp");
上面的两行代码等价于下面这一行:
response.sendRedirect("/day15/index.jsp");
重定向的特点:
(1)两次请求, 两次响应
(2)地址栏地址会发生变化
(3)既可以实现同一个Web应用内部资源之间的跳转, 也可以实现不同的Web应用或者不同的虚拟主机内部资源之间的跳转. 例如:
response.sendRedirect("/day15/index.jsp");
response.sendRedirect("/day14/index.html");
response.sendRedirect("http://www.tmooc.cn");
实现定时刷新:
通过Refresh响应头可以实现在多少秒之后跳转到另一个资源
实现代码:
response.setHeader(“Refresh”, “3;url=/day15/index.jsp”);
例如:
response.getWriter().write("恭喜您注册成功! 3秒之后将会跳转到首页...");
//实现定时刷新, 3秒之后跳转到首页
response.setHeader("Refresh", "3;url="+ request.getContextPath() + "/index.jsp");
定时刷新特点:
(1)两次请求, 两次响应
(2)地址栏地址会发生变化
(3)既可以实现在同一个Web应用内部资源之间的跳转, 也可以实现不同的Web应用或者是不同的虚拟主机内部资源之间的跳转
(4)定时刷新和重定向不同的是, 定时刷新是指定多少秒之后再进行跳转, 在跳转之前, 可以发送响应数据到客户端.