熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JSP+ MySQL中文亂碼問題post提交亂碼解決方案

2022-06-13   來源: JSP教程 
當提交的數據中含有中文(比如變量姓名的值為中文)時mysql_insertjsp頁面上顯示新增的那條記錄中的相應中文(姓名的值)亂碼  

  寫了兩個jsp頁面indexjsp和mysql_insertjsp數據處理流程為在浏覽器(chrome)上訪問indexjsp後在其表 單上輸入數據提交至mysql_insertjspmysql_insertjsp首先將接收到的數據按變量存入MySQL的html_db數據 庫的person_tb中(該表原有部分數據)然後mysql_insertjsp再拿出該表中所有數據顯示在mysql_insertjsp頁面 上

現在發現當提交的數據中含有中文(比如變量姓名的值為中文)時mysql_insertjsp頁面上顯示新增的那條記錄中的相應中文(姓名的值)亂碼其他數據都顯示正常查看數據庫發現也是相應的含有中文的變量值(姓名的值)亂碼亂碼情況如下圖
JSP+ MySQL中文亂碼問題post提交亂碼解決方案  
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>


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20427.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.