JavaWeb学习-Servlet系列-12-HttpServletResponse编码设置

前面文章我们介绍了HttpServletResponse的响应消息行和响应消息头的一部分方法的练习,这篇,来介绍响应信息正文的相关方法。本篇主要介绍响应编码的设置和常见问题。

1.没有设置响应编码,中文内容在浏览器会显示问号格式

我们需要给网页输出一个字符串内容,这里需要用到HttpServletResponse的父类的一个方法getWriter()。利用这个方法,例如我们可以把“你好”输出在网页,当我们访问映射URL的时候,之前我们访问都是空白页面。

package com.anthony.servlet;

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 ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

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

}

部署到tomcat服务器,然后浏览器打开看看页面有没有显示 你好

首先问号不是乱码,学习过测试的同学可能知道,问号和乱码是有区别的,问号表示字符没有找到正确编码去解析;而乱码(下面我们会演示一个乱码)是字符编码表使用错误。本来中中文GBK的字符,你用英文字符编码去解析,这就产生乱码。这里产生问号的真实原因是,tomcat服务器默认的编码是ISO-8859-1,这个编码是美国tomcat制定,所以不支持中文。

你把上面“你好” 替换成“abc”,到浏览器就不会产生问号。下面来演示一个乱码产生过程。

上面我们看到浏览器中显示问号,我们猜也猜到应该需要给设置编码。

package com.anthony.servlet;

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 ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8"); //告诉服务器用UTF-8进行编码解析
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

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

}

上面添加一行代码,告诉服务器使用UTF-8去解析,但是没有指定浏览器客户端用什么编码,所以,下面运行会出现乱码。

服务器端编码方式是UTF-8,那么火狐浏览器编码是什么呢?火狐浏览器上点击主菜单-更多-文字编码

这里浏览器端用GBK编码去解析服务器端的UTF-8,两个编码不一致,所以显示乱码。解决办法,就是设置服务端编码同时也要设置客户端使用编码。

package com.anthony.servlet;

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 ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8"); //告诉服务器用UTF-8进行编码解析
		//告诉浏览器使用什么编码去解析
		response.setHeader("content-type", "text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

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

}

运行效果

2.设置编码方式优化

上面我们使用两行代码去分别设置服务器端和客户端的编码方式,其实在HttpServletResponse对象中有一个方法就可以同时设置服务器端和客户端的编码,下面是优化代码。

package com.anthony.servlet;

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 ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//这行代码干了两件事,同时告诉服务器和客户端使用GBK编码
		response.setContentType("text/html; charset=GBK");
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

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

}

重新部署,测试

在使用setContentType方法可能遇到这种问题,浏览器发送请求的时候,提示下载文件,在IE浏览器上,火狐不会。

原因就是这行代码写的有问题

response.setContentType("UTF-8"); //错误的

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

这种错误写法,哪怕一个单词写错了,在IE浏览器上请求这个url就提示下载文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值