JavaEE修改编码无效的问题

日期:2016-12-28       浏览:709

一 前言

自从学了spring后,做的项目都是用spring框架了,刚好这次需要做个demo出来,很简单的那种,于是就想着不用框架。顺其自然的就遇到了servlet中文乱码问题,于是就回头将需要设置编码的地方都设置了遍。

二 设置

2.1 设置项目编码

用eclipse编辑器,首先设置项目编码,选中项目右键 -> Properties -> Resource,然后勾选 other、设置编码为UTF-8,如下图所示。
设置项目编码
设置项目编码

2.2 设置编辑器编码

其次再设置编辑器编码,eclipse的菜单栏选择window -> Preferences-> General -> Workspace,然后在Text file encoding设置项中选择other,然后设置编码为UTF-8,如下图所示。
设置编辑器编码
设置编辑器编码

2.3 设置jsp页面编码

然后再设置jsp页面编码,
<%@ page contentType="text/html;charset=UTF-8" language="java"  pageEncoding="UTF-8"  %>

<meta charset="UTF-8">
如下图所示。
设置jsp页面编码
设置jsp页面编码

2.4 设置servlet编码

再然后设置servlet编码
设置请求编码
request.setCharacterEncoding("UTF-8")
设置响应编码
response.setCharacterEncoding("UTF-8")
(这里你也可以写个设置编码 的过滤器),如下图所示。
设置servlet编码
设置servlet编码

2.5 设置tomcat的 url 编码

最后设置tomcat的 url 编码(防止重定向时乱码),找到添加到eclipse的tomcat的Servers -> server.xml ,找到
<Connector .....></Connector>
配置,添加 URIEncoding="UTF-8" 设置属性,如下图所示。
设置tomcat的 url 编码
设置tomcat的 url 编码

2.6 数据库乱码

很多时候我们后台接收到的数据是正常的,但是保存到数据库就乱码了,这个时候就要注意一下几点了:
  • 数据库连接设置编码方式
  • 数据库建库时设置编码
  • 数据库建表时设置编码
  • 数据库的字段定义设置编码
大部分情况下我们在保存emoji表情的时候数据库会报错,这个就是数据库的编码设置的有问题导致的,可以看一看数据库相关设置是否正确,这点一定要注意!!!

三 效果

全部设置完成后本以为就不会存在中文乱码问题了,可是再次访问页面时还是出现了乱码,如下图所示。
设置完后效果1
设置完后效果1
设置完后效果2
设置完后效果2
思来想去都觉得可以设置编码的地方都被我设置了,怎么还是乱码了呢?
最后想到以前看的一本名叫《深入分析java web技术内幕》的书,里面有提到在设置请求和响应编码前,不可使用HttpServletRequestHttpServletResponse对象,不然设置的请求和响应编码都是无效的。
然后回过头来找了下是否在设置servlet编码前有使用过request和response,额,在我创建servlet的时候,编辑器会在doGet方法内的第一行自动生成
response.getWriter()
    .append("Served at: ")
    .append(request.getContextPath());
这可不就使用了HttpServletResponse对象嘛,怪不得我设置的响应编码老是不起作用,原因就出在这里,将自动生成的这行
response.getWriter()
    .append("Served at: ")
    .append(request.getContextPath());
删除掉再设置请求和响应编码,或设置编码放在这一行的上面就可以了。如下图所示。
注意设置顺序
注意设置顺序
再次访问时就显示正常了,如下图所示。
正常显示不乱码
正常显示不乱码

四 思考

在不使用框架的情况下我们会自己手写编码过滤器,可能还会有很多其他功能的过滤器,在web.xml的配置中就需要注意了,编码过滤器一定要是第一个起作用的过滤器,然后再一次是其它功能的过滤器。不然在其它的过滤器中用到了request或response,然后再执行编码过滤器,相应的这次连接被使用过的请求和响应对象的编码设置就不会再起作用了,谨记!
教训:我们用惯了框架给我们提供的诸多好处,再次回到没有框架的编程模式难免会遇到很多意想不到的坑,如何避免这些坑就需要我们对java web背后的原理有更多的了解,清楚的知道在哪一步可能有哪些坑在等着我们。当然多遇到点问题最后能解决并得到教训还是很有好处的。
扫码关注有惊喜

(转载本站文章请注明作者和出处 qbian)

231: 7   (2019-06-17)   回复
11: 11   (2018-12-04)   回复

Copyright 2016 qbian. All Rights Reserved.

文章目录