使用FilterServlet对页面进行转码

相信很多朋友在使用JSP/Servlet等技术进行页面编程的时候都会或多或少地遇到乱码问题。解决的方法有很多,比较常见的是手动对所有可能包含中文的字符串进行转码:

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

这个方法过去我也比较常用,的确有效,但很累赘耶,丝毫没有模式之美,有没有更优雅的方法呢?如果你和我一样有疑虑的话,可以考虑使用FilterServlet:

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

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

23ExpandedSubBlockStart.gifContractedSubBlock.gif        catch(UnsupportedEncodingException ex)dot.gif{
24InBlock.gif          logger.warn(ex.getMessage());
25ExpandedSubBlockEnd.gif        }

26ExpandedSubBlockEnd.gif    }

27ExpandedSubBlockStart.gifContractedSubBlock.gif    trydot.gif{
28InBlock.gif      filterChain.doFilter(request,response); // 递交责任链下一环
29ExpandedSubBlockEnd.gif    }

30ExpandedSubBlockStart.gifContractedSubBlock.gif    catch(Exception ex)dot.gif{
31InBlock.gif      logger.error(ex.getMessage());
32ExpandedSubBlockEnd.gif    }

33ExpandedSubBlockEnd.gif  }

34InBlock.gif
35ExpandedSubBlockStart.gifContractedSubBlock.gif  public void destroy()dot.gif{
36ExpandedSubBlockEnd.gif  }

37ExpandedBlockEnd.gif}

38 None.gif

FilterServlet内部应该使用责任链(Chain of Responsibility)实现,在这里我们把对字符串的转码做为责任链中的一环,从上一环拿到request,处理后交给链的下一环。另外需要在web.xml里做些配置:

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

其中“REQUEST”指定了filter拦截的类型,有REQUEST、FORWARD、ERROR和INCLUDE,可组合选择,一般选REQUEST。全部设置好后重新打包、部署,这样Servlet就可以自动把所有的request转换为GBK的字符集了,是不是很方便? teeth_smile.gif但在这里加了filter后对性能方面的影响未知,大家可以讨论一下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值