Debug

问题描述

UTF-8 和 GBK 就像魔咒一样长久地困扰着程序设计人员!

今天在 jsp 页面使用 get 和 post 向 action 提交数据时中文发生乱码

通过在服务器和页面设置编码方式都没用

PSOST

post 好解决,正常来说加一句 request.setCharacterEncoding("utf-8"); 就行了

设置完还是没用,最后发现是我自己的疏忽,form 表单的一个属性忘写了

这是我的表单

<form action="${pageContext.request.contextPath}/from.action">
    用户名:<input type="text" placeholder="请输入用户名..." name="username"><br/>
    昵称:<input type="text" placeholder="请输入用户名..." name="nick"><br/>
    爱  好: <input type="checkbox" value="足球" name="hobby">足球
    <input type="checkbox" value="篮球" name="hobby">篮球
    <input type="checkbox" value="乒乓" name="hobby">乒乓球<br/>
    <input type="submit" value="提交">
  </form>

在 form 标签里面没有指定 method 属性,所以当前是以默认方法 Get 提交,而页面上所有的编码设置对于 Get 方法是彻底无效的,只要指定提交方式为 post 就行了

 method="post"

GET

那 get 就麻烦了呀,刚才说了所有的编码设置对于 Get 方法是彻底无效的,那只能通过配置方法来解决了

将项目所涉及到的配置全部确认一遍,一个个来,全部设置成所需编码。以我当前项目(IDEA + Tomcat + Struts2)为例

整个项目的编码

打开 IDEA -> File -> Settings -> File Encodings 配置项目编码

Jsp 文件头

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

Struts2 设置编码常量

<constant name="struts.i18n.encoding" value="UTF-8" />

Tomcat 编码

打开 Tomcat 安装目录中 conf 文件夹下的 server.xml,添加URIEncoding="UTF-8"

<Connector port="8080" protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="8443" URIEncoding="UTF-8"/>

添加一个过滤器(可选)

前面的几项缺一不可,这项是为了保险起见,可选

在 web.xml 中添加如下过滤器代码

<filter>
    <filter-name>encodeFilter</filter-name>
    <filter-class>work.douzi.utils.MyEncodingIntercpter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodeFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

其中 MyEncodingIntercpter 类的代码如下

package work.douzi.utils;

import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter;

import javax.servlet.*;
import java.io.IOException;

public class MyEncodingIntercpter extends StrutsPrepareAndExecuteFilter
        implements Filter {

    private FilterConfig config = null;
    private String encoding = null;

    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        if(encoding==null){
            encoding = config.getInitParameter("encoding");
            System.out.println("encoding = "+encoding);
        }
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        response.setContentType("text/html;charset=" + encoding);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        config = null;
        encoding = null;
    }

}

全部确认一遍,一般就能解决了。如果还会乱码,再想想是不是漏掉了哪个配置文件


原文地址:https://www.cnblogs.com/mdz3201/p/12636269.html