乱码(1):Servlet编程中处理表单中的中文问题

在MyEclipse中新建一个web工程,取名为demo。新建addEmp.jsp文件,新建AddServlet.java文件,为AddServlet映射的url为/add。

addEmp.jsp :

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="GBK"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<form action="add" method="post">
姓名:<input type="text" name="name"><br>
薪水:<input type="text" name="salary"><br>
<input type="submit" value="添加雇员">
</form>
</body>
</html>
因为页面中有中文,所以pageEncoding属性的值必须为可以保存(即编码)中文的编码格式,可以是UTF-8,也可以是GBK。这里为了表明pageEncoding和charset可以不一致,选择了GBK。在MyEclipse中对于jsp文件,pageEncoding设置为什么格式,保存文件时的格式会自动和pageEncoding保持一致,所以此jsp文件也会保存为GBK格式。

AddServlet.java :

public class AddServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String name=request.getParameter("name");
		System.out.println("姓名:"+name);
		String salary=request.getParameter("salary");
		
	}

}
在浏览器里请求访问addEmp.jsp,在表单里输入英文姓名“zs”,输入薪水,点击按钮进行提交,IDE的控制台输出为: 姓名:zs。这里输入zs提交后,“name=zs”以UTF-8(charset)进行编码发送给Tomcat服务器,Tomcat服务器默认以ISO-8859-1进行解码,因为ISO-8859-1是UTF-8的子集,故可以解码出“zs”,输出在控制台。

现在改变一下,我们在表单里输入中文姓名“张三”,输入薪水,然后点击提交,IDE的控制台输出为:姓名:??????。可以看到出现乱码了。分析一下,当输入中文“张三”后,“name=张三”以UTF-8格式编码后提交给Tomcat服务器,Tomcat服务器默认以ISO-8859-1进行解码,因为ISO-8859-1不能编码中文,也就不能解码中文,所以这里就解码不出“张三”。解决问题的思路就是明确地告诉服务器以某种格式解码。因为发送过来的数据是以UTF-8进行编码的,所以只要明确告诉服务器以UTF-8进行解码即可。所以修改后的AddServlet.java为:

public class AddServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
		String name=request.getParameter("name");
		System.out.println("姓名:"+name);
		String salary=request.getParameter("salary");
		
	}

}
request.setCharacterEncoding("UTF-8") 就是以编程的方式告诉Tomcat服务器,以UTF-8进行解码。重新部署应用,再次输入中文姓名,输入薪水,点击提交,可以看到控制台输出为: 姓名:张三。这样就不会输出乱码了。

如果我们现在要求服务器读到姓名和薪水后,向浏览器返回“你好:”+name作为响应的话,我们将AddServlet.java修改为:

public class AddServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
		String name=request.getParameter("name");
		System.out.println("姓名:"+name);
		String salary=request.getParameter("salary");
		PrintWriter pw=response.getWriter();
		pw.println("你好:"+name);
		
	}

}
重新部署访问,发现浏览器收到的响应为一串问号。分析一下,pw是一个输出流,

pw.println("你好:"+name);
此行代码的意思就是要向浏览器端输出name的值。我们知道,name所引用的字符串“张三”在Tomcat服务器的内存里,要从内存里将name输出到客户端浏览器的话,就必须将内存的数据先编码然后再输出,到了目的地再以同样格式进行解码,才会得到正确结果。而服务器默认会以ISO-8859-1对name进行编码,显然ISO-8859-1是无法编码中文字符的,这就导致了乱码。解决的思路就是明确告诉服务器以某种格式编码内存里的数据,然后再输出。修改AddServlet.java为 :

public class AddServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
		String name=request.getParameter("name");
		System.out.println("姓名:"+name);
		String salary=request.getParameter("salary");
		response.setContentType("text/html;charset=GBK");
		PrintWriter pw=response.getWriter();
		pw.println("你好:"+name);
		
	}

}
重新部署访问,浏览器返回: 你好:张三

response.setContentType("text/html;charset=GBK") 的作用有两点:

① pw这个流输出数据时,设置的编码格式为GBK。

② 向浏览器发送一个响应头,告诉浏览器当前返回的数据要以GBK进行解码。

当然这里的charset也可以是UTF-8,只要可以编码中文的格式都可以,所以选择UTF-8还是GBK其实都无所谓。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值