If Winter comes, can Spring be far behind?
中午解决了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就可以了!
Trackback URL for this entry
6 条评论

# 1: 07-06-03 09:06:04, 明云 said:

我还是不明白,你那些编程要不要记在心里的?还是怎样才记得住.好多啊,教下吧

# 2: 07-07-07 00:07:02, stoneoil said:

历害啊,你是怎样学的啊?记得这么清楚

# 3: 07-07-07 15:07:50, 小何 said:

我个人认为要,而且最好要,其实只要你玩多了,就知道其实也不难的,但不一定要只字不差的记,只要知道大体也就足够了.一些常用的程序用多了,你想记不起来都不可能的..呵呵,是真的

# 4: 07-07-21 11:07:06, £緣不2li£ said:

看到我头晕;
看到我两眼冒星星;
看到我好想睡觉;
看到我傻了......

# 5: 08-01-22 00:01:51, 我 said:

呵呵!不懂晕

# 6: 08-08-20 23:08:14, 小黄 said:

很不错啊

添加评论

呢称 *

E-mail