Servlet 乱码问题今天在部署一个webservices程序的时候,从页面获取数据的servlet出现了乱码问题,在servlet
Servlet 乱码问题
今天在部署一个webservices程序的时候,从页面获取数据的servlet出现了乱码问题,在servlet中我已经把request.setCharacterEncoding("GB2312");这段文字加入到代码中去,但是还是出现乱麻问题。
?到网上找资料,如下:JAVA是Unicode编码,你先转换成ISO8859-1,然后再转换成GBK或是GB2312.
???

!!
解决的办法是:
1) 打开tomcat的server.xml文件,找到区块,加入如下一行:
URIEncoding=”GBK”
完整的应如下:
<connector uriencoding="GBK" maxthreads="150" debug="0" redirectport="8443" port="8080" enablelookups="false" maxsparethreads="75" minsparethreads="25" connectiontimeout="20000" disableuploadtimeout="true" acceptcount="100"></connector>
2)重启tomcat,一切OK。
tomact.org给的解释
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. 也就是说转换了URI的bytes,request.setCharacterEncoding("GBK")把request也转换了,问题就ok了!
(四) JSP页面上有中文,按钮上面也有中文,但是通过服务器查看页面的时候出现乱码:
解决的办法是:首先在JSP文件中不应该直接包含本地化的消息文本,而是应该通过<bean:message>标签从Resource Bundle中获得文本。应该把你的中文文本放到Application.properties文件中,这个文件放在WEB-INF/classes/* 下,例如我在页面里有姓名,年龄两个label,我首先就是要建一个Application.properties,里面的内容应该是name=”姓名” age=”年龄”,然后我把这个文件放到WEB-INF/classes/properties/下,接下来根据 Application.properties文件,对他进行编码转化,创建一个中文资源文件,假定名字是 Application_cn.properties。在JDK中提供了native2ascii命令,他能够实现字符编码的转换。在DOS环境中找到你放置Application.properties的这个文件的目录,在DOS环境中执行一下命令,将生成按GBK编码的中文资源文件 Application_cn.properties:native2ascii ?encoding gbk Application.properties Application_cn.properties执行以上命令以后将生成如下内容的Application_cn.properties文件: name=u59d3u540d age=u5e74u9f84,在Struts-config.xml中配置:<message-resources parameter="properties.Application_cn"></message-resources>。到这一步,基本上完成了一大半,接着你就要在JSP页面上写 <!---->,到名字的那个label是要写<bean:message key="”name”">,这样的化在页面上出现的时候就会出现中文的姓名,年龄这个也是一样,按钮上汉字的处理也是同样的。
(五) 写入到数据库是乱码:
解决的方法:要配置一个filter,也就是一个Servelet的过滤器,代码如同第二种时候一样。
如果你是通过JDBC直接链接数据库的时候,配置的代码如下:jdbc:mysql://localhost:3306/workshopdb? useUnicode=true&characterEncoding=GBK,这样保证到数据库中的代码是不是乱码。
如果你是通过数据源链接的化你不能按照这样的写法了,首先你就要写在配置文件中,在tomcat 5.0.19中配置数据源的地方是在C:Tomcat 5.0confCatalinalocalhost这个下面,我建立的工程是workshop,放置的目录是webapp下面,workshop.xml 的配置文件如下:
<!---->
<context debug="0" path="/workshop" docbase="workshop"></context>reloadable="true" >
<resource name="jdbc/WorkshopDB"></resource>auth="Container"
type="javax.sql.DataSource" />
<resourceparams name="jdbc/WorkshopDB"></resourceparams>
<parameter></parameter>
<name></name>factory
<value></value>org.apache.commons.dbcp.BasicDataSourceFactory
<parameter></parameter>
<name></name>maxActive
<value></value>100
<parameter></parameter>
<name></name>maxIdle
<value></value>30
<parameter></parameter>
<name></name>maxWait
<value></value>10000
<parameter></parameter>
<name></name>username
<value></value>root
<parameter></parameter>
<name></name>password
<value></value>
<!---->
<parameter></parameter>
<name></name>driverClassName
<value></value>com.mysql.jdbc.Driver
<parameter></parameter>
<name></name>url
<value></value>
粗体的地方要特别的注意,和JDBC直接链接的时候是有区别的,如果你是配置正确的化,当你输入中文的时候到数据库中就是中文了,有一点要注意的是你在显示数据的页面也是要用<!---->这行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的,写了一个Form的时候把他改成了一个jsp,这样有一个地方要注意了,那就是在Dreamver中Action的提交方式是request的,你需要把他该过来,因为在jsp的提交的过程中紧紧就是POST和 GET两种方式,但是这两种方式提交的代码在编码方面还是有很大不同的,这个在后面的地方进行说明。</bean:message></bean:message>firebody 1 小时前基本上做过web开发的都会碰到这样的问题,LZ写了这么多,从“配置”上来说,基本上是正确的,但是研究问题如果仅仅从如何“配置正确”入手的话,还是有点不好理解,最好从背后原理再了解一下。有几个问题指出一下:1) URLEncode 可以代替LZ那个自己写的复杂函数2) post和 get方式的乱码是因为浏览器和http服务器对此有不同的处理造成的。post涉及到request-body,get涉及到 url encode.如果大家想更清楚了解原理的话,有一篇文章写的不错,推荐大家看一下:http://hi.baidu.com/dand2008/blog/item/d9cdf9fcbde506fffd037f69.html
thanks firebody,谢谢你的回答和建议,我会在以后把相关的原理内容列出来
其实有很多web的原理和实用的东西可以从这本书得到答案<<head first servlet&jsp>>这本书得到答案。比较入门级的,比较通俗。同时看完之后可以通过SCWCD这个java认证。
5 楼 sorphi 2007-08-30 引用
http://hi.baidu.com/dand2008/blog/item/d9cdf9fcbde506fffd037f69.html
2、 POST提交
对于POST方式,表单中的参数值对是通过request body发送给服务器,此时浏览器会根据网页的ContentType("text/html; charset=GBK")中指定的编码进行对表单中的数据进行编码,然后发给服务器。
在服务器端的程序中我们可以通过Request.setCharacterEncoding() 设置编码,然后通过request.getParameter获得正确的数据。
我就碰到过这个问题。页面A,response显示时ContentType为UTF-8,POST提交都自身,request接收时Encoding也是UTF-8,没有烦恼的乱码问题。结果另外一个遗留系统的页面B,ContentType为GBK,POST提交到网页A,出现乱码了。最后不得不在A网页的post参数中再多判断一个charset参数。
6 楼 laiseeme 2007-08-30 看我博客里面这个文章 在tomcat里面设置一下
http://laiseeme.iteye.com/blog/112604 7 楼 sorphi 2007-08-30 再贴一篇,关于是否能自动判断post方式提交过来的数据编码
http://www.jsfsoft.com:8080/beyond-pebble/pinxue/2006/07/27/1153934754918.html