宝哥软件园

JSP MySQL中文乱码问题邮政提交乱码解决方案

编辑:宝哥软件园 来源:互联网 时间:2021-11-17

写了两个jsp页面index.jsp和mysql_insert.jsp。数据处理流程为:在浏览器(镀铬)上访问index.jsp后在其表单上输入数据,提交至mysql_insert.jsp,mysql_insert.jsp首先将接收到的数据按变量存入关系型数据库的html_db数据库的person_tb中(该表原有部分数据),然后mysql_insert.jsp再拿出该表中所有数据显示在mysql_insert.jsp页面上。现在发现,当提交的数据中含有中文(比如变量姓名的值为中文)时,mysql_insert.jsp页面上显示新增的那条记录中的相应中文(姓名的值)乱码,其他数据都显示正常,查看数据库,发现也是相应的含有中文的变量值(姓名的值)乱码。乱码情况如下图

index.jsp中第一行有语句:% @ page ContentType=' text/html;charset=gb2312'%,在浏览器(镀铬)中访问此页面时无乱码(主要指中文乱码,英文乱码现象还没遇见过)。(试过将gb2312换成utf-8,访问后中文乱码)mysql_insert.jsp中第一行有语句:% @页面语言=' Java '页面编码=' UTF-8 ' %,在浏览器中直接访问此页面时无乱码mysql_insert.jsp页面的代码如下:复制代码代码如下:% @页面语言='java '页面编码=' UTF-8 ' % % % @页面导入=' java.sql. * ' % HTML HEAD TITLEadd将消息添加到表/TITLE/HEAD BODY % String id=请求。getparameter(' id ');//从表单获得字符串名称=请求。getParameter(' name ');//从表单获得字符串性别=请求。GetParameter(' sex ');//从表单获得字符串年龄=请求。GetParameter(' age ');//从表单获得尝试{/* * *连接数据库参数* */String驱动程序名称=' com。MySQL。JDBC。“驱动程序”;//驱动名称字符串DBUser=' root//mysql用户名字符串DBPasswd=' 123456//mysql密码字符串DBName=' html _ db//数据库名字符串conurl=' JDBC :我的SQL ://localhost/' DBNAmE '?用户=' DBUser '密码=' dbpasswdclass . for name(driver name).new INSTANCE();connection conn=Drivermanager。GetConnection(ConURl);语句stmt=conn . CreateStatement();stmt。执行查询(' SET NAMES UTF8 ');字符串insert _ SQL=' insert in person _ TB值(' id ',' name ','性别','年龄')';字符串查询_sql='从person_tb中选择* ';请尝试{ stmt。执行(insert _ SQL);}catch(异常e){ e . print stack trace();}请尝试{ ResultSet RS=stmt。执行查询(query _ SQL);而(RS。next()){ % ID:%=RS。GetString(' ID ')%/br姓名:%=rs.getString('name')% /br性别:%=rs.getString('sex')% /br年龄:%=RS。GetString(' age ')%/br/br % } } catch(异常e){ e . printstacktrace();}//RS。close();stmt。close();conn . close();}catch(异常e){ e . print stack trace();} % /body /html我的数据库设置的是全部使用UTF-8编码,如下图

我的虚拟目录下的web.xml内容如下

tomcat/conf目录下的server.xml文件的内容如下:复制代码代码如下: U?可扩展标记语言版本='1.0 '编码='utf-8 '?/U服务器端口=' 8005 '关闭='关闭'侦听器类名=' org。阿帕奇。卡特琳娜。核心。aprifecyclelistener的长度=' on '/Listener类名=' org。阿帕奇。卡特琳娜。核心。jrememoryleakprevenionlistener/' Listener类名=' org。阿帕奇。卡特琳娜。姆本。globalresourcelicycleistiner/' Listener类名=' org。阿帕奇。后缀='。' txt '模式='%h %l %u %t '%r' %s %b' /主机/引擎/服务/服务器tomcat/conf目录下web.xml文件的主要内容如下:复制代码代码如下: U?可扩展标记语言版本='1.0 '编码='UTF-8 '?/U web-app xmlns=' http://Java。星期日com/XML/ns/javaee ' xmlns : xsi=' http://www .w3。org/2001/XMLSchema-实例' xsi 3360 schema location=' http://Java。星期日http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd'版本=' 3.0 ' servlet servlet-name default/servlet-name servlet-class org。阿帕奇。catalina servlet .JSP servlet的映射-servlet -映射servlet-名称JSP/servlet-名称网址-模式*。JSP/URL-模式网址-模式*。jspx/URL-模式/servlet-映射会话-配置会话-超时30/会话-超时/会话-配置此处省略了哑剧映射的内容欢迎文件列表welcome-fileindex.html/welcome-filewelcome-fileindex.htm/welcome-filewelcome-fileindex.jsp/welcome-file/欢迎文件列表/网络应用现在我能想到的设置编码的地方也就只有这么多了,其他还有哪里需要设置编码?恳求指导。哈哈哈,经过我的一番苦苦探索,终于找到乱码的原因了,当然乱码问题也被解决了。师兄对我建议所有编码全部使用UTF-8,因此我也建议读者也这样做,好处很多。下面我介绍下我的解决过程:第一步:在我发现有乱码后,我首先想到的就是是不是我在某个地方设置的编码错误导致的,而关系型数据库里的设置是正确的(my.ini里设置),就是全部设置为utf8。所以关系型数据库下的设置我不需要修改。第二步:然后就是雄猫了,这东西要对我提交的数据进行处理,网上有许多人提出需要设置web.xml和server.xml里面的编码,其中主要是在server.xml里添加URIEncoding='UTF-8 ',具体设置为:连接器端口='8080 '协议='HTTP/1.1 '连接超时='20000 '重定向端口='8443' URIEncoding='UTF-8' /。

