关于Servlet中请求数据是中文时乱码问题的记录
最近在学Servlet,写了一个表单,然后请求到一个Servlet,结果表单里输入的中文都是乱码,在网上找的方法大都说使用
String uname=req.getParameter("uname");
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
来设置,然而虽然100%的人都这样说可以,但是我还是自己测试了一遍,结果却不像其他人说的一样,我怀疑那些人都是直接复制了别人写的文章,自己根本没测试。经过我自己测试后发现,上面这种方法只对post请求有效,对于get请求仍然会乱码。看图说话:
登陆页面Servlet代码(表单是get请求方式):
package com.bjsxt.login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//处理请求
//响应处理结果
//获取request作用域数据
resp.getWriter().write("<html>");
resp.getWriter().write("<head>");
resp.getWriter().write("</head>");
resp.getWriter().write("<body>");
resp.getWriter().write("<form action='dologin' method='get'>");
resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
resp.getWriter().write("<input type='submit' value='登录'/><br/>");
resp.getWriter().write("</form>");
resp.getWriter().write("</body>");
resp.getWriter().write("</html>");
}
}
接收数据Servlet代码:
package com.bjsxt.login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bjsxt.pojo.User;
import com.bjsxt.service.LoginService;
import com.bjsxt.service.impl.LoginServiceImpl;
public class DologinServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
String uname=req.getParameter("uname");
uname=new String(uname.getBytes("iso8859-1"),"utf-8");//使用String进行数据重新编码
String pwd=req.getParameter("pwd");
System.out.println(uname+":"+pwd);
}
}
然而输出的结果仍然是乱码:
当表单换成post请求时结果是正常的
后来在看尚学堂的视频时发现也可以在接收数据的servlet里设置请求编码也可以达到解决中文乱码的问题
//设置请求编码格式:
req.setCharacterEncoding("utf-8");
视频中老师说使用这种方法时,如果是get请求还需要设置下tomcat的配置文件,在Tomcat的conf/server.xml文件里这样配置
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURI="true" />
即添加上 useBodyEncodingForURI="true" 这句话,但是经过实测后发现,这句话不加get请求的数据也不会乱码,所以最后总结下最终能同时解决get和post请求中文乱码的问题的方法就是在接收数据的servlet里加上
//设置请求编码格式:
req.setCharacterEncoding("utf-8");
这样一句话,当然要去掉第一种方法里的uname=new String(uname.getBytes("iso8859-1"),"utf-8"); 这句话。虽然我没加useBodyEncodingForURI="true"也没出现乱码现象,为了保险起见最好在Tomcat的conf/server.xml里加上useBodyEncodingForURI="true" 这句话以免特殊情况的出现。