现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。
1)JSP页面中显示中文乱码
文中红色的代码即为处理乱码的代码。
web.xml文件加入过滤器
(2) Get方法的处理
tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
打开<tomcat_home>/conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:
* 注意修改后重新启动tomcat才能起作用。
1)JSP页面中显示中文乱码
在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb2312" %>
2)表单提交乱码
表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
(1)POST处理
对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:
Java代码:
- # 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 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,
- # <strong><span style="color: rgb(255, 0, 0);"> FilterChain chain) throws IOException, ServletException {
- #
- # if (ignore || (request.getCharacterEncoding() == null)) {
- # String encoding = selectEncoding(request);
- # if (encoding != null) {
- # request.setCharacterEncoding(encoding);
- # }
- # }</span>
- # </strong>
- # // 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);
- #
- # }
- #
- # }
web.xml文件加入过滤器
- 1. <filter>
- 2. <filter-name>Encoding</filter-name>
- 3. <filter-class>
- 4. example.util.SetCharacterEncodingFilter
- 5. </filter-class>
- 6. <init-param>
- 7. <param-name>encoding</param-name>
- 8. <param-value>gbk</param-value>
- 9. <!--gbk或者gb2312或者utf-8-->
- 10. </init-param>
- 11. <init-param>
- 12. <param-name>ignore</param-name>
- 13. <param-value>true</param-value>
- 14. </init-param>
- 15. </filter>
- 1. <filter-mapping>
- 2. <filter-name>Encoding</filter-name>
- 3. <servlet-name>/*</servlet-name>
- 4. </filter-mapping>
tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
打开<tomcat_home>/conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:
- 1. <Connector port="8080" maxHttpHeaderSize="8192"
- 2. maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
- 3. enableLookups="false" redirectPort="8443" acceptCount="100"
- 4. connectionTimeout="20000" disableUploadTimeout="true" <span style="color: rgb(255, 0, 0);">URIEncoding="GBK"</span> />
* 注意修改后重新启动tomcat才能起作用。