乱码既不会凭空产生,也不会凭空消失,只会从一个地方转移到另一个地方,从一种形式转换成另一种形式。
下面是小编总结的几种在eclipse中的jsp上和servlet传值时可能出现乱码的情形和几种解决方式。
1.复制粘贴乱码
在复制javascript文件或是servlet文件到eclipse中时有时会产生乱码,其原因是复制的代码的编码方式和eclipse中的编码方式不同,不过一般只在有中文的地方才会有乱码。常见的中文编码方式有gbk,gb2312,gb18030,不过小编建议使用utf-8,因为utf-8更加通用,兼容性更好。eclipse中在出现乱码的文件的文件名上点击右键,选properties,修改编码方式即可。
但是已经成乱码的文字一般不会恢复原样,改了编码方式后,把代码全删了,保存,再复制一遍,保存,一般就OK了,也可以手动修改成乱码的文字。
2.servlet传值乱码
用jsp的form表单把值传到servlet后(一般传中文时可能有乱码),或是在servlet中设置的request中的属性(request.setAttribute("name",value);)和在session中设置的属性(request.getSession().setAttribute("name",value);)产生乱码(在页面上显示时是乱码)。这时可以在servlet的doGet或是doPost方法的最前面加上两句设置传值编码方式的语句。(用哪个方法在哪个方法里加)
加上上图绿色的两句话后乱码一般会消除。
3.设置过滤器
可以设置处理乱码的过滤器,这样就不用在每个servlet中都设置上述编码方式了。
(1)使用filter---针对doPost方式传值
创建一个类继承Filter接口,这里有一个示例,命名为EncodingFilter(名字随意起)
package com.iweb01.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 EncodingFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
arg0.setCharacterEncoding("utf-8");
arg1.setCharacterEncoding("utf-8");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
然后配置web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.iweb01.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在web.xml中加上上述内容即可。
注意:这种方式只能对所有doPost方法的传值进行过滤,用doGet方法传的值还是有可能乱码。
(2)修改tomcat的server.xml---针对doGet方式传值
doGet方法的传值,如在使用ajax时,可能会有乱码。(从javascript函数向servlet传过去的是乱码)
doGet方式传值产生乱码的现象可以用这种方式避免。
找到tomcat的安装目录,进入conf文件夹,修改server.xml。
打开server.xml,找到如下位置,加上一句 URIEncoding="utf-8" 即可。
这样doGet方式的传值也不会乱码了。
附上检测乱码的方式
在javascript中可以使用alert();来把值输出看看是不是有乱码。
在jsp中可以使用out.println();或是用${ name }输出request或session中设置的属性值,看看有没有乱码。
在servlet中直接用System.out.println();输出属性和变量的值看哪里有乱码即可。