JSP_10th_解决乱码问题

一、乱码问题
上一篇博客中发现jsp:getProperty拿出中文的name和sex后出现了乱码,但我们在浏览器输入name时是正常显示的中文,也就是UTF-8格式的中文,说明这期间数据的格式发生了变化,来看一下是什么时候变的,是不是jsp:setProperty导致的呢?

最好的调试利器就是打印了,在useBean之前先从request中读取表单数据name:
<%@ page import="com.hpe.bean.SayHelloBean" %>
<%@ page contentType="text/html; charset=UTF-8" %>

<%=request.getParameter("name") %>

<jsp:useBean id="hello" class="com.hpe.bean.SayHelloBean" scope="request">
	<jsp:setProperty name="hello" property="*" /> 
</jsp:useBean>

<!doctype html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>SayHelloBean</title>
</head>
<body>
	<p>欢迎</p>
	<jsp:getProperty name="hello" property="name" />
 	<jsp:getProperty name="hello" property="sex" />
</body>
</html>

页面显示,访问:


跳转:


可以看到,其实数据在被封装到request对象中就已经是乱码了。

总结:
在提交数据时,默认将字符串变成ISO-8859-1的编码格式,然后进行传输,所以request.getParameter()获取到的是ISO8859-1格式的字符串。

而浏览器使用UTF-8编码格式来解析时,就会转成另外的字符串,从而出现乱码。但是英文字母和数字不受影响,我猜测可能是因为英文字母和数字的ISO8859-1和UTF-8的编码是相同的。(暂时这样理解,还没有求证过)

现在有两个个解决办法:

1)在jsp:getProperty之前,先将要拿的参数的编码格式设置为UTF-8:
首先拿到这个乱码:
String name = request.getParameter("name");
然后将乱码转换成字节数组:
name.getBytes("ISO-8859-1")	//用指定字符集ISO-8859-1来对该字符串进行编码,然后存放到byte数组中。
查阅API,String有一个构造方法:
String(byte[] bytes, Charset charset)
结合起来:
new String(name.getBytes("ISO-8859-1"), "UTF-8")	//将byte数组以UTF-8的编码方式转换成String字符串。
打印该字符串:
out.println(new String(name.getBytes("ISO-8859-1"), "UTF-8"));

写在一块就是:
<%
	String name = request.getParameter("name");
	out.println(new String(name.getBytes("ISO-8859-1"), "UTF-8"));
%>

页面效果,的确没有乱码了:


写在jsp:setProperty中,即:
<jsp:useBean id="hello" class="com.hpe.bean.SayHelloBean" scope="request">
	<%-- <jsp:setProperty name="hello" property="*" /> --%>
	
	<jsp:setProperty name="hello" property="name" value='<%= new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8") %>' />
	<jsp:setProperty name="hello" property="sex"  value='<%= new String(request.getParameter("sex").getBytes("ISO-8859-1"), "UTF-8") %>' /> 
	 
</jsp:useBean>

页面效果:


乱码问题已经解决。
但如果是这样写,可读性较低,而且request.getParameter("name")可能为NULL,所以建议把这些代码封装到一个专门处理乱码的方法中。

不过,还是不能使用property="*"了,因为要指定每个成员属性的value怎么取。

2)在jsp:setProperty之前,使用request.setCharacterEncoding("UTF-8")直接设置request对象中封装的数据的编码格式为"UTF-8":
代码如下:
<%@ page import="com.hpe.bean.SayHelloBean" %>
<%@ page contentType="text/html; charset=UTF-8" %>

<% request.setCharacterEncoding("UTF-8"); %>

<jsp:useBean id="hello" class="com.hpe.bean.SayHelloBean" scope="request">
	<jsp:setProperty name="hello" property="*" />
</jsp:useBean>

<!doctype html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>SayHelloBean</title>
</head>
<body>
	<p>欢迎</p>
	<jsp:getProperty name="hello" property="name" />
 	<jsp:getProperty name="hello" property="sex" />
</body>
</html>