设置完这一步后,我又测试了一遍,发现还是乱码。保留这一步中的更改并继续下一步。第三步:回到。再次jsp页面,我尝试将所有与编码和字符集相关的地方设置为UTF-8(之前我在index.jsp的第一行写了% @ page language=' Java ' Content Type=' text/html;charset=GB 2312“%,现在使用dreamweaver打开index.jsp并将其修改为charset=utf-8),然后在浏览器中直接访问index.jsp并发现中文中有乱码字符,因此关闭dreamweaver并使用myeclipse重新打开index.jsp文件。发现代码中的中文是乱码,果断改成了正确的汉字,同时保留了刚才对charset的修改,即仍然使用charset=utf-8,然后在浏览器中重访index.jsp,最后汉字显示正常。(从此告别dreamweaver,省了我不少时间。)然后我在index.jsp页面输入中文数据并提交,但还是乱码中文。经过这次修改,我的两个标题。jsp文件有以下两句:% @ page language=' Java ' page coding=' utf-8 ' % @ page content type=' text/html;Charset=utf-8'% Step 4:我只是在想,是把数据存进数据导致的乱码,还是从数据库中取数据导致的乱码?还是提交后将数据传输到mysql_insert.jsp页面时出现乱码?然后我直接将一段包含汉字的数据插入数据库,然后在浏览器中直接访问mysql_insert.jsp,发现汉字可以正常显示。也就是说,它在存储数据或传输数据时是乱码的。那么如何设置才能不传输数据,保存数据不乱码呢?第五步:我在网上搜索了一下,发现了以下内容,非常有用:1。设置jsp页面的编码方式有两个地方:复制代码的代码如下:% @ page language=' Java ' import=' Java . util . * ' page coding=' utf-8 ' % % @ page content type=' text/html;Charset=utf-8'%其中:pageEncoding是指jsp文件在本地保存时的编码方式。内容字符集指的是服务器向客户端发送web内容时使用的编码。从第一次访问jsp页面,到将页面发送到客户端,jsp页面必须经历三个编码转换:第一个阶段是将Jsp编译成。java,它将根据pageEncoding的设置读取jsp,结果是指定的编码方案将被翻译成统一的UTF-8 JAVA源代码(即。java)。如果页面编码设置不正确,中文乱码就会出来。第二阶段是从JAVAC的JAVA源代码编译成java byteCode。无论在编写JSP时使用什么编码方案,这个阶段的结果都是所有UTF-8编码的java源代码。JAVAC读取带有UTF-8编码的java源代码,并将其编译成UTF-8编码的二进制代码(即。类),这是JVM用java编码表达常量字符串的规范。在第三阶段,Tomcat(或其应用程序容器)加载并执行第二阶段的JAVA二进制代码,在客户端可以看到输出结果。此时隐藏在第一、第二阶段的参数contentType已经发挥了作用,所以最终的解决方案是在jsp页面上设置pageEncoding或contentType中的一种作为支持中文的编码格式(如utf-8、gbk、gb2312)。因为如果你设置一个,默认情况下另一个会和它一样。如果都设置了,必须保证都支持中文编码(不一定相同)。推荐的设置如下:% @ page language=' Java ' import=' Java . util . * ' page coding=' utf-8 ' % % @ page content type=' text/html;charset=utf-8“% 2”。post模式下值传递的加扰:由于post模式下的值传递是按请求存储的,信息是在另一页按request.getparameter(字符串名称)提取的,这种情况下的加扰主要是由request中存储的信息的编码设置引起的。提交帖子时,如果没有设置提交的编码格式,会以iso8859-1的方式提交,但接受的jsp会以utf-8的方式接受。

因此,可以通过使用以下语句获得一个正确的中文字符串:string str=new string (request。getparameter('某物')。getbytes ('iso-8859-1 ',' utf-8 ');解决方法:1。设置请求。接收页上的setcharacterencoding ('utf-8 ')。其次,最好通过过滤器将每个页面设置为request . setcharacter encoding(' utf-8 ')。第三,在发送数据的页面上,使用语句指定应该使用UTF-8格式发送数据。3.get模式下的值传递代码不正确:get模式下的值传递有两种,一种是form get,另一种是url地址传递(本质上两种方法都是通过url参数传递值)。按表单获取值传递:按表单获取值传递的编码过程是:首先浏览器根据页面的字符集编码方式对值传递进行编码,然后提交给服务器进行tomcat。tomcat在对这些信息进行解码时,采用的解码方式是由server.xml文件中的URIEncoding设置决定的,也就是说,当我们使用request.getParameter(')命令获取表单参数值时,得到的字符串由charset编码,由URIEncoding解码。据我们所知,只要字符集的编码和URIEncoding的解码一致,并且支持中文,就不能有乱码。设置URIEncoding的方法如下:方法一:修改$TOMCAT/conf/server.xml文件,将URIEncoding='UTF-8 '添加到HTTP Connector或AJP Connector的配置中,复制代码如下:maxthreads=' 150 ' minpare threads=' 25 ' maxsparyreads=' 75 ' enable looks=' fal。se ' redirectport=' 8443 ' accept count=' 100 ' connection time out=' 20000 ' disableuploadtime out=' true ' uri Encoding=' utf-8 '/方法2:使用useBodyEncodingForURI='true '。这个方法适合在您的TOMCAT实例下运行多个不同编码的程序。复制代码如下:maxthreads=' 150 ' minpare threads=' 25 ' maxspareatheads=' 75 '启用查找=' false '重定向端口=' 8443 '接受计数=' 100 '连接ti。meout=' 20000 ' disableuploadtime out=' true ' useBodyEncodingForURI=' true '/enablelooks=' 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文件中找到Connector标记,然后添加usebodyencodingforuri=true)。这样,浏览器就不会在页面的字符集模式下对url中的中文进行编码并提交给服务器(IE、FireFox都是一样的),而是使用系统的gbk转码为ISO-8859-1再提交给tomcat,所以这个过程如下:首先将URL地址中的中文从gbk转换为ISO-8859-1,交给tomcat后,由tomcat根据URL编码进行解码。在这种情况下,只有当网址编码设置为GBK时,它才能在请求中使用。但是这样会影响上面的配置,所以一个很好的解决方案就是使用java.net.URLEcoder和URLDecoder对地址中的中文进行手动编码和解码。因此,一个完美的解决方案是:1)将所有页面的字符集设置为UTF-8。2)2)Tomcat的默认URIEncoding是ISO-8859-1,而我设置为UTF-8,主要是为了解决中文命名的文件可能出现乱码的问题,请求在get中提交。3)添加过滤器并调用请求。setCharacterencoding ('utf-8 ')方法,将请求的字符集设置为utf-8,从而解决邮寄提交请求的乱码问题。4)当4)url地址中有中文参数时,先用URLECODER将中文参数编码成utf-8,收到request.getParameter(')的参数后再用URLEcoder还原。

例如:from.jsp页面:复制代码代码如下:%字符串用户名='张某某;username=urlencoder。编码(用户名,' utf-8 ');% a href='to.jsp?参数=%=用户名% '转入/a to.jsp页面复制代码代码如下:%=URLdecader。解码(请求。GetParameter(' param '),' utf-8')%总之,乱码的解决方案如下:帖子传值乱码时,在接收端设置请求。setcharacterencoding(' UTF-8 ')获取传值或者全球资源定位器(统一资源定位符)乱码时,手动设置接收的参数字符串字符串=新字符串(请求。GetParameter('某物')。getBytes('ISO-8859-1 ',' utf-8 ');由上可见获取,发布传值在tomcat5中是不一样的。看完了上面红字部分的内容,我决定在提交数据的页面设置以UTF-8的格式提交数据,而同时在接收数据的页面设置也以UTF-8接收数据,于是我在两个页面的首部都添加了如下语句:%请求。setcharacter encoding(' UTF-8 ');回应。setcharacter encoding(' UTF-8 ');回应。setcontenttype(' text/html;charset=utf-8 ');% 然后测试,好的了!没有乱码了!现在,index.jsp页面的代码如下:复制代码代码如下: %@页面语言=' Java '页面编码=' utf-8 ' % % % @页面内容类型=' text/html;charset=utf-8"% %请求。setcharacter encoding(' UTF-8 ');回应。setcharacter encoding(' UTF-8 ');回应。setcontenttype(' text/html;charset=utf-8 ');% html头/头体形式动作=' MySQL _ insert。“JSP”方法=' post ' ID :输入类型=' text '名称=' ID '值=' 0 '/姓名:输入类型='text' name='name' value='aaa'/性别:输入类型='文本'名称='性别'值='女性'/年龄:输入类型=“文本”名称='年龄'值=' 20 '/br输入类型='提交'值='提交//表单/正文/html

更多资讯
游戏推荐
更多+