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进行转码了,就是这么简单。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值