亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

解決JSP中使用request亂碼問題

2019-11-18 16:32:59
字體:
來源:轉載
供稿:網友

經常在討論區看到有人問我的jsp顯示中文有亂碼怎么辦,我用request得到的用戶輸入的中文怎么是亂碼,我把漢字寫到數據庫怎么是亂碼,等等一些關于漢字亂碼的問題。
其實這個問題很簡單,管它漢字不漢字,還是日文,還是其他的什么雙字節的語言,我們一律把它當作UTF-8看待。
(一)request中的雙字節文字
好下面我們就來實現在整個應用程序中使用UTF-8編碼工作,之所以選擇UTF-8不僅僅之于上述原因,我們知道java的就是基于在UTF-8之上的,所以我們選擇UTF-8應該沒錯^_^
我們首先把我們的.java, .jsp文件都用UTF-8編碼來保存,如果以前的沒有用UTF-8保存也無所謂,但是建議以后寫的都用UTF-8來保存。
并在.jsp里面寫:<%@page contentType="text/html; charset=UTF-8"%>而不是<%@page contentType="text/html; charset=UTF-8"%>
然后在web.xml添加下面一段:
<web-app>
...
  <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>com.redv.PRojects.eduadmin.util.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
...
</web-app>

其中com.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter的代碼如下:

package com.redv.projects.eduadmin.util.filters;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


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);           //就是這句話在工作的啦,哈哈,它: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
    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);

  }

}

這樣,我們的request請求就是以UTT-8編碼的,在JSP程序中就可以使用:request.getParameter("myKey")來直接得到UTF-8編碼的字符串了,而不需要像這樣:new String(request.getParameter("myKey").getBytes("ISO-8859-1"), "GBK")來解決那些亂碼了。http://www.devdao.com/

(二)數據庫處理的雙字節文字 http://www.upas.org/java/DatabaseEncodingProblemSolution/
另外一個,就是寫入數據庫的問題,我們知道我們在使用MySQL的時候可以改用這樣的url來處理漢字編碼問題:jdbc:mysql://localhost:3306/upas?useUnicode=true&characterEncoding=gb2312,
那么對于那些我們無法像mysql這樣解決的怎么辦呢?難道我們每次都這樣寫嗎:
import java.sql.*;

Class.forName("org.gjt.mm.mysql.Driver");
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
  con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
  pstmt = con.prepareStatement("SELECT f3, f4 FROM tbl1 WHERE f1 = ? AND f2 = ?");
  pstmt.setString(1, new String(f1.getBytes("GBK"), "ISO-8859-1");
  pstmt.setString(2, new String(f2.getBytes("GBK"), "ISO-8859-1");
  rs = pstmt.executeQuery();
  String f3, f4;
  while(rs.next()) {
    f3 = new String(rs.getString(1).getBytes("ISO-8859-1"), "GBK");
    f4 = new String(rs.getString(2).getBytes("ISO-8859-1"), "GBK");
  }
}
finally {
  //close resouces
  ...
}

其實我們完全可以這樣寫:
import java.sql.*;
import com.redv.sql.encoding.*;

Class.forName("org.gjt.mm.mysql.Driver");
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
  con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
  //接管數據庫連接實例
  boolean coding = true;
  EncodingConnection codingConnection = new EncodingConnection(con, coding, "ISO-8859-1", "GBK");
  //獲得接管后的數據庫連接實例,以后直接使用con已經是經過EncodingConnection重新包裝過的實例
  con = codingConnection.getConnection();
  pstmt = con.prepareStatement("SELECT f3, f4 FROM tbl1 WHERE f1 = ? AND f2 = ?");
  pstmt.setString(1, f1);
  pstmt.setString(2, f2);
  rs = pstmt.executeQuery();
  String f3, f4;
  while(rs.next()) {
    f3 = rs.getString(1);
    f4 = rs.getString(2);
  }
}
finally {
  //close resouces
  ...
}

