黑马程序员技术交流社区

标题: 关于servlet获取jsp页面from表单提交数据,产生的乱码问题 [打印本页]

作者: 刘国强    时间: 2013-4-12 01:45
标题: 关于servlet获取jsp页面from表单提交数据,产生的乱码问题
本帖最后由 刘国强 于 2013-4-12 20:55 编辑

jsp页面的from表单提交的数据在servlet中获取后,会产生乱码
jsp页面代码

  1. <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>

  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8.   <head>
  9.     <base href="<%=basePath%>">
  10.     <title>My JSP 'selectClassScoreResualt1.jsp' starting page</title>
  11.         <meta http-equiv="pragma" content="no-cache">
  12.         <meta http-equiv="cache-control" content="no-cache">
  13.         <meta http-equiv="expires" content="0">   
  14.         <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

  15.         <meta http-equiv="description" content="This is my page">

  16.         <!--

  17.         <link rel="stylesheet" type="text/css" href="styles.css">

  18.         -->
  19.   </head>

  20.   <body>
  21.     <center>
  22.           <div>
  23.     <form action="${pageContext.request.contextPath}/control/commons/customer.do?method=selectClassScoreByName" method="post">
  24.             <table>
  25.                     <tr>
  26.                             <th align="center" colspan="2">根据班级名称查询学生成绩</th>
  27.                     </tr>

  28.                     <tr>
  29.                             <th align="center" colspan="2"></th>
  30.                     </tr>

  31.                     <tr>
  32.                             <td>请输入要查询班级的完整名称:</td>
  33.                             <td><input type="text" name="cname"/></td>
  34.                     </tr>

  35.                     <tr>
  36.                             <td></td>
  37.                             <td><input type="submit" value="查询"/></td>
  38.                     </tr>
  39.             </table>
  40.     </form>
  41.     </div>
  42.     </center>

  43.   </body>

  44. </html>
复制代码
前不久发现在servlet中获取后会出现乱码问题,所以在servlet中对数据重新编码,可以得到正确的汉字,但是最近继续做同一个项目,代码全部没有改变,但是今天去发现,servlet中重新编码后获得的数据突然变为乱码,反而未重新编码直接获得的数据位正常的汉字,什么原因造成的?

  1.                 String cname1 = request.getParameter("cname");

  2.                 String cname = new String(cname1.getBytes("ISO-8859-1"), "GB2312");
复制代码
这个获取代码,前几天还可以正常获取正常的汉字,但是今天重新使用的时候却突然变为乱码。反而未重新编码之前为正常汉字
作者: 王大斌    时间: 2013-4-12 07:12
使用post提交有很多处理乱码的方法。
request.setCharacterEncoding("GB2312");
其中这是一种处理方法


至于cname1.getBytes("ISO-8859-1"), "GB2312"来说,你是不把tomcat的配置文件中的默认编码给改了??
作者: 本人已死    时间: 2013-4-12 07:39
jsp页面呗编码为.class时,如果未指定字符集,默认使用is08859-1的编码格式这样中文会出现乱码;使用表单提交时,如果设定提交方式为post,而没有设置提交的编码格式,则会以iso8859-1的编码格式提交,而jsp却以gb2312的方式接受,这样会出现乱码。对于你说的servlet中重新编码,一般情况肯定是你编码那里有过改动,对于servlet来说写好了之后如果没有改动只需要发布一遍就够了。
建议:写一个乱码过滤文件吧,放在电脑里面,用的时候直接找出来,在xml文件里面配置一下就ok了,简单实惠{:soso_e112:}
作者: 王怀亮    时间: 2013-4-12 08:27
Servlet中的doGet或者doPost方法中第一句前有没有response.setContentType("text/html;charset=GB2312");这句话?没有的话加上,另外你的jsp页面和servlet和数据库中的编码要匹配的
作者: 谭威    时间: 2013-4-12 08:30
首先楼主的代码没问题。但是这样写很繁琐。如果表单中有很多文本框需要提交,那每次都要转字符格式。建议你写一个过滤器
  1. package com.tan.oa.web.filter;

  2. import java.io.IOException;

  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;

  9. public class CharacterEncodingFilter implements Filter {

  10.         private String encoding = "utf-8";

  11.         public void destroy() {
  12.                 // TODO Auto-generated method stub

  13.         }

  14.         public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
  15.                         ServletException {
  16.                 // request中设置encoding
  17.                 if (request.getCharacterEncoding() == null) {
  18.                         request.setCharacterEncoding(encoding);
  19.                 }
  20.                 // response中设置encoding
  21.                 response.setContentType("text/html;charset=" + this.encoding);
  22.                 response.setCharacterEncoding(encoding);

  23.                 chain.doFilter(request, response);

  24.         }

  25.         public void init(FilterConfig filterConfig) throws ServletException {
  26.                 // 读取filter配置参数信息
  27.                 String en = filterConfig.getInitParameter("encoding");
  28.                 if (en != null && !"".equals(en)) {
  29.                         this.encoding = en;
  30.                 }
  31.         }

  32. }
复制代码
在web配置文件中配置
  1. <!-- 解决乱码 -->
  2.         <filter>
  3.                 <filter-name>CharsetEncodingFilter</filter-name>
  4.                 <filter-class>com.tan.oa.web.filter.CharacterEncodingFilter</filter-class>
  5.                 <init-param>
  6.                         <param-name>encoding</param-name>
  7.                         <param-value>UTF-8</param-value>
  8.                 </init-param>
  9.         </filter>

  10.         <filter-mapping>
  11.                 <filter-name>CharsetEncodingFilter</filter-name>
  12.                 <url-pattern>/*</url-pattern>
  13.         </filter-mapping>
复制代码
任何项目加上以上代码。一切乱码搞定
作者: 刘国强    时间: 2013-4-12 20:55
谢谢各位的回答了
作者: 郭强    时间: 2013-4-13 08:45
1你看看最近的这个项目的tomcat的server.xml文件里是否配置了uriencode参数了,仔细检查一下新老项目关于获取参数后处理的代码,应该能解决你的疑惑。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2