1. Response 对象的功能
-
设置响应行
-
响应行格式
协议/版本 响应状态码 状态码描述
-
方法
- 设置响应状态码
- void setStatus(int sc)
- 设置响应状态码
-
-
设置响应头
- 方法
- 设置响应头
- setHeader(String name, String value)
- 设置响应头
- 方法
-
设置响应体
- 使用步骤
- 获取输出流
- 字符输出流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
- 使用输出流,将数据输出到客户端浏览器
- 获取输出流
- 使用步骤
2. Response 对象的练习
2.1 完成重定向
-
重定向的概念
重定向是一种资源跳转的方式
-
重定向的实现
@WebServlet("/ResponseDemo1") public class ResponseDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ResponseDemo1..."); //1.设置状态码为302 //response.setStatus(302); //2.设置响应头location //response.setHeader("location","responseDemo2"); // 简单形式,重定向 response.sendRedirect("/ResponseDemo2"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
-
重定向的特点
- 地址栏发生变化
- 重定向可以访问其他站点的资源
- 重定向是两次请求(不能使用 request 对象来共享数据)
-
路径写法
-
相对路径
通过相对路径不可以确定唯一资源
- 如:./index.html
- 以 . 开头路径
- 规则:找到当前资源和目标资源之间的相对位置关系
- ./:当前目录
- …/:后退一级目录
-
绝对路径
通过绝对路径可以确定唯一资源
-
如:/day15/responseDemo2
-
以 / 开头的路径
-
规则:判断定义的路径是给谁用的?(谁发出请求给谁用)
- 给客户端浏览器使用:需要加虚拟目录
- 给服务器使用:不需要加虚拟目录
- 转发不需要加虚拟目录,重定向需要加虚拟目录
-
建议虚拟目录动态获取:request.getContextPath(),如:
request.getContextPath()+“/responseDemo2”
-
-
2.2 服务器输出字符数据到浏览器
-
实现步骤
- 获取字符输出流
- 输出数据
-
编码实现
@WebServlet("/ResponseDemo3") public class ResponseDemo3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取字符输出流 PrintWriter writer = response.getWriter(); // 2.输出数据 writer.write("hello..."); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
-
中文乱码问题
-
中文乱码原因
浏览器解析的编码是GBK,获取的流的默认编码是ISO-8859-1,编码使用的字符集不一样
-
解决步骤
- 设置该流的默认编码
- 告诉浏览器响应体使用的编码,建议浏览器使用该编码解码
-
编码实现
@WebServlet("/ResponseDemo4") public class ResponseDemo4 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取流对象之前,设置流的编码 // response.setCharacterEncoding("utf-8"); // 服务器告诉客户端本次响应体数据格式以及编码格式,建议浏览器使用该编码解码 // response.setHeader("content-type","text/html;charset=utf-8"); // 简单形式,设置编码 response.setContentType("text/html;charset=utf-8"); // 1.获取字符输出流 PrintWriter writer = response.getWriter(); // 2.输出数据 writer.write("你好..."); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
-
2.3 服务器输出字节数据到浏览器
-
实现步骤
- 获取字节输出流
- 输出数据
-
编码实现
@WebServlet("/ResponseDemo5") public class ResponseDemo5 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码 response.setContentType("text/html;charset=utf-8"); // 1.获取字节输出流 ServletOutputStream outputStream = response.getOutputStream(); // 2.输出数据 outputStream.write("你好".getBytes("utf-8")); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }