Tomcat5.5中文乱码完美解决方案有哪些



Tomcat5.5中文乱码完美解决方案有哪些?新手学习Web编程的时候大多数都是使用Tomcat作为服务器,其中面临的一个最主要的问题就是中文乱码问题。JAVA阵营的工具不如.NET阵营那样容易使用,我们必须手动的做一些修改才能让Web页面支持中文。幸运的是,Tomcat发展到今天的5.5版本,对于非英文的支持已经相当不错了,你只需做很少的很简单的修改就可以让网页支持中文,下面我们就来看一看该如何做修改。

首先,对于所有的页面应该指定为GBK编码,也就是包含如下指令:

<%@ page contentType=”text/html;charset=GBK” language=”java” %>

第二步,修改Tomcat目录下的web.xml文件,在我电脑上的路径为C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml。在这个文件里有一个Connector节点,为其增加一个属性URIEncoding属性,并为该属性赋值为GBK,修改结果如下:
<Connector port=”80″ maxHttpHeaderSize=”8192″

maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″

enableLookups=”false” redirectPort=”8443″ acceptCount=”100″

connectionTimeout=”20000″ disableUploadTimeout=”true”

URIEncoding=”GBK” />
注意最后一行,也就是与众不同的绿色的那一行,是需要我们手动添加的。

第三步,添加一个Filter用于转码。

对于Filter该怎么写,完全不用你操心,Tomcat自带一个非常完美的例子,你只需要把该例子的代码原封不动的copy到你自己的类里面就OK了,简单吧!!!

在我的系统中,该例子位于C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java。

方便起见,我把该类的代码贴出来,并将其英文注释进行简单的汉化,你使用的时候复制我的代码也是一样有效:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;

public class SetCharacterEncodingFilter implements Filter {

// 你需要转换的编码,对于我们,当然希望他的值为”GBK”了
//不过不用你操心,后面会对其进行设置
protected String encoding = null;


//配置文件,根据web.xml中的配置内容自动初始化,不用你操心
protected FilterConfig filterConfig = null;

//是否忽略客户端指定的编码规则。True表示忽略。
//当然要忽略,因为我们要自己指定编码规则嘛。GBK、GBK、GBK~~~
protected boolean ignore = true;

//当这个过滤器被销毁的时候由系统来调用,不用管他
public void destroy() {

this.encoding = null;
this.filterConfig = null;

}
//真正的转码操作由这个函数完成
//内容很简单,就是将encoding的值赋给request
//至于encoding等于啥?由下面的selectEncoding函数决定
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {

// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}

//对于filterConfig进行初始化
//很重要的一个方法,它对encoding属性进行了赋值,而这个值来自于配置文件
//换句话说,如果我们要指定一个编码规则,根本不用在程序里指定
//只需要在配置文件里指定一下就OK了。
//所以,在这个代码中你是看不到”GBK”字样的
//但是我们在配置文件中稍加修改,它就能够按照GBK进行转码。好灵活啊!
public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter(“encoding”);
String value = filterConfig.getInitParameter(“ignore”);
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase(“true”))
this.ignore = true;
else if (value.equalsIgnoreCase(“yes”))
this.ignore = true;
else
this.ignore = false;

}

// 返回encoding的值,该值已经被init函数初始化了。
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
最后一步,修改你的Web应用程序的配置文件,将这个Filter添加进去。找到你自己的Web项目的Web.xml文件(注意啊,不是Tomcat中的Web.xml文件),为Webapp节点增加2个子节点:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>hello.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>
上面第一处绿色字体,需要注意的是,要写对完整的包路径。我将上述代码命名为SetCharacterEncodingFilter类,并且打包为hello,因此我就写成上述样子。这里需要根据你的实际情况进行修改。第二处绿色字体,终于看到了我们期待已久的GBK!!!!!!!

是的,你只需要在此填写一个GBK,它就按照GBK进行转码了,就是这么简单。

至此,已经能够完美解决中文问题,赶快去试试吧。