页面效果:



 


一、乱码问题
上一篇博客中发现jsp:getProperty拿出中文的name和sex后出现了乱码,但我们在浏览器输入name时是正常显示的中文,也就是UTF-8格式的中文,说明这期间数据的格式发生了变化,来看一下是什么时候变的,是不是jsp:setProperty导致的呢?

最好的调试利器就是打印了,在useBean之前先从request中读取表单数据name:
<%@ page import="com.hpe.bean.SayHelloBean" %>
<%@ page contentType="text/html; charset=UTF-8" %>

<%=request.getParameter("name") %>

<jsp:useBean id="hello" class="com.hpe.bean.SayHelloBean" scope="request">
	<jsp:setProperty name="hello" property="*" /> 
</jsp:useBean>

<!doctype html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>SayHelloBean</title>
</head>
<body>
	<p>欢迎</p>
	<jsp:getProperty name="hello" property="name" />
 	<jsp:getProperty name="hello" property="sex" />
</body>
</html>

页面显示,访问:


跳转:


可以看到,其实数据在被封装到request对象中就已经是乱码了。

总结:
在提交数据时,默认将字符串变成ISO-8859-1的编码格式,然后进行传输,所以request.getParameter()获取到的是ISO8859-1格式的字符串。

而浏览器使用UTF-8编码格式来解析时,就会转成另外的字符串,从而出现乱码。但是英文字母和数字不受影响,我猜测可能是因为英文字母和数字的ISO8859-1和UTF-8的编码是相同的。(暂时这样理解,还没有求证过)

现在有两个个解决办法:

1)在jsp:getProperty之前,先将要拿的参数的编码格式设置为UTF-8:
首先拿到这个乱码:
String name = request.getParameter("name");
然后将乱码转换成字节数组:
name.getBytes("ISO-8859-1")	//用指定字符集ISO-8859-1来对该字符串进行编码,然后存放到byte数组中。
查阅API,String有一个构造方法:
String(byte[] bytes, Charset charset)
结合起来:
new String(name.getBytes("ISO-8859-1"), "UTF-8")	//将byte数组以UTF-8的编码方式转换成String字符串。
打印该字符串:
out.println(new String(name.getBytes("ISO-8859-1"), "UTF-8"));

写在一块就是:
<%
	String name = request.getParameter("name");
	out.println(new String(name.getBytes("ISO-8859-1"), "UTF-8"));
%>

页面效果,的确没有乱码了:


写在jsp:setProperty中,即:
<jsp:useBean id="hello" class="com.hpe.bean.SayHelloBean" scope="request">
	<%-- <jsp:setProperty name="hello" property="*" /> --%>
	
	<jsp:setProperty name="hello" property="name" value='<%= new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8") %>' />
	<jsp:setProperty name="hello" property="sex"  value='<%= new String(request.getParameter("sex").getBytes("ISO-8859-1"), "UTF-8") %>' /> 
	 
</jsp:useBean>

页面效果:


乱码问题已经解决。
但如果是这样写,可读性较低,而且request.getParameter("name")可能为NULL,所以建议把这些代码封装到一个专门处理乱码的方法中。

不过,还是不能使用property="*"了,因为要指定每个成员属性的value怎么取。

2)在jsp:setProperty之前,使用request.setCharacterEncoding("UTF-8")直接设置request对象中封装的数据的编码格式为"UTF-8":
代码如下:
<%@ page import="com.hpe.bean.SayHelloBean" %>
<%@ page contentType="text/html; charset=UTF-8" %>

<% request.setCharacterEncoding("UTF-8"); %>

<jsp:useBean id="hello" class="com.hpe.bean.SayHelloBean" scope="request">
	<jsp:setProperty name="hello" property="*" />
</jsp:useBean>

<!doctype html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>SayHelloBean</title>
</head>
<body>
	<p>欢迎</p>
	<jsp:getProperty name="hello" property="name" />
 	<jsp:getProperty name="hello" property="sex" />
</body>
</html>

页面效果:



 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值