jsp

位置:IT落伍者 >> jsp >> 浏览文章

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


发布日期:2023年07月27日
 
JSP+ MySQL中文乱码问题post提交乱码解决方案
当提交的数据中含有中文(比如变量姓名的值为中文)时mysql_insertjsp页面上显示新增的那条记录中的相应中文(姓名的值)乱码

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

现在发现当提交的数据中含有中文(比如变量姓名的值为中文)时mysql_insertjsp页面上显示新增的那条记录中的相应中文(姓名的值)乱码其他数据都显示正常查看数据库发现也是相应的含有中文的变量值(姓名的值)乱码乱码情况如下图

indexjsp 中第一行有语句<%@ page contentType="text/html;charset=gb"%> 在浏览器(chrome)中访问此页面时无乱码(主要指中文乱码英文乱码现象还没遇见过)(试过将gb换成utf访问后中文乱码)
mysql_insertjsp中第一行有语句<%@page language="java" pageEncoding="UTF"%>在浏览器中直接访问此页面时无乱码
mysql_insertjsp页面的代码如下

复制代码 代码如下:
<%@page language="java" pageEncoding="UTF"%>
<%@ page import="javasql*" %>
<HTML>
<HEAD>
<TITLE>add message into table </TITLE>
</HEAD>
<BODY>
<%
String id=requestgetParameter("id"); //从表单获得
String name=requestgetParameter("name"); //从表单获得
String sex=requestgetParameter("sex"); //从表单获得
String age=requestgetParameter("age"); //从表单获得
try
{
/** 连接数据库参数 **/
String driverName = "commysqljdbcDriver"; //驱动名称
String DBUser = "root"; //mysql用户名
String DBPasswd = ""; //mysql密码
String DBName = "html_db"; //数据库名

String connUrl = "jdbc:mysql://localhost/" + DBName + "?user=" + DBUser + "&password=" + DBPasswd;
ClassforName(driverName)newInstance();
Connection conn = DriverManagergetConnection(connUrl);
Statement stmt = conncreateStatement();
stmtexecuteQuery("SET NAMES UTF");
String insert_sql = "insert into person_tb values(" + id + "" + name + "" + sex + "" + age + ")";
String query_sql = "select * from person_tb";

try {
stmtexecute(insert_sql);
}catch(Exception e) {
eprintStackTrace();
}
try {
ResultSet rs = stmtexecuteQuery(query_sql);
while(rsnext()) {
%>
ID<%=rsgetString("id")%> </br>
姓名<%=rsgetString("name")%> </br>
性别<%=rsgetString("sex")%> </br>
年龄<%=rsgetString("age")%> </br> </br>
<%
}
}catch(Exception e) {
eprintStackTrace();
}
//rsclose();
stmtclose();
connclose();
}catch (Exception e) {
eprintStackTrace();
}
%>
</body>
</html>


我的数据库设置的是全部使用UTF编码如下图

我的虚拟目录下的webxml内容如下

tomcat/conf目录下的serverxml文件的内容如下

复制代码 代码如下:
<U><?xml version= encoding=utf?></U>
<Server port="" shutdown="SHUTDOWN">
<Listener className="orgapachecatalinacoreAprLifecycleListener" SSLEngine="on" />
<Listener className="orgapachecatalinacoreJasperListener" />
<Listener className="orgapachecatalinacoreJreMemoryLeakPreventionListener" />
<Listener className="orgapachecatalinambeansGlobalResourcesLifecycleListener" />
<Listener className="orgapachecatalinacoreThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="orgapachecatalinaUserDatabase"
description="User database that can be updated and saved"
factory="orgapachecatalinausersMemoryUserDatabaseFactory"
pathname="conf/tomcatusersxml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="" protocol="HTTP/"
connectionTimeout=""
redirectPort="" />
<Connector port="" protocol="AJP/" redirectPort="" />

<Engine name="Catalina" defaultHost="localhost">
<Realm className="orgapachecatalinarealmLockOutRealm">
<Realm className="orgapachecatalinarealmUserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="orgapachecatalinavalvesAccessLogValve" directory="logs"
prefix="localhost_access_log" suffix="txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>


tomcat/conf目录下webxml文件的主要内容如下

复制代码 代码如下:
<U><?xml version="" encoding="UTF"?></U>
<webapp xmlns="
xmlns:xsi="
xsi:schemaLocation="

