知识大全 JSP+ MySQL中文乱码问题post提交乱码解决方案
Posted 中文
篇首语:愿君学长松,慎勿作桃李。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JSP+ MySQL中文乱码问题post提交乱码解决方案相关的知识,希望对你有一定的参考价值。
JSP+ MySQL中文乱码问题post提交乱码解决方案 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
当提交的数据中含有中文(比如变量姓名的值为中文)时 mysql_insert jsp页面上显示新增的那条记录中的相应中文(姓名的值)乱码写了两个jsp页面index jsp和mysql_insert jsp 数据处理流程为 在浏览器(chrome)上访问index jsp后在其表 单上输入数据 提交至mysql_insert jsp mysql_insert jsp首先将接收到的数据按变量存入MySQL的_db数据 库的person_tb中(该表原有部分数据) 然后mysql_insert jsp再拿出该表中所有数据显示在mysql_insert jsp页面 上 现在发现 当提交的数据中含有中文(比如变量姓名的值为中文)时 mysql_insert jsp页面上显示新增的那条记录中的相应中文(姓名的值)乱码 其他数据都显示正常 查看数据库 发现也是相应的含有中文的变量值(姓名的值)乱码 乱码情况如下图 index jsp 中第一行有语句 <%@ page contentType="text/;charset=gb "%> 在浏览器(chrome)中访问此页面时无乱码(主要指中文乱码 英文乱码现象还没遇见过) (试过将gb 换成utf 访问后中文乱码) mysql_insert jsp中第一行有语句 <%@page language="java" pageEncoding="UTF "%> 在浏览器中直接访问此页面时无乱码 mysql_insert jsp页面的代码如下
复制代码 代码如下: <%@page language="java" pageEncoding="UTF "%> <%@ page import="java sql *" %> <HTML> <HEAD> <TITLE>add message into table </TITLE> </HEAD> <BODY> <% String id=request getParameter("id"); //从表单获得 String name=request getParameter("name"); //从表单获得 String sex=request getParameter("sex"); //从表单获得 String age=request getParameter("age"); //从表单获得 try /** 连接数据库参数 **/ String driverName = " mysql jdbc Driver"; //驱动名称 String DBUser = "root"; //mysql用户名 String DBPasswd = " "; //mysql密码 String DBName = "_db"; //数据库名 String connUrl = "jdbc:mysql://localhost/" + DBName + "?user=" + DBUser + "&password=" + DBPasswd; Class forName(driverName) newInstance(); Connection conn = DriverManager getConnection(connUrl); Statement stmt = conn createStatement(); stmt executeQuery("SET NAMES UTF "); String insert_sql = "insert into person_tb values( " + id + " " + name + " " + sex + " " + age + " )"; String query_sql = "select * from person_tb"; try stmt execute(insert_sql); catch(Exception e) e printStackTrace(); try ResultSet rs = stmt executeQuery(query_sql); while(rs next()) %> ID <%=rs getString("id")%> </br> 姓名 <%=rs getString("name")%> </br> 性别 <%=rs getString("sex")%> </br> 年龄 <%=rs getString("age")%> </br> </br> <% catch(Exception e) e printStackTrace(); //rs close(); stmt close(); conn close(); catch (Exception e) e printStackTrace(); %> </body> </>我的数据库设置的是全部使用UTF 编码 如下图 我的虚拟目录下的web xml内容如下 tomcat/conf目录下的server xml文件的内容如下
复制代码 代码如下: <U><?xml version= encoding= utf ?></U> <Server port=" " shutdown="SHUTDOWN"> <Listener className=" apache catalina core AprLifecycleListener" SSLEngine="on" /> <Listener className=" apache catalina core JasperListener" /> <Listener className=" apache catalina core JreMemoryLeakPreventionListener" /> <Listener className=" apache catalina mbeans GlobalResourcesLifecycleListener" /> <Listener className=" apache catalina core ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name=UserDatabase auth="Container" type= apache catalina UserDatabase description="User database that can be updated and saved" factory=" apache catalina users MemoryUserDatabaseFactory" pathname="conf/tomcat users xml" /> </GlobalNamingResources> <Service name=Catalina> <Connector port=" " protocol="HTTP/ " connectionTimeout=" " redirectPort=" " /> <Connector port=" " protocol="AJP/ " redirectPort=" " /> <Engine name=Catalina defaultHost="localhost"> <Realm className=" apache catalina realm LockOutRealm"> <Realm className=" apache catalina realm UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name=localhost appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className=" apache catalina valves AccessLogValve" directory="logs" prefix="localhost_access_log " suffix=" txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>tomcat/conf目录下web xml文件的主要内容如下
复制代码 代码如下: <U><?xml version=" " encoding="UTF "?></U> <web app xmlns=" xmlns:xsi=" xsi:schemaLocation=" version=" "> <servlet> <servlet name>default</servlet name> <servlet class> apache catalina servlets DefaultServlet</servlet class> <init param> <param name>debug</param name> <param value> </param value> </init param> <init param> <param name>listings</param name> <param value>false</param value> </init param> <load on startup> </load on startup> </servlet> <servlet> <servlet name>jsp</servlet name> <servlet class> apache jasper servlet JspServlet</servlet class> <init param> <param name>fork</param name> <param value>false</param value> </init param> <init param> <param name>xpoweredBy</param name> <param value>false</param value> </init param> <load on startup> </load on startup> </servlet> <servlet mapping> <servlet name>default</servlet name> <url pattern>/</url pattern> </servlet mapping> <! The mappings for the JSP servlet > <servlet mapping> <servlet name>jsp</servlet name> <url pattern>* jsp</url pattern> <url pattern>* jspx</url pattern> </servlet mapping> <session config> <session timeout> </session timeout> </session config> <此处省略了mime mapping的内容> <wele file list> <wele file>index </wele file> <wele file>index </wele file> <wele file>index jsp</wele file> </wele file list> </web app>现在我能想到的设置编码的地方也就只有这么多了 其他还有哪里需要设置编码?恳求指导 哈哈哈 经过我的一番苦苦探索 终于找到乱码的原因了 当然乱码问题也被解决了 师兄对我建议所有编码全部使用UTF 因此我也建议读者也这样做 好处很多 下面我介绍下我的解决过程 第一步 在我发现有乱码后 我首先想到的就是是不是我在某个地方设置的编码错误导致的 而MysQL里的设置是正确的(my ini里设置) 就是全部设置为utf 所以MySQL下的设置我不需要修改 第 二步 然后就是tomcat了 这东西要对我提交的数据进行处理 网上有许多人提出需要设置web xml和server xml里面的编码 其中主要是 在server xml里添加URIEncoding="UTF " 具体设置为 <Connector port=" " protocol="HTTP/ " connectionTimeout=" " redirectPort=" " URIEncoding="UTF " /> 在我完成这一步的设置之后再次测试 发现还是乱码 保留这一步的修改 进行下一步 第三 步 再次回到 jsp页面 我试着将所有涉及到编码和字符集的地方都设置为UTF (我之前在index jsp中首行写的是<%@page language="java" contentType="text/; charset=gb " %> 现在使用dreamweaver打开index jsp将其修改为charset=utf ) 然后在浏览器直接访问index jsp发现中文有乱 码 于是关闭dreamweaver 使用myeclipse重新打开index jsp文件 发现代码中的中文就是乱码 果断修改成正确的中文字符 同 时保留刚才对charset的修改 即仍然使用charset=utf 然后重新在浏览器访问index jsp 终于中文字符正常显示了 (以后从 此告别dreamweaver 害我饶了好多路)然后我在index jsp页面上输入中文数据并提交 依然是中文乱码 做了这一步的修改后 我的两 个 jsp文件的头部均有如下两句 <%@ page language="java" pageEncoding="utf "%> <%@ page contentType="text/;charset=utf "%> 第 四步 我刚才在想 到底是往数据库存数据时导致的乱码还是从数据库取数据时导致的乱码呢?再或者是在提交后传输数据到mysql_insert jsp页 面时导致的乱码?然后我直接在数据库中插入一条含有中文字符的数据 然后在浏览器直接访问mysql_insert jsp 发现中文字符能正常显示 那 就是说 是在存数据 或者传输数据时乱码的了 那么该怎么设置才能不至于传数据 存数据不乱码呢? 第五步 网上找了下 找到如下内容 非常有用 jsp页面的编码方式有两个地方需要设置
复制代码 代码如下: <%@ page language="java" import="java util *" pageEncoding="utf "%> <%@ page contentType="text/;charset=utf "%>其中 pageEncoding 指的是jsp文件本身在本地保存时的编码方式 contentType的charset是指服务器发送网页内容给客户端时所使用的编码 从第一次访问一个jsp页面开始 到这个页面被发送到客户端 这个Jsp页面要经过三次编码转换 第一阶段是jsp编译成 java 它会根据pageEncoding的设定读取jsp 结果是由指定的编码方案翻译成统一的UTF JAVA源码(即 java) 如果pageEncoding设定错了 或没有设定 出来的就是中文乱码 第二阶段是由JAVAC的JAVA源码至java byteCode的编译 不论JSP编写时候用的是什么编码方案 经过这个阶段的结果全部是UTF 的encoding的java源码 JAVAC用UTF 的encoding读取java源码 编译成UTF encoding的二进制码(即 class) 这是JVM对常数字串在二进制码(java encoding)内表达的规范 第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码 输出的结果 也就是在客户端见到的 这时隐藏在阶段一和阶段二的参数contentType就发挥了功效 所以最终的解决方法为 在jsp页面设置pageEncoding或者contentType的其中一个为支持中文的编码格式(如utf gbk gb ) 因为设置一个的话 另一个默认会和它一样 如果两个都设置的话 必须保证两个都是支持中文编码(不一定要一样) 最佳建议设置如下 <%@ page language="java" import="java util *" pageEncoding="utf "%> <%@ page contentType="text/;charset=utf "%> post方式传值乱码 由 于post方式传值是通过request存储的 在另一个页面也是通过request getParameter(String name)来提取信息 所以这种情况下的乱码主要是因为request存储信息的编码设置导致的 post提交时 如果没有设置提交的编码格式 则会以 iso 方式进行提交 接受的jsp却以utf 的方式接受 所以使用如下语句即可得到单个正确的中文字符串 String str = new String(request getParameter("something") getBytes("ISO ") "utf ") ; 解决方法 一 在接收页面设置request setCharacterEncoding("UTF ") 二 最好通过过滤器实现每个页面都设置为request setCharacterEncoding("UTF ") 三 在发送数据的页面使用语句指定使用UTF 格式发送数据 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 "
复制代码 代码如下: < maxThreads=" " minSpareThreads=" " maxSpareThreads=" " enableLookups="false" redirectPort=" " acceptCount=" " connectionTimeout=" " disableUploadTimeout="true" URIEncoding="UTF " />方法二 使用useBodyEncodingForURI="true" 这个方法适合你的TOMCAT实例下需要跑多个不同Encoding的程序时
复制代码 代码如下: < maxThreads=" " minSpareThreads=" " maxSpareThreads=" " enableLookups="false" redirectPort=" " acceptCount=" " connectionTimeout=" " disableUploadTimeout="true" useBodyEncodingForURI="true" /> enableLookups="false" redirectPort=" " protocol="AJP/ " useBodyEncodingForURI="true" />在Tomcat配置中 连接器(HTTP Connector)属性中有一个URIEncoding和 useBodyEncodingForURI属性 这两个属性设置对URL后的附加参数进行URL解码时该如何选择 字符集编码 URIEncoding用于制定URL后的附加参数的字符集编码 useBodyEncodingForURI 则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置 也就是说当 useBodyEncodingForURI属性设置为true时ServletRequest setCharacterEncoding方法设置的字 符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果 (在/%TomCat_Home%/ conf\\server xml文件中找到 <Connector>标记 然后在后面加上useBodyEncodingForURI=true) url方式get传值乱码 于这种方式 浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IE FireFox都一样) 而是采用系统的GBK转码为ISO 之后提交至服务器tomcat 所以这个过程为 首先 url地址中的中文被从gbk转换成ISO 交给tomcat后 又被tomcat根据URLEcoding解码 这种情况 只有 把URLEcoding设置为gbk才能在request getParameter("")时不出现乱码 但是这样就会影响到上面的配置 所以一个好的 解决方法是 使用java net URLEcoder和URLDecoder对地址中的中文进行手动编码和解码 所以一个万全的解决方法为 )所有页面的charset设置为UTF )Tomcat的URIEncoding默认是ISO 而我设置为UTF 主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题 )添加过滤器 调用request setCharacterEncoding("utf ")方法将request的字符集设定为utf 解决请求以post方式提交的乱码问题 )url地址中存在中文参数时 首先对中文参数使用URLEcoder编码为utf 然后在request getParameter("")接收到参数后再使用URLDecoder还原 例如 from jsp页面
复制代码 代码如下: <%String username = "张某某" ; username = URLEncoder encode(username "utf "); %> <a href="to jsp?param=<%=username %>">转入</a>to jsp页面
复制代码 代码如下: <%=URLDecoder decode(request getParameter("param") "utf ")%>总之 乱码的解决方案如下 post传值乱码时 在接收端设置request setCharacterEncoding("UTF ") get传值或者url乱码时 手动设置接收的参数String str = new String(request getParameter("something") getBytes("ISO ") "utf ") ; 由上可见get post传值在tomcat 中是不一样的 看完了上面红字部分的内容 我决定在提交数据的页面设置以UTF 的格式提交数据 而同时在接收数据的页面设置也以UTF 接收数据 于是我在两个页面的首部都添加了如下语句 <% request setCharacterEncoding("UTF "); response setCharacterEncoding("UTF "); response setContentType("text/; charset=utf "); %> 然后测试 OK了!没有乱码了! 现在 index jsp页面的代码如下
复制代码 代码如下: cha138/Article/program/Java/JSP/201311/20427相关参考
知识大全 解析Hibernate + MySQL中文乱码问题
解析Hibernate+MySQL中文乱码问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如
知识大全 Struts里提交中文表单到ActionForm的乱码问题
Struts里提交中文表单到ActionForm的乱码问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一
在jsp和servlet的开发中今天自己做的一个小例子中出现了中文乱码问题用了许多方法发现还是解决不了最后我用了过滤器才算终结 此方法总结如下在jsp页面中使用<%@pagepageEnc
页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码解决方法只要在页面开始地方用下面代码指定字符集编码即可代码如下 <%@pagecontentType="text
常见JSP中文乱码例子及其解决方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JSP开发应用
JSP中文字符乱码处理的2种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinzh
JSP页面传值中文乱码的简单解决方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 源代码ajs
改默认编码 /etc/initd/mysqlstart(stop)为启动和停止服务器 /etc/mysql/主要配置文件所在位置f /var/lib/mysql/放置的是数据库表文件夹这里的
解决XMLHTTP提交过时返回乱码问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如
Jsp环境下的AJAX乱码问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138