一、乱码问题
上一篇博客中发现jsp:getProperty拿出中文的name和sex后出现了乱码,但我们在浏览器输入name时是正常显示的中文,也就是UTF-8格式的中文,说明这期间数据的格式发生了变化,来看一下是什么时候变的,是不是jsp:setProperty导致的呢?
最好的调试利器就是打印了,在useBean之前先从request中读取表单数据name:
页面显示,访问:
跳转:
可以看到,其实数据在被封装到request对象中就已经是乱码了。
总结:
在提交数据时,默认将字符串变成ISO-8859-1的编码格式,然后进行传输,所以request.getParameter()获取到的是ISO8859-1格式的字符串。
而浏览器使用UTF-8编码格式来解析时,就会转成另外的字符串,从而出现乱码。但是英文字母和数字不受影响,我猜测可能是因为英文字母和数字的ISO8859-1和UTF-8的编码是相同的。(暂时这样理解,还没有求证过)
现在有两个个解决办法:
1)在jsp:getProperty之前,先将要拿的参数的编码格式设置为UTF-8:
首先拿到这个乱码:
写在一块就是:
页面效果,的确没有乱码了:
写在jsp:setProperty中,即:
页面效果:
乱码问题已经解决。
但如果是这样写,可读性较低,而且request.getParameter("name")可能为NULL,所以建议把这些代码封装到一个专门处理乱码的方法中。
不过,还是不能使用property="*"了,因为要指定每个成员属性的value怎么取。
2)在jsp:setProperty之前,使用request.setCharacterEncoding("UTF-8")直接设置request对象中封装的数据的编码格式为"UTF-8":
代码如下:
页面效果:
上一篇博客中发现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:
页面显示,访问:
跳转:
可以看到,其实数据在被封装到request对象中就已经是乱码了。
总结:
在提交数据时,默认将字符串变成ISO-8859-1的编码格式,然后进行传输,所以request.getParameter()获取到的是ISO8859-1格式的字符串。
而浏览器使用UTF-8编码格式来解析时,就会转成另外的字符串,从而出现乱码。但是英文字母和数字不受影响,我猜测可能是因为英文字母和数字的ISO8859-1和UTF-8的编码是相同的。(暂时这样理解,还没有求证过)
现在有两个个解决办法:
1)在jsp:getProperty之前,先将要拿的参数的编码格式设置为UTF-8:
首先拿到这个乱码:
写在一块就是:
页面效果,的确没有乱码了:
写在jsp:setProperty中,即:
页面效果:
乱码问题已经解决。
但如果是这样写,可读性较低,而且request.getParameter("name")可能为NULL,所以建议把这些代码封装到一个专门处理乱码的方法中。
不过,还是不能使用property="*"了,因为要指定每个成员属性的value怎么取。
2)在jsp:setProperty之前,使用request.setCharacterEncoding("UTF-8")直接设置request对象中封装的数据的编码格式为"UTF-8":
代码如下:
页面效果:
上一篇博客中发现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>
页面效果: