解决JSP中使用request乱码问题

ghfang26

ghfang26

2016-02-19 20:18

下面是个解决JSP中使用request乱码问题教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

  经常在讨论区看到有人问我的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-nameSet Character Encoding/filter-name
      filter-classcom.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter/filter-class
      init-param
        param-nameencoding/param-name
        param-valueUTF-8/param-value
      /init-param
    /filter
    filter-mapping
      filter-nameSet 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().
        }
      }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)

      // 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
    ...
  }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)

  看看,怎么样,我们只需要在获取数据库连接的地方稍微修改一下,甚至我们可以把它当作参数保存在 properties里面,改变coding的布尔值来设定是否使用自动编码转换。常常我们可以使用一个Database类来封装获取数据库连接的那段getConnection,以便于我们可以从 javax.sql.DataSource中获取到数据库连接。这个时候我们仅仅需要修改我们的Database类即可,而不用去搜索所有使用了rs.setString(), rs.getString()的地方去加入我们的编码转换代码了。甚至我们在使用con.createStatment()语句时,即使我们sql语句含有汉字或者其它的双字节字符时一样没有问题:
  SELECT 姓名, 性别 FROM 学生表 WHERE 班级 LIKE '%计算机%'

展开更多 50%)
分享

猜你喜欢

解决JSP中使用request乱码问题

Web开发
解决JSP中使用request乱码问题

JSP中使用request乱码问题的解决

Web开发
JSP中使用request乱码问题的解决

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

jsp环境下ajax乱码问题的解决

Web开发
jsp环境下ajax乱码问题的解决

Ajax request response 乱码解决方法

Web开发
Ajax request response 乱码解决方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

jsp中文乱码 jsp mysql 乱码的解决方法

Web开发
jsp中文乱码 jsp mysql 乱码的解决方法

JSP中文乱码问题解决方法小结

Web开发
JSP中文乱码问题解决方法小结

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

为什么有时Oracle数据库不用索引来查找数据?

为什么有时Oracle数据库不用索引来查找数据?

win 7的十件事 IT专业人员须知

win 7的十件事 IT专业人员须知
下拉加载更多内容 ↓