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

JSP中使用request亂碼問題的解決

2013-11-15 11:54:45  來源: JSP教程 

     JSP顯示中文有亂碼怎麼辦用request得到的用戶輸入的中文怎麼是亂碼把漢字寫到數據庫怎麼是亂碼等等一些關於漢字亂碼的問題其實這個問題很簡單管它漢字不漢字還是日文還是其他的什麼雙字節的語言我們一律把它當作UTF看待

      (一)request中的雙字節文字

      我們來實現在整個應用程序中使用UTF編碼工作之所以選擇UTF不僅僅之於上述原因我們知道java的就是基於在UTF之上的所以我們選擇UTF應該沒錯
首先把我們的java jsp文件都用UTF編碼來保存如果以前的沒有用UTF保存也無所謂但是建議以後寫的都用UTF來保存

      並在jsp裡面寫:

以下是引用片段
<%@page contentType=text/html; charset=UTF%>而不是%@page contentType=text/html; charset=UTF%
      然後在webxml添加下面一段

以下是引用片段
<webapp>

  <filter>
    <filtername>Set Character Encoding</filtername>
    <filterclass>comredvprojectseduadminutilfiltersSetCharacterEncodingFilter</filterclass>
    <initparam>
      <paramname>encoding</paramname>
      <paramvalue>UTF</paramvalue>
    </initparam>
  </filter>
  <filtermapping>
    <filtername>Set Character Encoding</filtername>
    <urlpattern>/*</urlpattern>
  </filtermapping>

</webapp>
      其中comredvprojectseduadminutilfiltersSetCharacterEncodingFilter的代碼如下 package comredvprojectseduadminutilfilters;
import javaioIOException;
import javaxservletFilter;
import javaxservletFilterChain;
import javaxservletFilterConfig;
import javaxservletServletException;
import javaxservletServletRequest;
import javaxservletServletResponse;
import javaxservletUnavailableException;
import javaxservlet
import javaxservlet

public class SetCharacterEncodingFilter
    implements Filter {

  protected String encoding = null;
  protected FilterConfig filterConfig = null;
  protected boolean ignore = true;
  public void destroy() {
    thisencoding = null;
    thisfilterConfig = 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 || (requestgetCharacterEncoding() == null)) {
      String encoding = selectEncoding(request);
      if (encoding != null) {
        requestsetCharacterEncoding(encoding);           //
Overrides the name of the character encoding used in the body of this request This method must be called prior to reading request parameters or reading input using getReader()
      }
    }
    // Pass control on to the next filter
    chaindoFilter(request response);
  }
  public void init(FilterConfig filterConfig) throws ServletException {
    thisfilterConfig = filterConfig;
    thisencoding = filterConfiggetInitParameter(encoding);
    String value = filterConfiggetInitParameter(ignore);
    if (value == null) {
      thisignore = true;
    }
    else if (valueequalsIgnoreCase(true)) {
      thisignore = true;
    }
    else if (valueequalsIgnoreCase(yes)) {
      thisignore = true;
    }
    else {
      thisignore = false;
    }
  }
  protected String selectEncoding(ServletRequest request) {
    return (thisencoding);
  }
}

  這樣我們的request請求就是以UTT編碼的在JSP程序中就可以使用requestgetParameter(myKey)來直接得到UTF編碼的字符串了而不需要像這樣new String(requestgetParameter(myKey)getBytes(ISO) GBK)來解決那些亂碼了

   (二)數據庫處理的雙字節文字

      另外一個就是寫入數據庫的問題我們知道我們在使用mysql的時候可以改用這樣的url來處理漢字編碼問題jdbc:mysql://localhost:/upas?useUnicode=true& characterEncoding=gb那麼對於那些我們無法像mysql這樣解決的怎麼辦呢?難道我們每次都這樣寫嗎(wwwliancom)

import javasql*;
ClassforName(orggjtmmmysqlDriver);
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
  con = DriverManagergetConnection(jdbc:mysql://localhost:/test root );
  pstmt = conprepareStatement(SELECT f f FROM tbl WHERE f = ? AND f = ?);
  pstmtsetString( new String(fgetBytes(GBK) ISO);
  pstmtsetString( new String(fgetBytes(GBK) ISO);
  rs = pstmtexecuteQuery();
  String f f;
  while(rsnext()) {
    f = new String(rsgetString()getBytes(ISO) GBK);
    f = new String(rsgetString()getBytes(ISO) GBK);
  }
}
finally {
  //close resouces
  
}

  其實我們完全可以這樣寫

import javasql*;
import comredvsqlencoding*;
ClassforName(orggjtmmmysqlDriver);
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
  con = DriverManagergetConnection(jdbc:mysql://localhost:/test root );
  //接管數據庫連接實例
  boolean coding = true;
  EncodingConnection codingConnection = new EncodingConnection(con coding ISO GBK);
  //獲得接管後的數據庫連接實例以後直接使用con已經是經過EncodingConnection重新包裝過的實例
  con = codingConnectiongetConnection();
  pstmt = conprepareStatement(SELECT f f FROM tbl WHERE f = ? AND f = ?);
  pstmtsetString( f);
  pstmtsetString( f);
  rs = pstmtexecuteQuery();
  String f f;
  while(rsnext()) {
    f = rsgetString();
    f = rsgetString();
  }
}
finally {
  //close resouces
  
}

  看看怎麼樣我們只需要在獲取數據庫連接的地方稍微修改一下甚至我們可以把它當作參數保存在 properties裡面改變coding的布爾值來設定是否使用自動編碼轉換常常我們可以使用一個Database類來封裝獲取數據庫連接的那段 getConnection以便於我們可以從 javaxsqlDataSource中獲取到數據庫連接這個時候我們僅僅需要修改我們的Database類即可而不用去搜索所有使用了 rssetString() rsgetString()的地方去加入我們的編碼轉換代碼了


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