文章主要针对Tomcat中JSP开发容易出现的中文乱码问题。
1、JSP中输出中文的乱码问题
JSP输出中文,即直接在JSP中输出中文,或者给变量赋中文值再输出等。
原因:
这种情况下的乱码问题往往是因为没有给JSP页面制定显示字符的编码方式。
解决:
在JSP页面头部加上语句<%@ page contentType="text/html; charset=utf-8" %>(在Servlet页面中使用http.ServletResponse.setContentType("text/html; charset=gbk")),最好同时在JSP页面的<head>部门加上<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
2、获取表单提交的数据时(POST方式)
代码如下:
<!-- radiocheck.jsp -->
<%@ page contentType="text/html; charset=utf-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>单选按钮与复选框</title>
</head>
<body>
<%
String str1=request.getParameter("radiobutton");
String str2[]=request.getParameterValues("check");
if(str1!=null && str2!=null)
{
//str1=new String(str1.getBytes("ISO-8859-1"),"utf-8");
out.println("你经常使用的是"+str1+"上网<br>");
out.println("经常上网的地方是:");
if(str2!=null)
{
for(int i=0; i<str2.length; i++)
{
out.println(str2[i]+" ");
}
}
}
%>
<form name="form1" method="post" action="">
<p>你使用什么方式上网</p>
<p><input name="radiobutton" type="radio" value="ASDL" checked>ASDL</p>
<p><input name="radiobutton" type="radio" value="拨号上网">拨号上网</p>
<p><input name="radiobutton" type="radio" value="无线接入">无线接入</p>
<p><input name="radiobutton" type="radio" value="DDN专线">DDN专线</p>
<p>你经常在什么地方上网</p>
<p><input name="check" type="checkbox" value="home">home</p>
<p><input name="check" type="checkbox" value="school">school</p>
<p><input name="check" type="checkbox" value="Internet Bar">Internet Bar</p>
<p><input name="submit" type="submit" value="Submit"></p>
</form>
</body>
</html>
原因:
在没有加任何其它处理之前,用request.getParameter(paramName) 获取表单提交中的数据,且表单数据中含有中文时,返回的字符串会出现乱码。出现这种情况的原因是Tomcat的J2EE实现对表单提交,即以POST方式提交的参数采用默认的ISO-8859-1来处理。
解决:
方法一:
不修改其他设置,只是在将表单中的中文数据提取出来后再转换编码。
例如:代码中对于String str1=request.getParameter("radiobutton");进行转换编码语句如下:
str1=new String(str1.getBytes("ISO-8859-1"),"utf-8");
这种方法只是从一个局部来考虑,如果这样的地方太多,就不得不将这条语句重复写很多次,在比较大的项目中,就需要用方法二。
方法二:
使用过滤器(filter),即让对所有页面的请求都通过一个Filter,将处理字符集设置为utf-8。具体做法如下:在Tomcat的\webapps\examples\(如:F:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\examples\WEB-INF\classes\filters)有一个完整的例子,也可以参考其中web.xml和SetCharacterEncodingFilter的配置。
A:首先将%Tomcat%\webapps\examples\WEB-INF\classes\filters\目录下的文件SetCharacterEncodingFilter.java拷贝到自己Eclipse工程下的src文件里,同时要修改其中的包packet路径,改成正确的packet路径。
B:然后将web.xml文件<web-app>后面添加如下代码:
<filter> <filter-name>SetCharacterEncoding</filter-name> <filter-class>com.b2b.alibaba.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>SetCharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
C:编译运行,所有乱码问题解决。
3、URL中的中文问题(GET请求)
对于直接通过URL 中传递中文参数,如“http://localhost:8080/liuxl/jsp/radiocheck.jsp?str1=中文”这样的GET请求,在服务端用request.getParameter("paramName")时返回的是乱码。按以上的两种方法都不管用。
例如:
代码同上,只需将<form name="form1" method="post" action="">修改成 <form name="form1" method="get" action="">即可。
原因:
Tomcat中以GET方式提交的请求对query-string处理时采用了和POST不一样的处理方式。
解决:
打开Tomcat安装目录下的/conf/server.xml文件(如:F:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\server.xml),找到Connector块,往其中添加URIEncoding="utf-8",添加后完整的Connector块代码如下:
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />