當使用JSP頁面將中文數據添加到MySql數據庫中的時候發現變為亂碼,或者從mysql中讀取中文的時候出現亂碼,這些問題根源都是由于字符編碼不一致造成的。要知道病源是什么我們才能對癥下藥,所以我將問題產生的過程簡單描述一下(如有不對望高人賜教)
?我們以一個從form表單讀取數據并寫入mysql數據庫的例子來講解;
HTML頁面參數—(以瀏覽器的編碼方式發送)—》JSP頁面—(以JSP定義的編碼方式被編譯)—》被JSP引擎編譯為*.class文件——》在JSP容器中運行——》傳遞給Mysql數據庫—(以數據庫的編碼方式讀取數據并存儲)—》讀取Mysql—(以數據庫的編碼方式讀取)—》JSP頁面接受后在瀏覽器中顯示(以瀏覽器編碼方式解碼顯示);
注意:這里的“瀏覽器編碼”“JSP頁面編碼”“JSP頁面輸出編碼”“JSP頁面輸入編碼”“數據庫的編碼”可能存在潛在的不一直,當它們中的任意一個不相同的時候就會出現亂碼;就好像傳話游戲一樣,張三要把話傳給李四,李四把他聽到的傳給王五,要讓王五知道張三說的什么就需要他們三個人使用的相同語言,如果李四是個火星人,他當然聽不懂張三說什么,然后他還不厚道的對王五說火星話(亂碼),結果王五就只能聽到亂碼了。(比喻比較汗~~^_^!)
好了,現在我們就依次把各個編碼方式改為相同就可以了;
//-------------------------瀏覽器編碼-----------------
<html>
? <head><meta http-equiv="Content-Type" content="text/html; charset=GB2312"></head>
</html>
//---------------------------JSP頁面-------------------
<%@ page pageEncoding="GB2312"%>??????????????????????????? //JSP頁面編碼:
<%@ page contentType="text/html;charset=gb2312"%>????//JSP頁面輸出編碼:
<% request.setCharacterEncoding("gb2312");?%>?????????????? //JSP頁面輸入編碼:
//------------------------MySql編碼-------------------
Connection connect = java.sql.DriverManager.getConnection(
"jdbc:mysql://localhost/mydb?user=登陸帳號&password=你的密碼&useUnicode=true&characterEncoding=gb2312");
//-------------------------------------------------------
注意:gb2312的寫法(紅色部分) 在瀏覽器和數據庫中的寫法要區分!
以上配置測試成功!(tomcat5.5+MySql5.0)
//另外看了網上的很多文章,比如通過函數轉碼啊~~改配置文件啊~~都不如這樣來的簡便且成功率高!
推薦!
運行環境 tomcat5.5+MySql5.0
編寫一個簡單的HTML表單:
<html>
????<head>
????</head>
????<body>
????????<form?action="http://127.0.0.1/test/login.jsp"?method="post">
????????????????學號:<input?type="text"?name="id"><br>
????????????????姓名:<input?type="text"?name="name"><br>
????????????????<label>
??????<input?type="radio"?name="sex"?value="boy"?checked>
????????????男</label>
??????<label>
??????<input?type="radio"?name="sex"?value="girl">
????????????女</label><br>
????????????????電話:<input?type="text"?name="tel"><br>
????????????????<input?type="submit"?value="提交">
????????????????<input?type="reset"?value="重填">
????????</form>
????</body>
</html>接這編寫一個JSP文件用于讀取表單數據
Connection?conn?=?null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn?=?java.sql.DriverManager.getConnection("jdbc:mysql://localhost/mydb","root","corsair");

if(conn==null)
{
System.out.println("get?Conn?Error");
}
Statement?stmt=conn.createStatement();
ResultSet?rs=null;
%>
<%
????String?id,name,sex,tel;
????id=request.getParameter("id");
????name=request.getParameter("name");
????sex=request.getParameter("sex");
????tel=request.getParameter("tel");

