用response得到输出流,即response.getOuptStream(); 返回值为ServletOutputStream 对象,即JSP的out对象,要么用response得到输出对象PrintWriter即response.getWriter()。
Java代码
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
PrintWriter pw = response.getWriter();
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
pw.print("中文");
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
PrintWriter pw = response.getWriter();
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
pw.print("中文");
}
输出乱码。为什么呢,已经设置了字符编码啊?难道设置的无效。
在API中找到方法说明:
Java代码
PrintWriter getWriter() throws IOException
Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding().
If the response's character encoding has not been specified as described in getCharacterEncoding (i.e., the method just returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1.
PrintWriter getWriter() throws IOException
Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding().
If the response's character encoding has not been specified as described in getCharacterEncoding (i.e., the method just returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1.
就是讲,在返回一个PrintWriter对象的时候,charactor encoding就已经确定了,就已经设置好了字符集了。什么时候设置的呢? setCharacterEncoding方法的实现时发现如下代码:
Java代码
public void setCharacterEncoding(String charset) {
if (isCommitted())
return;
// Ignore any call from an included servlet
if (included)
return;
// Ignore any call made after the getWriter has been invoked
// The default should be used
if (usingWriter)
return;
coyoteResponse.setCharacterEncoding(charset);
isCharacterEncodingSet = true;
}
public void setCharacterEncoding(String charset) {
if (isCommitted())
return;
// Ignore any call from an included servlet
if (included)
return;
// Ignore any call made after the getWriter has been invoked
// The default should be used
if (usingWriter)
return;
coyoteResponse.setCharacterEncoding(charset);
isCharacterEncodingSet = true;
}
其中usingWriter 标志为getPrinteWriter方法中设定,可见其控制逻辑为一旦返回了PrintWriter,本函数即不再生效。
ServletOutputStream out = response.getOutputStream();
out.print("中文");
//情况1:正常,浏览器按utf-8方式查看
//response.setContentType("text/html; charset=utf-8");
//情况2:浏览器缺省按简体中文查看,手动设为utf-8方式查看正常
//response.setCharacterEncoding("utf-8");
说明:这种方式不仅不需要在调用getOutputStream()之前设定字符集,甚至在print输出后设定都有效。
结论:
1.在servlet中输出中文,如果采用PrintWriter方式,需要在调用getPrintWriter()之前调用setContentType 或者 setCharacterEncoding;采用ServletOutputStream方式,不受此限。
2.setContentType 和 setCharacterEncoding两方法中设定characterEncoding的方法对服务器效果一致,不需要反复调用。在输出文本内容时,采用response.setContentType("text/html; charset=utf-8");似乎更为方便。
3.PrintWriter自身并没有处理编码的职责,它还是应该看成一个装饰器比较好:它就是为了输出更方便而设计的,提供print、println、printf等便利方法。要设置编码的话,可以在它的底层Writer上设置:(这里以OutputStreamWriter为底层Writer),参考:
Java代码
new PrintWriter(new OutputStreamWriter(new FileOutputStream("yourfilepath"), "UTF-8"));
new PrintWriter(new OutputStreamWriter(new FileOutputStream("yourfilepath"), "UTF-8"));
1 楼 dpflyer 2010-10-01 引用
,太感谢了
用了这种方法
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter outjs = response.getWriter();
outjs.print("<script language='javascript'>alert('删除成功!')</script>");
就ok了
分享到:
相关推荐
Java Scanner File PrintWriter使用实例
我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。 思维导图: 1. 应答乱码处理(response输出页面时乱码) 1.1 ...
java写入txt:两种方法,1:利用PrintWriter 类2.FileOutputStream输出流
java 输出流中的PrintStream 和 PrintWriter有什么区别
PrintWriter的用法---马克-to-win java视频 打印输出流
本篇文章主要介绍了Java servlet 使用 PrintWriter 时的编码与乱码的示例代码,探讨了 PrintWriter 的缺省编码与普通字符流的缺省编码的差异,具有一定的参考价值,有兴趣的可以了解一下
主要介绍了PrintStream和PrintWriter的区别简介,具有一定借鉴价值,需要的朋友可以参考下
我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。 思维导图: 1. 应答乱码处理(response输出页面时乱码) 1.1 ...
主要介绍了浅谈PrintStream和PrintWriter的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
今天写了一个小小的提示成功的页面,同时要求返回上一页面,并实现对上一页面的操作进行刷新(例如删除的,添加的),在网上搜寻了一遍,基本上90%的都是说的是用window.history.go(-1), 或者是用 window.history....
【公益知识库zscc.club】51-IO流(PrintWriter).avi
1.ajax,action中response返回的xml文档格式错误时,eclipse debug进入不到action中.... 4.ajax返回xml乱码的原因 response.setContentType(”text/xml;charset=GBK”); PrintWriter out = response.getWr
PrintWriter 是字符类型的打印输出流,它继承于Writer。接下来通过本文给大家介绍java中的 PrintWriter 相关知识,感兴趣的朋友一起学习吧
File-Output-w-PrintWriter 一个演示 PrintWriter 类的简单程序。 系统会提示用户输入文件名以及他们有多少朋友。 将使用 PrintWriter 类创建一个文件。 然后,FOR 循环将根据用户的好友数量重复次数。 每次循环时...
} else { // 输入正方形边长,并输入其边长及面积 double side = Double.parseDouble(strLine); side = Double.parseDouble(strLine); System.out.println("Side of Square Received: " + side); ...
3 PrintWriter getWriter() 返回可以向客户端输出字符的一个对象 4 void setContentLength(int len) 设置响应头长度 5 void setContentType(String type) 设置响应的MIME类型 6 sendRedirect(java.lang....
使用PrintWriter写入文本文件
主要介绍了java eclipse 出现 xxx cannot be resolved to a type 错误解决方法的相关资料,需要的朋友可以参考下