看看,怎么樣,我們只需要在獲取數據庫連接的地方稍微修改一下,甚至我們可以把它當作參數保存在 properties里面,改變coding的布爾值來設定是否使用自動編碼轉換。常常我們可以使用一個Database類來封裝獲取數據庫連接的那段getConnection,以便于我們可以從 javax.sql.DataSource中獲取到數據庫連接。這個時候我們僅僅需要修改我們的Database類即可,而不用去搜索所有使用了rs.setString(), rs.getString()的地方去加入我們的編碼轉換代碼了。甚至我們在使用con.createStatment()語句時,即使我們sql語句含有漢字或者其它的雙字節字符時一樣沒有問題:
SELECT 姓名, 性別 FROM 學生表 WHERE 班級 LIKE '%計算機%'


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品综合一区91| 中文欧美日本在线资源| 97视频国产在线| 91免费看视频.| 国产精品1区2区在线观看| 一区二区三区亚洲| 欧美国产日韩一区二区| 亚洲美女视频网| 欧美激情一区二区久久久| 欧美激情三级免费| 欧美性视频网站| 91沈先生在线观看| 日韩亚洲第一页| 国产午夜精品理论片a级探花| 国产精品久久久久久网站| 欧美精品一区在线播放| 69av成年福利视频| 91精品视频免费看| 亚洲精品自产拍| 久久久久久亚洲精品中文字幕| 日韩精品在线第一页| 精品无人区乱码1区2区3区在线| 国产一区二区三区在线免费观看| 日韩中文字幕视频在线| 91情侣偷在线精品国产| 亚洲日韩欧美视频一区| 亲爱的老师9免费观看全集电视剧| 成人春色激情网| 青青草99啪国产免费| 国产综合色香蕉精品| 亚洲精品视频在线观看视频| 欧美在线激情网| 91国语精品自产拍在线观看性色| 日韩美女av在线免费观看| 亚洲精品之草原avav久久| 日韩福利在线播放| 欧美日韩性视频| 日韩欧美亚洲国产一区| 欧美性xxxxxxxxx| 欧美在线视频网| 在线成人免费网站| 欧美色欧美亚洲高清在线视频| 国产精品在线看| 久久在线视频在线| 久久人人爽人人爽人人片av高清| 成人精品久久一区二区三区| 国产精品视频在线观看| 不卡av日日日| 亚洲一区二区三区视频播放| 亚洲成色777777女色窝| 4444欧美成人kkkk| 欧美韩国理论所午夜片917电影| 欧美亚州一区二区三区| 超碰日本道色综合久久综合| 亚洲久久久久久久久久久| 久久国产精品视频| 久久综合亚洲社区| 国内精品在线一区| 日韩专区在线播放| 亚洲女人初尝黑人巨大| 国产精品96久久久久久又黄又硬| 欧美日韩成人在线视频| 国产成+人+综合+亚洲欧美丁香花| 亚洲在线观看视频| 亚洲小视频在线| 国产午夜精品理论片a级探花| 欧美激情精品在线| 亚洲丝袜av一区| 国产精品香蕉国产| 日韩免费av一区二区| 成人午夜在线观看| 欧美成人免费va影院高清| 中文字幕久热精品视频在线| 亚洲成人av在线播放| 欧美激情精品久久久久| 日本韩国欧美精品大片卡二| 欧美丝袜美女中出在线| 日韩av黄色在线观看| 日本午夜在线亚洲.国产| 中文字幕久久精品| 中文字幕免费精品一区| 国产精品视频26uuu| 日韩av色在线| 91精品久久久久久久久久另类| 97人人做人人爱| 性亚洲最疯狂xxxx高清| 久久久久久久国产精品| 91久久久久久久久久久| 亚洲国产精久久久久久久| 国模私拍一区二区三区| 黑人巨大精品欧美一区免费视频| 国产精品专区一| 97视频免费看| 日本一区二三区好的精华液| 国产精品一区二区三区毛片淫片| 操人视频在线观看欧美| 国产成人鲁鲁免费视频a| 深夜精品寂寞黄网站在线观看| 性色av一区二区三区免费| 欧美成人全部免费| 国内精品免费午夜毛片| 91久久精品国产91久久性色| 美女少妇精品视频| 日韩欧美国产黄色| 伊人伊人伊人久久| 国产精品久久久久久久久久久久久| 色偷偷偷亚洲综合网另类| 91精品国产乱码久久久久久蜜臀| 日韩欧美aⅴ综合网站发布| 在线免费观看羞羞视频一区二区| 日韩免费观看在线观看| 国内精品模特av私拍在线观看| 91精品国产91久久久久| 这里只有精品在线播放| 亚洲精品99久久久久中文字幕| 亚洲va国产va天堂va久久| 成人精品视频99在线观看免费| 亚洲免费福利视频| 欧美最猛性xxxxx亚洲精品| 欧美高清视频免费观看| 亚洲丝袜一区在线| 久久精品国产v日韩v亚洲| 精品中文字幕乱| 久久精品色欧美aⅴ一区二区| 欧美做受高潮1| 久久99精品久久久久久噜噜| 欧美理论电影在线观看| 亚洲性线免费观看视频成熟| 国产精品一区二区女厕厕| 久久综合网hezyo| 欧美亚洲免费电影| 亚洲男人天堂2023| 日韩视频免费大全中文字幕| 777777777亚洲妇女| 欧美专区福利在线| 91精品久久久久久久久不口人| 亚洲精品之草原avav久久| 欧美成人合集magnet| 日本免费一区二区三区视频观看| 国产精品777| 亚洲欧美日韩中文在线制服| 成人午夜激情免费视频| 午夜精品美女自拍福到在线| 国产福利精品av综合导导航| 国产精品精品视频| 欧美多人爱爱视频网站| 亚洲aa在线观看| 亚洲色图15p| 98精品国产高清在线xxxx天堂| 欧美极品少妇全裸体| 精品久久久久久中文字幕大豆网| 福利微拍一区二区| 国产精品夜色7777狼人| 亚洲一级一级97网| 欧美高清视频一区二区| 日韩中文字幕视频在线| 亚洲视频在线视频| 欧美一级视频在线观看| 欧美香蕉大胸在线视频观看| 日韩av综合中文字幕| 伊人男人综合视频网| 91精品久久久久久久久| 国产精品久久久久久亚洲影视| 日韩av片永久免费网站|