自从学了spring后,做的项目都是用spring框架了,刚好这次需要做个demo出来,很简单的那种,于是就想着不用框架。顺其自然的就遇到了servlet中文乱码问题,于是就回头将需要设置编码的地方都设置了遍。
用eclipse编辑器,首先设置项目编码,选中项目右键 -> Properties -> Resource,然后勾选 other、设置编码为UTF-8,如下图所示。
其次再设置编辑器编码,eclipse的菜单栏选择window -> Preferences-> General -> Workspace,然后在Text file encoding设置项中选择other,然后设置编码为UTF-8,如下图所示。
然后再设置jsp页面编码,<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>和<meta charset="UTF-8">,如下图所示。
再然后设置servlet编码,设置请求编码request.setCharacterEncoding("UTF-8"),设置响应编码response.setCharacterEncoding("UTF-8")(这里你也可以写个设置编码 的过滤器),如下图所示。
最后设置tomcat的 url 编码(防止重定向时乱码),找到添加到eclipse的tomcat的Servers -> server.xml ,找到<Connector .....></Connector>配置,添加URIEncoding="UTF-8"设置项,如下图所示。
全部设置完成后本以为就不会存在中文乱码问题了,可是再次访问页面时还是出现了乱码,如下图所示。
思来想去都觉得可以设置编码的地方都被我设置了,怎么还是乱码了呢?最后想到以前看的一本名叫《深入分析java web技术内幕》的书,里面有提到在设置请求和响应编码前,不可使用HttpServletRequest和HttpServletResponse对象,不然设置的请求和响应编码都是无效的。然后回过头来找了下是否在设置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背后的原理有更多的了解,清楚的知道在哪一步可能有哪些坑在等着我们。当然多遇到点问题最后能解决并得到教训还是很有好处的。