午夜拍鍵驚奇
          子夜 編程 代碼與我同在
          posts - 48,comments - 118,trackbacks - 79
          相信很多朋友在使用JSP/Servlet等技術進行頁面編程的時候都會或多或少地遇到亂碼問題。解決的方法有很多,比較常見的是手動對所有可能包含中文的字符串進行轉碼:

          String latin = ;
          String gbk 
          = new String(latin.getBytes("iso-8859-1"),"gbk");

          這個方法過去我也比較常用,的確有效,但很累贅耶,絲毫沒有模式之美,有沒有更優雅的方法呢?如果你和我一樣有疑慮的話,可以考慮使用FilterServlet:

           1import java.io.*;
           2import javax.servlet.*;
           3import javax.servlet.http.*;
           4
           5import org.apache.log4j.*;
           6
           7public class CharsetFilter
           8    extends HttpServlet implements Filter{
           9  private static Logger logger = Logger.getLogger("Filter servlet");
          10
          11  public void init(FilterConfig filterConfig)
          12      throws ServletException{
          13  }

          14
          15  public void doFilter(ServletRequest request,ServletResponse response,
          16      FilterChain filterChain){
          17    if(request != null){
          18      String charset = request.getCharacterEncoding();
          19      if(charset == null || !charset.equalsIgnoreCase("gbk"))
          20        try{
          21          request.setCharacterEncoding("GBK");
          22        }

          23        catch(UnsupportedEncodingException ex){
          24          logger.warn(ex.getMessage());
          25        }

          26    }

          27    try{
          28      filterChain.doFilter(request,response); // 遞交責任鏈下一環
          29    }

          30    catch(Exception ex){
          31      logger.error(ex.getMessage());
          32    }

          33  }

          34
          35  public void destroy(){
          36  }

          37}

          38

          FilterServlet內部應該使用責任鏈(Chain of Responsibility)實現,在這里我們把對字符串的轉碼做為責任鏈中的一環,從上一環拿到request,處理后交給鏈的下一環。另外需要在web.xml里做些配置:

          <filter>
            
          <filter-name>charsetfilter</filter-name>
            
          <filter-class>pqp.servlet.CharsetFilter</filter-class>
          </filter>
          <filter-mapping>
            
          <filter-name>charsetfilter</filter-name>
            
          <url-pattern>/*</url-pattern>
            
          <dispatcher>REQUEST</dispatcher>
          </filter-mapping>

          其中“REQUEST”指定了filter攔截的類型,有REQUEST、FORWARD、ERROR和INCLUDE,可組合選擇,一般選REQUEST。全部設置好后重新打包、部署,這樣Servlet就可以自動把所有的request轉換為GBK的字符集了,是不是很方便?但在這里加了filter后對性能方面的影響未知,大家可以討論一下。
          posted on 2005-11-04 19:42 ^ Mustang ^ 閱讀(1780) 評論(0)  編輯  收藏 所屬分類: Java 點滴
          主站蜘蛛池模板: 德江县| 清新县| 南汇区| 泸水县| 鄢陵县| 从江县| 丁青县| 太原市| 昆山市| 阿坝| 天等县| 施秉县| 介休市| 专栏| 新津县| 吉水县| 和平区| 九寨沟县| 五常市| 托里县| 交口县| 惠东县| 环江| 邵东县| 合水县| 阿拉善左旗| 花垣县| 和政县| 定西市| 无极县| 大港区| 霸州市| 兴城市| 永年县| 峨边| 田林县| 延津县| 曲沃县| 科尔| 镇坪县| 通城县|