REASON
写了一个表单页面webBasic.jsp,信息提交到Servlet,然后读取数据库信息转发到webBasic.jsp。
ERROR
输出的汉字变为了乱码。连jsp本身的内容,原先正常的也变成了乱码。
主要代码和效果截图如下:
Servlet代码:

Jsp代码:
提交前界面:
提交后界面:
FIND
1、html,jsp,三处设置都为”UTF-8”,浏览器编码更改为UTF-8一样会出现乱码。
2、按照视频里的教育,在输出前加上语句request.setCharacterEncoding(“UTF-8”);并没有卵用。
3、按照网上的介绍,做了个过滤器,过滤/*,结果一打开所有页面body里的内容都没了。只好暂时改成/abc,过滤还没学过,还是以后再用吧。
HANDLE
研究转发的原理,我们最后得到的“整个页面”应该就是最后Response的内容。也就是说Response的编码有问题。
在CustomerServlet doGet的第一行加入response.setCharacterEncoding(“utf-8”);页面正常。response.setContentType(“text/html;charset=UTF-8”);也可以。
进一步发现,乱码的关键在于Servlet doGet中一个response.getWriter()语句,如果response.setCharacterEncoding(“utf-8”);在其之后,最后得到的页面就会出现乱码。
下面是这两个语句之间的关系。
1、response.getWriter().append(“aaa”);
response.setCharacterEncoding(“utf-8”);
set语句在之后,出现乱码
2、response.getWriter().append(“aaa”);
无set语句,出现乱码
3、response.setCharacterEncoding(“utf-8”);
response.getWriter().append(“aaa”);
set语句在之前,无乱码
4、两个语句都没有,无乱码。
其中原因为何,尚待研究。
另外据说解决乱码最彻底的方法还是设置一个filter,里面是这三行语句,留下备忘。
request.setCharacterEncoding(“UTF-8”);
response.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=UTF-8”);