当前位置:  编程技术>java/j2ee

JSP+ MySQL中文乱码问题post提交乱码解决方案

    来源: 互联网  发布时间:2014-10-19

    本文导语:  写了两个jsp页面index.jsp和mysql_insert.jsp。数据处理流程为:在浏览器(chrome)上访问index.jsp后在其表单上输入数据,提交至mysql_insert.jsp,mysql_insert.jsp首先将接收到的数据按变量存入MySQL的html_db数据库的person_tb中(该表原有部分...

写了两个jsp页面index.jsp和mysql_insert.jsp。数据处理流程为:在浏览器(chrome)上访问index.jsp后在其表单上输入数据,提交至mysql_insert.jsp,mysql_insert.jsp首先将接收到的数据按变量存入MySQL的html_db数据库的person_tb中(该表原有部分数据),然后mysql_insert.jsp再拿出该表中所有数据显示在mysql_insert.jsp页面上。

现在发现,当提交的数据中含有中文(比如变量姓名的值为中文)时,mysql_insert.jsp页面上显示新增的那条记录中的相应中文(姓名的值)乱码,其他数据都显示正常,查看数据库,发现也是相应的含有中文的变量值(姓名的值)乱码。乱码情况如下图:
 
index.jsp中第一行有语句: ,在浏览器(chrome)中访问此页面时无乱码(主要指中文乱码,英文乱码现象还没遇见过)。(试过将gb2312换成utf-8,访问后中文乱码)
mysql_insert.jsp中第一行有语句:,在浏览器中直接访问此页面时无乱码。
mysql_insert.jsp页面的代码如下:
代码如下:





add message into table



ID:

姓名:

性别:

年龄:






我的数据库设置的是全部使用UTF-8编码,如下图:
 
我的虚拟目录下的web.xml内容如下:
 
tomcat/conf目录下的server.xml文件的内容如下:
代码如下:


























tomcat/conf目录下web.xml文件的主要内容如下:
代码如下:




default
org.apache.catalina.servlets.DefaultServlet

debug
0


listings
false

1


jsp
org.apache.jasper.servlet.JspServlet

fork
false


xpoweredBy
false

3


default
/



jsp
*.jsp
*.jspx


30



index.html
index.htm
index.jsp



现在我能想到的设置编码的地方也就只有这么多了,其他还有哪里需要设置编码?恳求指导。
哈哈哈,经过我的一番苦苦探索,终于找到乱码的原因了,当然乱码问题也被解决了。师兄对我建议所有编码全部使用UTF-8,因此我也建议读者也这样做,好处很多。
下面我介绍下我的解决过程:
第一步:在我发现有乱码后,我首先想到的就是是不是我在某个地方设置的编码错误导致的,而MysQL里的设置是正确的(my.ini里设置),就是全部设置为utf8。所以MySQL下的设置我不需要修改。
第二步:然后就是tomcat了,这东西要对我提交的数据进行处理,网上有许多人提出需要设置web.xml和server.xml里面的编码,其中主要是在server.xml里添加URIEncoding="UTF-8",具体设置为:。在我完成这一步的设置之后再次测试,发现还是乱码。保留这一步的修改,进行下一步。
第三步:再次回到.jsp页面,我试着将所有涉及到编码和字符集的地方都设置为UTF-8(我之前在index.jsp中首行写的是 ,现在使用dreamweaver打开index.jsp将其修改为charset=utf-8),然后在浏览器直接访问index.jsp发现中文有乱码,于是关闭dreamweaver,使用myeclipse重新打开index.jsp文件,发现代码中的中文就是乱码,果断修改成正确的中文字符,同时保留刚才对charset的修改,即仍然使用charset=utf-8,然后重新在浏览器访问index.jsp,终于中文字符正常显示了。(以后从此告别dreamweaver,害我饶了好多路)然后我在index.jsp页面上输入中文数据并提交,依然是中文乱码。做了这一步的修改后,我的两个.jsp文件的头部均有如下两句:



第四步:我刚才在想,到底是往数据库存数据时导致的乱码还是从数据库取数据时导致的乱码呢?再或者是在提交后传输数据到mysql_insert.jsp页面时导致的乱码?然后我直接在数据库中插入一条含有中文字符的数据,然后在浏览器直接访问mysql_insert.jsp,发现中文字符能正常显示。那就是说,是在存数据,或者传输数据时乱码的了。那么该怎么设置才能不至于传数据、存数据不乱码呢?
第五步:网上找了下,找到如下内容,非常有用:
1、jsp页面的编码方式有两个地方需要设置:
代码如下:




其中:pageEncoding 指的是jsp文件本身在本地保存时的编码方式。contentType的charset是指服务器发送网页内容给客户端时所使用的编码。
从第一次访问一个jsp页面开始,到这个页面被发送到客户端,这个Jsp页面要经过三次编码转换:
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效
所以最终的解决方法为:
在jsp页面设置pageEncoding或者contentType的其中一个为支持中文的编码格式(如utf-8,gbk,gb2312)。因为设置一个的话,另一个默认会和它一样。
如果两个都设置的话,必须保证两个都是支持中文编码(不一定要一样)。
最佳建议设置如下:



2、post方式传值乱码:
由于post方式传值是通过request存储的,在另一个页面也是通过request.getParameter(String name)来提取信息,所以这种情况下的乱码主要是因为request存储信息的编码设置导致的。post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。所以使用如下语句即可得到单个正确的中文字符串:String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;
解决方法:
一、在接收页面设置request.setCharacterEncoding("UTF-8")。
二、最好通过过滤器实现每个页面都设置为request.setCharacterEncoding("UTF-8")。
三、在发送数据的页面使用语句指定使用UTF-8格式发送数据。
3、get方式传值乱码:
get方式传值有两种,一种是表单get传值,另一种是url地址传值(实质上这两种方式都是通过url参数的方式传值)。
表单方式get传值:
表单方式get传值的编码过程为,首先浏览器根据页面的charset编码方式对传值进行编码,然后提交至服务器交给tomcat,tomcat对这些信息进行解码时,采用的解码方式是由server.xml文件中的URIEncoding设置决定的,也就是说,当我们使用命令request.getParameter("")获取表单参数值时,得到的字符串,经过了charset的编码和URIEncoding的解码。

由上所知,只要charset的编码和URIEncoding的解码一致,并且支持中文,就能保证没有乱码。
  设置URIEncoding的方法如下:
  方法一:
  修改$TOMCAT/conf/server.xml文件,在HTTP Connector或者AJP Connector的配置加上URIEncoding="UTF-8"
代码如下:



 方法二:
  使用useBodyEncodingForURI="true". 这个方法适合你的TOMCAT实例下需要跑多个不同Encoding的程序时。
代码如下:


enableLookups="false" redirectPort="8443" protocol="AJP/1.3" useBodyEncodingForURI="true" />

在Tomcat配置中,连接器(HTTP Connector)属性中有一个URIEncoding和
  useBodyEncodingForURI属性,这两个属性设置对URL后的附加参数进行URL解码时该如何选择 字符集编码。URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI 则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置,也就是说当 useBodyEncodingForURI属性设置为true时ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/ confserver.xml文件中找到 标记,然后在后面加上useBodyEncodingForURI=true)
  url方式get传值乱码:
  于这种方式,浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE,FireFox都一样),而是采用系统的GBK转码为ISO-8859-1之后提交至服务器tomcat,所以这个过程为:
  首先,url地址中的中文被从gbk转换成ISO-8859-1,交给tomcat后,又被tomcat根据URLEcoding解码,这种情况,只有把URLEcoding设置为gbk才能在request.getParameter("")时不出现乱码。但是这样就会影响到上面的配置,所以一个好的解决方法是,使用java.net.URLEcoder和URLDecoder对地址中的中文进行手动编码和解码。
  所以一个万全的解决方法为:
  1)所有页面的charset设置为UTF-8。
  2)Tomcat的URIEncoding默认是ISO-8859-1,而我设置为UTF-8,主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题。
  3)添加过滤器,调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8,解决请求以post方式提交的乱码问题。
  4)url地址中存在中文参数时,首先对中文参数使用URLEcoder编码为utf-8,然后在request.getParameter("")接收到参数后再使用URLDecoder还原。例如:
  from.jsp页面:
