HttpServletResponse对象的介绍和解决中文输出乱码的问题

request 与 response 对象概述

Web 服务器收到客户端的 HTTP 请求,会针对每一次请求分别创建一个代表请求的 request 对象和一个代表响应的 response 对象。要获取客户机提交过来的数据,只需找 request 对象;要向客户机输出数据,只需找 response 对象。

HttpServletResponse 对象代表服务器的响应,其中封装了向客户端发送数据、发送响应头、发送响应状态码的方法。

向客户端发送数据

response 对象提供了两个方法用于向客户端输出数据:

方法说明
getOutputStream()返回 OutputStream 字节流
getWriter()返回 PrintWriter 字符流

发送响应头与状态码

设置响应头的方法:

  • addDateHeader
  • addHeader
  • addIntHeader
  • containsHeader
  • setDateHeader
  • setHeader
  • setIntHeader

设置状态码的方法:

  • setStatus(int sc)

Java 中预定义了常用状态码常量,如 SC_OKSC_NOT_FOUND 等。

1. 使用 OutputStream 流向客户端输出中文数据

使用 OutputStream 输出中文时,服务器端以哪个码表编码输出,就要控制客户端浏览器以相应的码表打开。例如以 UTF-8 编码输出:

String data = "foxdevelop";
OutputStream outputStream = response.getOutputStream();
response.setHeader("content-type", "text/html;charset=UTF-8");
byte[] dataByteArr = data.getBytes("UTF-8");
outputStream.write(dataByteArr);Code language: JavaScript (javascript)

通过 response.setHeader("content-type", "text/html;charset=UTF-8") 控制浏览器以 UTF-8 编码显示数据。

2. 使用 PrintWriter 流向客户端输出中文数据

response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
response.setHeader("content-type", "text/html;charset=UTF-8");
out.write("foxdevelop");Code language: JavaScript (javascript)

注意:在服务器端应以字符串形式输出,否则可能出现无法输出或乱码的问题。例如在输出数字时,需将数字与空字符串拼接(i + ""),否则 PrintWriter.write(int) 会将数字当作字符编码输出而非数字本身。

完整示例

package cn.bamn.demo;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private int i;

    public TestServlet() {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        i++;
        response.setHeader("content-type", "text/html;charset=UTF-8");
        // response.setStatus(response.SC_NOT_FOUND);
        response.getOutputStream().write("foxdevelop".getBytes("UTF-8"));
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注