????try
{
????stmt.executeUpdate("INSERT?INTO?inf_student(id,name,sex,tel)?VALUES?('"+id+"','"+name+"','"+sex+"','"+tel+"')");

????}catch(SQLException?e)
{}
stmt.close();
conn.close();
%>將以上文件保存在tomcat5.5的webapps目錄下;然后啟動tomcat5.5和mysql數據庫,最后打開表單,插入數據提交,并可以mysqlQueryBrower查看到插入數據的情況了。
<%@ %>指令塊。定義JSP文件的全局屬性,該指令不能作用動態包含文件;
?
<%@ page
???
language="java"
???
extends="指定父類"
???
import="導入JAVA類" ??
???
session="false||true是否使用session對象"
???
buffer="定義緩沖區大小默認8kb"
???
autoFlush="false||true自動清除緩沖區"
???
isThreadSafe="false||true是否處理多請求"
???
info="定義相關信息.txt"
???
errorPage="url指定錯誤頁"
???
contentType="編碼方式"
???
isErroPage="false||true是否為處理異常頁"
%>?
?
<%@ include
file
="URL指定要包含的另外一個JSP文件,*.jspf,*.htmlf"%>
<%@ taglib
uri
="" prefix=""%>
?
常用的JSP動作元素
1
???
<jsp:useBean
???????
id="指定該bean對象名"
???????
scope="page||request||session||application bean的作用域"
???????
class="bean的class文件名,注意不能與beanName屬性一起使用"
???????
beanName="*.class或*.ser或bean包的名字,緊當bean不存在于指定???????????? 的作用域時才使用 "
???????
type="與class或beanName一起使用,指定要實例化的bean的類或接口"
???
>
???
<jsp:setProperty name="" property="" value="">實例話bean的初始特性值。
???
</jsp:/useBean>
2??
???
<jsp:setProperty
???????
name="對應<jsp:useBean>中的id"
???????
property="*||bean屬性名 通過request參數設定bean屬性值"
???????
value="為bean屬性值指定值,需要指定bean屬性名"
???
/>
?
3??
???
<jsp:getProperty
???????
name="對應<jsp:useBean>中的id"
???????
property="對應想要獲得的屬性值名"
???
/>
4
???
<jsp:include>
???????
page="要包含文件的相對地址"
???????
flush="true||false 是否清空緩沖區"
???????
<jsp:param name="" value="" 可以傳遞一個參數/>
???
</jsp:include>
5
???
<jsp:forward page="URL或者一個表達式,用于將請求的頁面轉向其他頁面">
???????
<jsp:param name="" value="">可以傳遞參數;
???
</jsp:forward>
6??
???
<jsp:param
name="" value="">
<%! %>
變量和方法聲明塊,要使用“;”結尾
<%? %>
腳本塊 可以聲明局部變量 但是不能定義方法!
<%= %>
表達式 注意內部不能使用“;”
硬件情況:
??????兩臺電腦均使用windowsxp-sp2;
??????兩臺電腦均有板載網卡。一臺使用升技NF7-S2主板,一臺用的技嘉威盛芯片組的小板(好像叫 8V800M2)
?????? 單獨購買一個tp-link的8139網卡。購價24元(嘿嘿。JS想宰我,結果與其打心理戰!最終JS陰謀落敗!哈哈)
??????一根雙機對聯的雙絞線。注意排線(橙藍綠棕)(綠藍橙棕);
????1:??其中一臺正確接入internet;(由于使用升技NF7-S2主板的電腦一旦雙網卡就會重起,所以不敢使用)并安裝雙網卡,使用獨立網卡接入internet,另外板載網卡與另一臺電腦相連;
?????2:在主機上(就是有雙網卡的那臺)創建一個internet連接.
?????3:?? 將與internet相連的哪個本地連接A的tcp/ip設置為自動獲得;將剛創建的哪個internet連接共享出來(屬性--》高級--》全打鉤--》家庭網絡連接選與另外一太電腦相連的那個本地連接B)再把B連接的ip地址設置為192.168.0.1? 掩碼255.255.255.0? 。
???? 4:最后把客戶機的ip設置為192.168.0.2? 掩碼255.255.255.0?網關:192.168.0.1 DNS:192.168.0.1
好了!把主機上網,這樣就實現了雙機共享上網了!
????
??????
很久以前就對
linux
很好奇,于是在網上查了很多的發行版,最后互相比較之后最終選擇了
kubentu
這是基于
Dibean
的
LINUX
發行版本,由于它的軟件包很豐富,而且采用的
KDE
桌面環境也和
WINDOWS
比較像(而且漂亮很多),在網上的評價也很不錯,于是下載刻盤。我安裝的版本是
kubentu6.06
,我的
winXP-sp2
我
80G
的分區如下:
主分區:
????????????? C
:
4G??? fat32?
安裝
windowXP
系統
?
擴展分區:
D
:
15G ?ntfs?
安裝軟件
E
:
35G ntfs
存放視頻
F
:
6G? fat32
我的工作目錄
G
:
5G??? fat32
存放備份
Linux
主分區:
8G??????? ext3
掛載根文件系統
Swap:512MB????????
交換分區
順便說明一點:我用的分區軟件是
PartitionMagic
漢化版;還有一個
hand disk manager6.0
也非常好用。可以將你硬盤中的空閑空間合并起來形成一個新的分區;具體使用方法可以參考軟件的幫助文件;要注意的是將
LINUX
的分區劃為一個主分區,如果劃為擴展邏輯分區不知道行的通不。保險起見還是劃為主分區了;
在使用
PartitionMagic
漢化版時,這個軟件有個向導幫助你安裝雙系統比如
widow+linux
但在最后一步中它會提示你要將你新劃出的
LINUX
分區設置為激活狀態,但同時也說如果沒有馬上安裝
LINUX
的話會導致
WINDOWS
不可引導。當時我也很在意這句話也上網查了很多資料但是都沒有說明這個問題(是否需要激活);由于不想冒風險于是還是決定不將它設置為激活,事實證明這樣是對的;呵呵。
第一步
:正常安裝
WINDOWXP
不用多說,如果你本來就有
windows
系統就往下繼續
第二步
:設置
BIOS
從光驅啟動,然后放入
kubentu
的光盤(注意刻盤的時候要將不要科成數據光盤否者是不能引導的,從網上下載鏡像文件然后從鏡像復制光盤)
第三步
:正常引導以后選擇第一個選項;這里要注意,如果你要安裝簡體中文版的系統需要現在選者
language
為簡體中文,如果安裝英文版的就直接選擇第一項就可以了;如果現在不選擇語言等引導進入系統后再選擇簡體中文就會是亂碼了,這里要注意;
第四步
:進入系統,選擇安裝,進入之后依次設置時區(上海)語言(簡體中文)鍵盤(標準美式鍵盤)等屬性。
第五步
:也是最關鍵的一步,選擇手動編輯分區表,這時候回列出現在的分區信息,選擇你已經
l
劃分好的
inux
分區并記錄好這個分區的名字(一般是
hda?—“?”
代表數字)點下一步,選擇剛才的
had?
哪個分區,然后在最左邊的下拉列表中選擇
”/”j
即根文件系統,注意在最右邊有一列單選按鈕提示是否要重新格式劃對應的分區,如果你不想你硬盤其他分區的數據不想被破壞的話幾千萬不要選擇!好了點下一步:這時候有個戲劇性的場面會出現,安裝程序會提示你一段警告英文,大體意思是說:“如果繼續的話你的硬盤所有的分區的數據將被摧毀!請確認做好備份……”當時我就被這段話給嚇住了
~~
提心吊膽了好久也不敢點下一步,經過了幾個月的思想斗爭后終于決定點下一步了……其結果可想而知!原來確實是虛驚一場!!安裝程序給我開了一個天大的玩笑。同志們如果確認前面的事情都做好了就放心的點下一步吧!
好了
~~
以后的安裝完全不用擔心了。它回自動識別你的硬件和
windowsxp
系統,好了完成,這時候將光盤拿出重起,你就會看到雙啟動菜單!