Debug 问题描述 PSOST GET
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;
}
}
全部确认一遍,一般就能解决了。如果还会乱码,再想想是不是漏掉了哪个配置文件