黑马程序员技术交流社区
标题:
关于servlet获取jsp页面from表单提交数据,产生的乱码问题
[打印本页]
作者:
刘国强
时间:
2013-4-12 01:45
标题:
关于servlet获取jsp页面from表单提交数据,产生的乱码问题
本帖最后由 刘国强 于 2013-4-12 20:55 编辑
jsp页面的from表单提交的数据在servlet中获取后,会产生乱码
jsp页面代码
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'selectClassScoreResualt1.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<center>
<div>
<form action="${pageContext.request.contextPath}/control/commons/customer.do?method=selectClassScoreByName" method="post">
<table>
<tr>
<th align="center" colspan="2">根据班级名称查询学生成绩</th>
</tr>
<tr>
<th align="center" colspan="2"></th>
</tr>
<tr>
<td>请输入要查询班级的完整名称:</td>
<td><input type="text" name="cname"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
</form>
</div>
</center>
</body>
</html>
复制代码
前不久发现在servlet中获取后会出现乱码问题,所以在servlet中对数据重新编码,可以得到正确的汉字,但是最近继续做同一个项目,代码全部没有改变,但是今天去发现,servlet中重新编码后获得的数据突然变为乱码,反而未重新编码直接获得的数据位正常的汉字,什么原因造成的?
String cname1 = request.getParameter("cname");
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
首先楼主的代码没问题。但是这样写很繁琐。如果表单中有很多文本框需要提交,那每次都要转字符格式。建议你写一个过滤器
package com.tan.oa.web.filter;
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;
public class CharacterEncodingFilter implements Filter {
private String encoding = "utf-8";
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
// request中设置encoding
if (request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
// response中设置encoding
response.setContentType("text/html;charset=" + this.encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
// 读取filter配置参数信息
String en = filterConfig.getInitParameter("encoding");
if (en != null && !"".equals(en)) {
this.encoding = en;
}
}
}
复制代码
在web配置文件中配置
<!-- 解决乱码 -->
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.tan.oa.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
复制代码
任何项目加上以上代码。一切乱码搞定
作者:
刘国强
时间:
2013-4-12 20:55
谢谢各位的回答了
作者:
郭强
时间:
2013-4-13 08:45
1你看看最近的这个项目的tomcat的server.xml文件里是否配置了uriencode参数了,仔细检查一下新老项目关于获取参数后处理的代码,应该能解决你的疑惑。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2