关于Servlet中请求数据是中文时乱码问题的记录

关于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" 这句话以免特殊情况的出现。