首页 > 代码库 > tomcat下jsp乱码原因(下)
tomcat下jsp乱码原因(下)
系列文章: tomcat下jsp乱码的原因
上一篇文章里面, 主要讲解了文件编码、页面编码、如何解码, 以及分析了tomcat所起到的作用, 猛戳这里详细了解 tomcat下jsp乱码的原因(上)
tomcat下jsp乱码原因(下) ,这里我们分为以下几点讲解下解决乱码的方式, 都是结合tomcat来的。
1、纯手工解码
2、setEncoding
3、get、post方法
4、通过配置tomcat参数
好了, 我们详细看看以上几个方法
1、纯手工解码
String abc1 = new String(abc.getBytes("ISO-8859-1"),"utf8");这个方法就是把iso8859编码格式的字符串解码成utf8格式的字符串。 之所以称之为纯手工的方法, 是因为这个采用这种方式方法的话, 你不得不在你所有
String abc1 = new String(abc.getBytes("ISO-8859-1"),"utf8");都要写这句话, 是不是很麻烦。 “懒惰”的程序员才是好程序员:有什么好办法吗?
让我们回顾下上篇文章中,tomcat的源码。
String encoding = getCharacterEncoding(); if (encoding == null) encoding = "ISO-8859-1"; try{ RequestUtil.parseParameters(queryParameters, queryParamString, encoding); }catch (Exception e){ ; }
这里我们首先看到tomcat默认把字符串设置成了iso8859, 但是是在getCharacterEncoding() 么有取到值的时候, 所以, 我们就有了一个比较简单的办法处理这个问题
1、在String abc = request.getParameter("abc");之前, 我们就可以写添加一句代码, 用来专门设置request的encoding, 这样tomcat在getCharacterEncoding()的时候
就可以取到我们定义的encoding,代码就是这样:
request.setCharacterEncoding("utf8"); String abc = request.getParameter("abc");2、上述代码中的abc直接就是utf8编码了。 如果我们提交以前也是utf8编码的, 这样获取的直接就是对的编码了。是不是第一种方法里面, 每个字符串都去编码下要简洁很多?更进一步, 我们可以使用一个更有效的方法filter。 可以定义一个filter, 专门做这个request.setCharacterEncoding("utf8"); , 当然我们在每个jsp, 或者servlet中, 或者
action中, 就不用处理这个encoding, 这样更有利于统一处理编码, 当然如果做的更灵活可以把request.setCharacterEncoding("utf8");中的utf8做成参数话, 这样就更
灵活, 可以随时修改而不用重新编译程序了。
是不是更符合懒惰的思想作风, 呵呵, 确实比第一种方法简洁了很多。 但是这也是一把双刃剑, 简洁的同时,也隐藏了很多的内容, 很多项目里面大部分的人都是针对业务的, 如果没有接触的话, 那么很可能搞不清中间还有这些转换的事情的发生, 所以作为一个程序员应该提高自身的素质, 而不是仅仅的完成任务, 好了这个已经超出了我们的范围了。 好了说了些废话以后, 我们继续回到主题上来。
上面我们已经从自己主动转换编码,到统一编码, 那么我们不禁要想了, 还有其他的方法吗? 答案是肯定的, tomcat的大神门早就替我们考虑了这些问题, 只是我们对它了解多少呢?下面我们先做些准备知识。
3、get、post方法
html的get和post的方法, 为啥要在这里列出这个问题呢? 我们先看看2个截图, 还是用上一篇文章中的test.jsp 和 result.jsp 作为例子:
首先我们test.jsp中设定成get的方法, 我们使用httpwatch 来观察下ie浏览器做了些什么?
首先我们test.jsp中设定成post的方法, 我们使用httpwatch 来观察下ie浏览器做了些什么?
通过以上2附图,可以很清楚的看到我们的test.jsp的提交时候的变化。 一个参数在head, 一个参数在body。 (注:这个也是post可以数据更长的原因, 而get是有限制的)
有了这个基本的认识, 我们回到主题, 看看tomcat究竟怎么帮助我们处理这个编码问题。
4、通过配置tomcat参数
tomcat在这个问题上, 把get和post方法分开处理。我们只需要修改相应的参数就可以。
参数的位置和名称分别是config/server.xml
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
里面添加参数:
URIEncoding=“gbk”
是设置get时候的url编码的。
下面我们分别演示如何使用:
<Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="gbk" />
这里我们把server.xml的urlencoding设置成gbk, test.jsp编码目前也是gbk, 这时候是告诉tomcat说, 我的get方式的url参数是用gbk方式编码的。看一下结果:
当result.jsp是这样定义的:
String abc = request.getParameter("abc"); if(abc == null) { out.println("空值"); } else { out.println("原始编码:"); out.println(abc); out.println(java.util.Arrays.toString(abc.getBytes("ISO-8859-1"))); out.println(new String(abc.getBytes("ISO-8859-1"))); out.println("</br>"); out.println("utf8编码:"); String abc1 = new String(abc.getBytes("ISO-8859-1"),"utf8"); System.out.println(abc1); out.println(abc1); out.println("</br>"); out.println("gbk编码:"); String abc2 = new String(abc.getBytes("ISO-8859-1"),"gbk"); out.println(abc2); }
对应代码和结果, 我们可以清楚的看到, 我们再使用iso8859方式进行解码的时候, 都出错了。 但是直接获取参数时候, 确实没有乱码。
好下面我们把test.jsp的方式改成post, result.jsp的方式不该, 我们看看结果:
可以看出这个地方的参数设置是针对get方式起效。
絮絮叨叨又写了这么多, 其实还有很多细节看样子也没有办法一下子就涉及到并且讲清楚。 以后有机会再说。 欢迎交流
tomcat下jsp乱码原因(下)