使用response的writer(九)

PrintWriter getWriter()

获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

关于设置中文的乱码问题

原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过response的setCharacterEncoding(String charset)设置response的编码

但我们发现客户端还是不能正常显示文字

原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以手动修改浏览器的编码是UTF-8。

我们还可以在代码中指定浏览器解析页面的编码方式,

通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8

response.setContentType("text/html;charset=UTF-8");

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中文乱码问题。

writer就是往response的缓冲区写。然后,tomcat引擎从response的缓冲区拿数据,组成http响应。

package com.ken.content;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		PrintWriter writer = response.getWriter();
		writer.write("hello response");
		writer.write("中国");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
使用response的writer(九)_第1张图片
response直接写中文,会产生乱码。

writer往response缓冲区写。response缓冲区本身有一个编码。我们的字符串要根据码表进行编码,编码之后的内容存在了缓冲区。然后缓冲区的内容给到客户端,在客户端上使用码表进行解码。response默认的码表是iso-8859-1,这个码表是没有中文的。要通知response去查UTF-8。 注意,设置码表要在拿到writer之前

使用response的writer(九)_第2张图片

package com.ken.content;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 设置response查询的码表
		response.setCharacterEncoding("UTF-8");
		PrintWriter writer = response.getWriter();
		writer.write("hello response");
		writer.write("你好");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
使用response的writer(九)_第3张图片
这里还有乱码。是因为客户端的解码没有指定。大部分客户端查的编码是本地编码格式。

使用response的writer(九)_第4张图片

使用response的writer(九)_第5张图片

解决方案:

package com.ken.content;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 设置response查询的码表
		response.setCharacterEncoding("UTF-8");

		// 通过一个头Content-Type 告知客户端使用何种码表进行编码
		response.setHeader("Content-Type", "text/html;charset=UTF-8");

		PrintWriter writer = response.getWriter();
		writer.write("hello response");
		writer.write("中国");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
使用response的writer(九)_第6张图片
在开发中,我们可以将上面两句中的第一句省略。只需要第二行,tomcat自动将response的编码设置为utf-8。

最终,我们还可以简化,将setHeader用setContentType()方法替换。

package com.ken.content;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 设置response查询的码表
		// response.setCharacterEncoding("UTF-8");

		// 通过一个头Content-Type 告知客户端使用何种码表进行编码
		// response.setHeader("Content-Type", "text/html;charset=UTF-8");
		response.setContentType("text/html;charset=UTF-8");

		PrintWriter writer = response.getWriter();
		writer.write("hello response");
		writer.write("中国");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

你可能感兴趣的:(Servlet)