version="">
<servlet>
<servletname>default</servletname>
<servletclass>orgapachecatalinaservletsDefaultServlet</servletclass>
<initparam>
<paramname>debug</paramname>
<paramvalue></paramvalue>
</initparam>
<initparam>
<paramname>listings</paramname>
<paramvalue>false</paramvalue>
</initparam>
<loadonstartup></loadonstartup>
</servlet>
<servlet>
<servletname>jsp</servletname>
<servletclass>orgapachejasperservletJspServlet</servletclass>
<initparam>
<paramname>fork</paramname>
<paramvalue>false</paramvalue>
</initparam>
<initparam>
<paramname>xpoweredBy</paramname>
<paramvalue>false</paramvalue>
</initparam>
<loadonstartup></loadonstartup>
</servlet>
<servletmapping>
<servletname>default</servletname>
<urlpattern>/</urlpattern>
</servletmapping>
<! The mappings for the JSP servlet >
<servletmapping>
<servletname>jsp</servletname>
<urlpattern>*jsp</urlpattern>
<urlpattern>*jspx</urlpattern>
</servletmapping>
<sessionconfig>
<sessiontimeout></sessiontimeout>
</sessionconfig>
<此处省略了mimemapping的内容>
<welcomefilelist>
<welcomefile>indexhtml</welcomefile>
<welcomefile>indexhtm</welcomefile>
<welcomefile>indexjsp</welcomefile>
</welcomefilelist>
</webapp>


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

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

复制代码 代码如下:
<%@ page language="java" import="javautil*" pageEncoding="utf"%>
<%@ page contentType="text/html;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的其中一个为支持中文的编码格式(如utfgbkgb因为设置一个的话另一个默认会和它一样
如果两个都设置的话必须保证两个都是支持中文编码(不一定要一样)
最佳建议设置如下
<%@ page language="java" import="javautil*" pageEncoding="utf"%>
<%@ page contentType="text/html;charset=utf"%>

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

由上所知只要charset的编码和URIEncoding的解码一致并且支持中文就能保证没有乱码
设置URIEncoding的方法如下
方法一
修改$TOMCAT/conf/serverxml文件在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时ServletRequestsetCharacterEncoding方法设置的字 符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果(在/%TomCat_Home%/ conf\serverxml文件中找到 <Connector>标记然后在后面加上useBodyEncodingForURI=true)
url方式get传值乱码
于这种方式浏览器不会采用页面的charset方式对URL中的中文进行编码后提交至服务器(IEFireFox都一样)而是采用系统的GBK转码为ISO之后提交至服务器tomcat所以这个过程为
首先url地址中的中文被从gbk转换成ISO交给tomcat后又被tomcat根据URLEcoding解码这种情况只有 把URLEcoding设置为gbk才能在requestgetParameter("")时不出现乱码但是这样就会影响到上面的配置所以一个好的 解决方法是使用javanetURLEcoder和URLDecoder对地址中的中文进行手动编码和解码
所以一个万全的解决方法为
)所有页面的charset设置为UTF
)Tomcat的URIEncoding默认是ISO而我设置为UTF主要是想解决中文命名的文件以及请求以get方式提交有可能出现的乱码问题
)添加过滤器调用requestsetCharacterEncoding("utf")方法将request的字符集设定为utf解决请求以post方式提交的乱码问题
)url地址中存在中文参数时首先对中文参数使用URLEcoder编码为utf然后在requestgetParameter("")接收到参数后再使用URLDecoder还原例如
fromjsp页面

复制代码 代码如下:
<%String username = "张某某" ;
username = URLEncoderencode(username"utf");
%>
<a href="tojsp?param=<%=username %>">转入</a>


tojsp页面

复制代码 代码如下:
<%=URLDecoderdecode(requestgetParameter("param")"utf")%>


总之 乱码的解决方案如下
post传值乱码时在接收端设置requestsetCharacterEncoding("UTF")
get传值或者url乱码时手动设置接收的参数String str = new String(requestgetParameter("something")getBytes("ISO")"utf") ;
由上可见getpost传值在tomcat中是不一样的
看完了上面红字部分的内容我决定在提交数据的页面设置以UTF的格式提交数据而同时在接收数据的页面设置也以UTF接收数据于是我在两个页面的首部都添加了如下语句
<%
requestsetCharacterEncoding("UTF");
responsesetCharacterEncoding("UTF");
responsesetContentType("text/html; charset=utf");
%>

然后测试OK了!没有乱码了!
现在indexjsp页面的代码如下

复制代码 代码如下:


<%@ page language="java" pageEncoding="utf"%>
<%@ page contentType="text/html;charset=utf"%>
<%
requestsetCharacterEncoding("UTF");
responsesetCharacterEncoding("UTF");
responsesetContentType("text/html; charset=utf");
%>
<html>
<head>
</head>
<body>
<form action="mysql_insertjsp" method="post">
ID :<input type = "text" name="id" value=""/>
姓名 :<input type = "text" name="name" value="aaa"/>
性别 :<input type = "text" name="sex" value="female"/>
年龄:<input type = "text" name="age" value=""/>
</br>
<input type = "submit" value="提交"/>
</form>
</body>
</html>

上一篇:JSP培训之购物车实例

下一篇:JSP培训之购物车实例及小结