最近又开始把JSP重新拿出来学一遍,有了不少的收货,有些之前没注意到的小细节也发现了解决的方法,比如form表单的乱码问题。乱码问题在写web程序时很常见,也很让人头疼,有时候一个疏忽就会出现乱码,接下来我主要讲一下我学到的解决方法。
(一)使用post请求提交表单出现乱码问题
现在有如下的代码,这段代码会使用post方式 提交相应的内容到request.jsp这个页面。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<hr/>
<form action="request.jsp" method="post">
用户名:
<input type="text" name="userName" /> <br/>
爱好:
<input type="checkbox" name="favorite" value="read">阅读
<input type="checkbox" name="favorite" value="music">音乐
<input type="checkbox" name="favorite" value="dance">跳舞 <br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
requst.jsp的代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>request内置对象</title>
</head>
<body>
<h1>request内置对象</h1>
<hr/>
用户名:<%=request.getParameter("userName") %><br/>
爱好:
<%
String[] favorites = request.getParameterValues("favorite");
if(null != favorites) {
for(String favorite : favorites) {
out.println(favorite + " ");
}
}
%>
<br/>
</body>
</html>
对于从reg.jsp提交过来的请求,如果只是使用requst.getParameter(String name)的方式来获取userName的参数值,如果userName的值里面包含中文,那么获取到的值就会出现乱码现象。出现这个问题的原因是提交表单时tomcat服务器(以tomcat为例)默认提交的字符编码是ISO-8859,但是中文的编码为UTF-8,request.jsp收到请求时未给request请求设置字符集,而要解决这个问题,就需要服务器端的最开始处将请求的数据设置为“UTF-8”就行了,输入如下语句:request. setCharacterEncoding(“UTF-8”);这样用户在服务器端获取到的中文数据就不再是乱码了。注意在使用setCharacterEncoding方法设置字符编码时设置的编码要与请求页面的字符编码一致。
(二)通过URL传递参数出现的乱码问题
很多时候会通过URL来传递请求参数,如下对reg.jsp的代码做了修改:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<hr/>
<form action="request.jsp" method="post">
用户名:
<input type="text" name="userName" /> <br/>
爱好:
<input type="checkbox" name="favorite" value="read">阅读
<input type="checkbox" name="favorite" value="music">音乐
<input type="checkbox" name="favorite" value="dance">跳舞 <br/>
<input type="submit" value="提交"/>
</form>
<a href="request.jsp?userName=李四">通过URL方式提交参数</a>
</body>
</html>
添加了一个超链接,指向的也是request.jsp,传递了一个userName为李四的参数,这时通过request.getParameter(String name)方式获取参数值时也会出现乱码,而要解决这个乱码可以通过修改服务器的配置来实现,以tomcat服务器为例,修改tomcat 目录-> conf-> server.xml,修改如下内容:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
添加一个URIEncoding的配置即可。
还有更多的解决form表单乱码的方法可以参考
这篇文章。