首页 > 代码库 > 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");
都要写这句话, 是不是很麻烦。 “懒惰”的程序员才是好程序员:有什么好办法吗?


 2、setEncoding

让我们回顾下上篇文章中,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乱码原因(下)