Struts+Hibernate+MyEclipse+Tomcat+MySQL的亂碼之解決篇[zz]java
關鍵字:Struts Hibernate MyEclipse Tomcat MySQL JSP 亂碼 編碼出錯 內碼設定
通過幾天的努力,參照諸多兄臺的點拔,再加本人的細細品味以後,方知此茶乃良茶,苦盡甘來矣。
好,廢話很少說,下面談正題!在系統中出現亂碼通常是編碼設定和編碼轉換問題,那麼咱們來看看當中有多少編碼設定和編碼轉換的呢?
顯示界面,JSP 2.0
JAVA容器:Tomcat 5.X
MVC構架:Struts 1.2
ORM工具:Hibernate 3
數據庫:MySQL 5.0
編譯IDE:MyEclipse 5.0
知道了有六個地方要設定編碼,那麼哪一種編碼最好呢?使用中文能夠GBK,但我認爲UTF-8會是更好的選擇,若是想知道了解編碼的更多細節,請訪問:
計算機編碼大全-A
計算機編碼大全-B
好如今選定UTF-8,在上面的這六個地方一一設定吧:
顯示界面,JSP
在頁面的開頭加入或修改爲:<%@ page language="java" pageEncoding="utf-8"%> 紅色部分爲要設定部分。
JAVA容器:Tomcat
本人蔘照某兄臺的之做:Tomcat中文編碼問題解決方案(簡) 有興趣能夠進去看看。
下面開始設定,在Tomcat安裝目錄下的conf文件打開Server.xml文件,找到相應段落並更改爲如下字樣:
<Connector port="8080" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="0" c
disableUploadTimeout="true" URIEncoding="utf-8"/>
紅色部分爲要設定部分。
MVC構架:Struts
在這裏添加一個字符集的Fliter,代碼以下:
package com.ruder.filters;
//上面的包名錶示你把這個Fliter文件放在哪一個包中,在下面的Web.xml也要相應改動。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
下面是對Web.xml的</servlet-mapping>下的的置:
<filter>mysql
<filter-name>Set Character Encoding</filter-name>web
<filter-class>sql
com.ruder.filters.SetCharacterEncodingFilter數據庫
</filter-class>app
<init-param>jsp
<param-name>encoding</param-name>工具
<param-value>utf-8</param-value>this
</init-param>編碼
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.提交表單的jsp頁面設置
<%@ page language="java" c%>
至此問題已經解決,可是還有一些咱們應該瞭解的,下面我簡述一下:
爲每一個jsp頁面設置了其編碼格式(utf-8),但傳遞數據到另外一頁面時依然顯示爲亂碼? 首先要須要瞭解的是web容器默認編碼是iso-8859-1,一個漢字佔用兩個字節,而在utf-8中一個漢字佔用三個字節。因此在數據傳遞過程當中,必須手動設定容器編碼格式,不然會出現字符位丟失的狀況。即3個字節變爲兩個字節,天然會變成亂碼。爲何保存到數據庫中的數據都變成了亂碼? 原理同上,首先要搞清楚使用的數據庫默認的編碼格式,好比mysql默認的字符編碼是ISO-8859-1。因此必須手動修改其默認編碼格式。 清楚了以上問題後,再來看如何解決utf-8的亂碼問題。
1.設置web容器的編碼格式。爲你的servlet的doGet或doPost方法開始處加入以下代碼:request.setCharacterEncoding("utf-8"); response.setCharacterEncoding ("utf-8");
2.爲每一個jsp頁面指定其編碼格式。<%@ page pageEncoding="utf-8"%>
3.在鏈接數據庫用的URL後加入:useUnicode=true; characterEncoding=utf-8 如: url="jdbc:mysql:///db1?useUnicode=true; characterEncoding=utf-8"
4.爲指定數據庫默認編碼格式。在C:\WINDOWS目錄下找到my.ini文件,並在 [mysqld]中加入default-character-set=gbk,從新啓動mysql服務。
至此,亂碼問題所有解決。
起初總搞上去不清,爲何要將mysql的默認編碼格式設置爲gbk,後來由相關的資料得知utf-8默認輸入編碼方式爲gbk,默認輸出編碼方式爲utf-16be。
我的認爲,將數據進行utf-8進行編碼的目的(即將中文編碼爲%的形式),主要是爲了在多層服務間進行數據傳輸時,防止發生字符丟失(如msn)。普通的web程序顯然沒有必要這樣作,只要使用以上方法進行處理,就能夠有效的解決亂碼問題,從而結省存儲空間。若是都像公司的SC系統那樣,將一個漢字編碼爲18個字符後,再存儲到數據庫中,拋開效率不說,就存儲空間的浪費就夠人受的,要知道,那是須要銀子地!