Response

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)定时刷新和重定向不同的是, 定时刷新是指定多少秒之后再进行跳转, 在跳转之前, 可以发送响应数据到客户端.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值