中午解决了PHP的中文问题,从今天下午到晚上,集中所有精力也解决了Servlet的中文问题,并总结了如下这篇文章。
在很多时候,JSP中文问题曾困扰了许多编程者,包括我在内,在谈到JSP方面的中文问题都有点害怕了,有时候甚至开了电脑都不想去再搞那些程序!但又必须完成任务!没办法,只好到处找资料!网上的,书店的都用过了!有的也描述的比较详细,还是不错的.但始终没有提到表单提交时(POST和GET方法都有),Tomcat对GET方法提交的请求在query-string处理时采用的是和POST方法不一样的处理方式(而在Tomcat4是一样的),所以不管你怎么设置setCharacterEncoding("GBK")都是不起作用的!
这种中文问题多出现在Servlet中处理表单的提交中.在Servlet中处理表单一般不指定是POST还是GET方法?所以它会采用默认的GET方法.而此时你在HttpServlet类的doGet方法中还是在doPost方法中用
response.setContentType("text/html;charset=GBK");
request.setCharacterEncoding("GBK");
指定字符集都只对POST方法起作用!而对Get还是没有起作用的!这种所谓的解决中文问题在很多书中都出现过!其实只能解决问题的一半!另外如果再用下面的字符转换
String commentContent= request.getParameter("commentContent");
commentContent = new String(commentContent.getBytes("ISO8859-1"), "GBK");
的确可以解决中文问题(不管是POST还是GET方法都可解决)!但好像太麻烦!或许可以写个函数之类的来处理!但这样并不是那么完美的解决问题!
而对于没有用到Servlet的用户一般很少会遇到解决不了的中文问题!因为JSP页面中一般会指定method="post" .只要注意如下几点就可以解决问题:
设置JSP文件的编码格式.
设定接收参数的编码格式.
设定响应时的编码格式.
JSP页面显示中文乱码问题一般为没有指定JSP文件的响应结果的MIME类型.
在JSP文件的最上方添加如下语句:
<%@page contentType="text/html; charset=GBK"%>
并在</head>之前添加如下语句:
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
这样就可以解决JSP的中文问题!
而对于上面提到的Servlet中文问题一般是Servlet中处理表单的提交中
①对于GET方法提交,定位到你Tomcat安装目录下的conf目录,打开conf目录下的server.xml文件,找到对JSP网页端口(默认为8080)进行服务的Connector组件的设置部分,给该Connector组件添加一个属性:URIEncoding="GBK".修改后的Connector组件如下:
<Connector port="9080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
这样修改后,重启Tomcat就可以正确处理GET方法提交的表单数据了!
②对于POST方法提交本人建议使用过滤器(可以在网上找到设置方法).
过滤器(SetCharacterEncodingFilter.java)的代码如下:
package filters; //注意要建立filters文件夹。
import java.io.IOException;
import javax.servlet.*;
public class SetCharacterEncodingFilter
implements Filter
{
protected String encoding;
protected FilterConfig filterConfig;
protected boolean ignore;
public SetCharacterEncodingFilter()
{
encoding = null;
filterConfig = null;
ignore = true;
}
public void destroy()
{
encoding = null;
filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
if(ignore || request.getCharacterEncoding() == null)
{
String encoding = selectEncoding(request);
if(encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig)
throws ServletException
{
this.filterConfig = filterConfig;
encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if(value == null)
ignore = true;
else
if(value.equalsIgnoreCase("true"))
ignore = true;
else
if(value.equalsIgnoreCase("yes"))
ignore = true;
else
ignore = false;
}
protected String selectEncoding(ServletRequest request)
{
return encoding;
}
}
编译后的class文件放在classes目录下(在classes目录下要建立filters文件夹放置该过滤器编译后的class文件),并在Web应用的web.xml文件中的<web-app>标签后面添加如下代码:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这里指定目标编码方式是GBK,任何请求都要经过这个过滤器(url-pattern为"/*").重新启动Tomcat就可以了!