jsp寫入mysql數據庫時出現亂碼

先說下本身的開發環境:jsp+Eclipse+mysql+tomcat,如今通常習慣在DW(dreadweaver)下寫jsp代碼,是經過一個javaBean把數據插入到mysql數據庫的。測試後發現英文成功了,但中文現出了:「???」這樣的亂碼,第一反應是直接在mysql 裏執行插入中文語句,mysql成功了,沒有出現亂碼。因而上網找了不少資料:html


   其實不管是用什麼編碼:gb2312或者utf-8,都要遵循編碼統一的道理。就是說若是你在頁面中採用了utf-8,那麼你建mysql表時也如此,如下是如處須要統一的地方:java

  1. 在jsp頁面的<%@ page 位置加上 contentType=」text/html; charset=utf-8″ %>,<meta 的位置也是如此:content=」text/html;charset=utf-8″ />mysql

  2. 創建一個mysql數據庫,字符集採用utf-8,建表也是如此。web

  3. 在getConnection的URL中加上:?useUnicode=true&characterEncoding=UTF-8″,如:url = 「jdbc:mysql://localhost:3306/(此處爲數據庫名稱)?useUnicode=true&characterEncoding=UTF-8″,也就是在(數據庫名稱)的後面             其中問號不能丟sql

  4. 若是你不是在jsp頁面裏直接處理form,也是和我同樣採用servlet來處理form的話,那麼在還要增長一個過濾器,這主要是由於採用的是tomcat的web發佈器,若是用resin的話,不會有這樣的問題,這也是我後面花了很長時間的緣由所在。
    過慮器 SetCharacterEncodingFilter.java  的代碼:數據庫

package peom;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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
                  
public class SetCharacterEncodingFilter implements Filter {
    class Request extends HttpServletRequestWrapper
    {
        public Request(HttpServletRequest request) {
            super(request);
        }
        public String toChi(String input) {
            try {
                byte[] bytes = input.getBytes(」ISO8859-1″);
                return new String(bytes, 「utf-8″);
            } catch (Exception ex) {
            }
            return null;
        }
        private HttpServletRequest getHttpServletRequest()
        {
            return (HttpServletRequest) super.getRequest();
        }
        public String getParameter(String name)
        {
            return
            toChi(getHttpServletRequest().getParameter(name));
        }
        public String[] getParameterValues(String name)
        {
            String values[] =getHttpServletRequest().getParameterValues(name);
            if (values != null) {
                for (int i = 0; i <  values.length; i++) {
                    values[i] = toChi(values[i]);
                }
            }
            return values;
        }
    }
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse
    response,FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpreq = (HttpServletRequest) request;
        if (httpreq.getMethod().equals(」POST」)) {
            request.setCharacterEncoding(」utf-8″);
        } else {
            request = new Request(httpreq);
        }
        chain.doFilter(request, response);
    }
    public void init(FilterConfig filterConfig) throws
    ServletException {
    } 
}

而後在WEB-INF目錄下的web.xml文件,配置下過慮器,tomcat

<filter>
   <filter-name>SetCharacterEncodingFilter</filter-name>
   <filter-class>peom.SetCharacterEncodingFilter</filter-class>
 </filter>
 <filter-mapping>
   <filter-name>SetCharacterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>
  1. 這裏要注意的是:路徑、代碼儘可能放在前面,最好是<web-app 的後面app

  2. 完成遇到類型問題處理完,就以爲挺簡單,在問題中時仍是要多點參考參考
    原文地址1:http://blog.sina.com.cn/s/blog_6c5ad3d10100ligv.html jsp

  3. 原文地址2:http://blog.csdn.net/jdhanhua/article/details/6008756ide

相關文章
相關標籤/搜索