在HttpServletRequest得到前端的请求对象,并处理完业务以后,HttpServletResponse用于向前端回响数据。那么服务器怎么利用response对象向前端发送数据呢,先要通过获得输出流,然后再利用输出流对象进行具体的操作

输出流

输出流有两种:

  1. 字符流:PrintWriter writer = response.getWriter();

writer.write(“helloWorld01”);
writer.print(“helloWorld02”);
字符流常用于回传字符串。

  1. 字节流: ServletOutputStream out = response.getOutputStream();

out.write(“helloworld03.getBytes(StandardCharsets.UTF_8)
�”);
字节流常用于下载(传递二进制数据)。

需要注意的是两种流不能一起用,只能用一种。

乱码问题

方案一:(不推荐)
获取到的字符流,响应中文很有可能出现乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。需要使用:

  1. response.setCharacterEncoding("UTF-8");
  2. // 设置服务器字符集为 UTF-8

告诉服务器端编码的格式,除此之外还需要告诉客户端编码格式:

  1. response.setHeader("Content-Type", "text/html; charset=UTF-8");
  2. // 通过响应头,设置浏览器也使用 UTF-8 字符集

方案二:推荐

  1. // 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
  2. response.setContentType("text/html; charset=UTF-8");

方法一定要在获取流对象之前调用才有效

实验代码如下:

  1. ServletOutputStream out = response.getOutputStream();
  2. out.write("谭耀楚".getBytes(StandardCharsets.UTF_8));
  3. //未设置UTF-8编码

image.png

  1. response.setContentType("text/html; charset=UTF-8");
  2. //设置了UTF-8编码
  3. ServletOutputStream out = response.getOutputStream();
  4. out.write("谭耀楚".getBytes(StandardCharsets.UTF_8));

image.png

重定向

重定向是一种服务器指导客户端的行为,当客户端发起一个请求时,服务器端接收后会进行响应,同时会给客户端一个新地址(即下一次客户端请求是的地址),客户端收到响应后会立刻根据刚刚服务端发来的新地址进行对新地址的请求,服务端在接收到第二个请求后再进行响应。
代码:response.sendRedirect(url);

示例:
servlet:

  1. response.setContentType("text/html; charset=UTF-8");
  2. ServletOutputStream out = response.getOutputStream();
  3. out.write("谭耀楚".getBytes(StandardCharsets.UTF_8));
  4. response.sendRedirect("index.jsp");//重定向到首页

jsp:

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$Title$</title>
  5. </head>
  6. <body>
  7. 欢迎来到主页
  8. </body>
  9. </html>

效果:
image.png

请求转发和重定向的对比

HttpServletResponse - 图4
对行为进行解释:请求转发是客户端向服务器发送请求,在服务器中从一个资源跳到另一个资源,因此说请求转发是服务器端的行为