前面文章我们介绍了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就提示下载文件。