代码如下:

to.jsp页面
代码如下:



总之 ,乱码的解决方案如下:
  post传值乱码时,在接收端设置request.setCharacterEncoding("UTF-8")
  get传值或者url乱码时,手动设置接收的参数String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ;
  由上可见get,post传值在tomcat5中是不一样的.
看完了上面红字部分的内容,我决定在提交数据的页面设置以UTF-8的格式提交数据,而同时在接收数据的页面设置也以UTF-8接收数据,于是我在两个页面的首部都添加了如下语句:


然后测试,OK了!没有乱码了!
现在,index.jsp页面的代码如下:
代码如下:









ID :
姓名 :
性别 :
年龄:







    
 
 

您可能感兴趣的文章:

  • jsp中文乱码 jsp mysql 乱码的解决方法
  • jsp中文乱码问题(有点特殊),高手进。。。
  • solaris 里面JSP get方式传中文参数 出现乱码的问题
  • 用jsp连上oracle后,在JSP中用(INSERT)插入中文数据后,显示乱码,有办法吗?
  • 解决jsp页面使用网络路径访问图片的乱码问题
  • apache web server + jsp的乱码问题!!!!!
  • JSP中URL的乱码问题!(传递中文)
  • jsp页面传参乱码的解决方法
  • 散分问题:jsp里的乱码问题
  • 使用jsp中url跳转时,怎样让它变成乱码使客户端看不到?
  • 基于jsp:included的使用与jsp:param乱码的解决方法
  • 为什么我访问tomcat4.0的jsp网页,总是乱码???急,,解答给全分
  • 我的JSP为什么输入的是乱码?
  • 为什么在jsp程序中写中文运行后出现乱码?如何解决?我用的是weblogic5.0
  • jsp传值本地无乱码测试机出现乱码问题解决
  • JSP乱码问题,请进!
  • JSP页面传参出现中文乱码的解决方案
  • 在jsp中调用bean,中文在网页上是乱码,手动选字符集才正常
  • jsp超链接中文乱码的解决方法
  • jsp之间传参数接受中文有乱码问题解决方法
  • 想把一个jsp转到另一个jsp页面,要穿参数,中文的(jsp变量)。谁教教我?!
  • 字符集问题--jsp中charset参数值的简体中文值是什么,GB2312是繁体中文吧?
  • 请教:关于英文,简体中文,繁体中文在JSP/JAVA中的整体解决方案!!!
  • 在forte for java 4的Source Editor中编辑jsp时候,可以输入中文,可是保存后关闭再打开,中文显示???,怎么回事啊
  • 请教:关于英文,简体中文,繁体中文在JSP/JAVA中的整体解决方案!!!!!
  • jsp和JAVABEAN的中文显示问题
  • 为什么JSP在JB6.0中显示正常(中文可以显示),但在IE6.0中无法正常显示(中文全为乱码)???
  • JSP的中文问题,如何在<form>中提交中文,用,request.getParameter收中文啊?
  • 各位高手:jsp文件包含jsp文件时的中文问题
  • iplant jsp中文问题
  • JSP的中文问题啊,我就快疯了
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • jsp怎么取<a href=/tech-java/___/id1/value/gt;提交的id1的值.html
  • 一个框界网爷包含上下两个网页a1.jsp和a2.jsp,怎么实现a1.jsp自身不变且提交数据到下面的a2.jsp呢?不胜感激,急..
  • 如何提交下拉框控件的值到jsp页面,我用的是连接传递参数的方式,而不是表单提交,大家快帮忙。
  • jsp提交表单时怎样区分多个submit?
  • 怎样利用JAVABEAN将JSP页面提交的数据保存到数据库,请给代码好吗?谢谢!
  • 在制作的留言簿上提交jsp的源代码的问题,
  • JSP网页向SQLSERVER同时提交7万多字,怎么实现!
  • 如何通过其他网站发送短消息(比如新浪)?JSP页面提交,高分请教!!
  • jsp提交到Servlet报404错误问题解决(webroot下子目录)
  • 怎么能把from中提交的东西当成jsp程序执行?
  • jsp无法提交nicEdit中的内容的解决方法
  • 请教在Servlet中如何取得JSP中提交的radio对象和checkbox的值?
  • 比较菜鸟的问题我怎么在jsp或javabean中得到前面提交过来的那一页的URL
  • 得分套餐(32分):8。用TOMCAT时JSP表单提交信息给SERVLET处理时,“FORM ACTION=”后的SERVLET文件路径写什么?
  • 在JSP页面中要如何接收FORM表单提交的表元数组,请高手指点
  • JSP高手请进:如何才能把表单中提交的值传递到存储过程中的参数中?
  • 关于jsp中form提交和中文传参问题
  • 怎么用jsp向oracle8提交长字符(15000字左右)?
  • 怎样利用html中的超链接来执行一个servlet或者提交该页面上的数据给一个JSP
  • 请教:如何在一个页面提交的.jsp中根据条件需要什么也不改变。(一定加分)
  • JSP中清空cookie代码参考
  • 现有1.jsp、2.jsp、3.jsp三个文件,我怎么在3.jsp文件中得到1.jsp中输入的值?
  • 怎么能把from中提交的东西当成jsp程序执行? iis7站长之家
  • 请问<%@include file="abc.jsp"%>与<jsp:include page="abc.jsp"/>之间的差别
  • response.sendRedirect("index.jsp") 和 <jsp:forward page="index.jsp"/>的区别?
  • aaa.jsp有如下链接,当单击该链接时将id值传递给bbb.jsp,怎样在bbb.jsp中引用这个id值?
  • jsp+bean还是jsp+ejb还是jsp+servlet还是asp+activex好?
  • 谁能告诉我,怎么调试jsp程序呀!我在jsp中调用java,但是Tomcat这家伙只会给我报jsp文件出错。这可怎么办呀?
  • jsp中如何获得当前jsp文件所在的目录,用request.getServletPath()得到的路径含有jsp文件名,有没有办法得到目录(不含文件名)?
  • 初学jsp,一个html调用一个jsp,这个jsp调用一个javaBean,已编译成类,最后如何部署(用j2sdkee)?
  • 我要学jsp,已经下载了j2ee1.4,需要一个支持jsp引擎的WEB服务器或jsp引擎!!(急,马上给分)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3