最近做一个项目,前台传到后台的数据是乱码.看着代码应该是正确的,但是就是有问题,然后请教了旁边的老司机才找到问题是什么.话不多说,下面是模拟情景的代码,其实也很简单,前台一个 form 表单,post 方法,然后传一个中文字符串到 servlet. 如果第一次调用 request, 不是设置字符编 码(req.setCharacterEncoding("utf-8");)而是调用其他的 request 方法,那么设置的字符编码不会成功.
前端模板:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>
Insert title here
</title>
</head>
<body>
<form action="/post" method="post">
用户名
<input type="text" name="name">
<input type="submit" value="提交">
</form>
</body>
</html>
Java 代码
package cn.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.webServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/post") public class TestPost extends HttpServlet {@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
String cmd = req.getParameter("cmd");
list(req, resp);
}
public void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
req.setCharacterEncoding("utf-8");
String name = null;
if (req.getParameter("name") != null && !"".equals(req.getParameter("name"))) {
name = req.getParameter("name");
System.out.println("name-------------------------->>>:" + name);
}
}
}
如上代码:request 首先调用 req.getParameter("cmd"); 然后再是 req.setCharacterEncoding("utf-8"); 出现的原因是 request 在传入的时候如果不设置 req 格式,在第一次调用 req 的时候 tomcat 会自动的给 req 增加字符格式 ,后面再设置 req.setCharacterEncoding("utf-8") 就会无效.
要修改就很简单了①:把 form 表单改为 get
②: req.setCharacterEncoding("utf-8"); 声明在第一行,或者 filter 里面做字符处理
③:
String name = req.getParameter("name");
byte[] nameBytes = name.getBytes("ISO-8859-1");
name = new String(nameBytes, "utf-8");
来源: