前面一篇,我们介绍了编码设置,还有一个方法PrintWriter,这个对象就是一个字符流操作,直接把内容通过字符流方式写入到response对象,在响应正文的操作中,还有一个叫字节流的对象ServletOutputStream, 其实就是继承了OutputStream类。
1.默认编码字节流方式
package com.anthony.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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 {
ServletOutputStream sos = response.getOutputStream();
sos.write("你好abc".getBytes());
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重新部署到tomcat服务器上,测试下
这里有一个思考,为什么这里没有显示问号或者乱码。这里我们来复习下String类的getByte()方法,打开JDK API,查询String类。
不带参数的getBytes(), 人家说了使用平台默认的字符集编码,这个默认是什么意思,我的win10系统是简体中文操作系统,默认字符集编码方式是GBK,而且我浏览器默认也是中文GBK,所以这里能正常解析,不会产生问号和乱码。
2.指定编码字节流方式
注意到上面还有一个代码字符集编码的getBytes方法,我们这里来测试一下。
package com.anthony.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.setContentType("text/html;charset=UTF-8");
ServletOutputStream sos = response.getOutputStream();
sos.write("你好abc".getBytes("UTF-8"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重新部署,网页能正常解析字节流数据。
我们代码中,字节流的编码格式设置为UTF-8,而且通过setContentType()把浏览器和服务器都告诉使用UTF-8编码去解析,这样就不会冲突,可以正常显示,如果你把一方改成GBK,那么页面出来就会乱码显示。