相信很多朋友在使用JSP/Servlet等技术进行页面编程的时候都会或多或少地遇到乱码问题。解决的方法有很多,比较常见的是手动对所有可能包含中文的字符串进行转码:
这个方法过去我也比较常用,的确有效,但很累赘耶,丝毫没有模式之美,有没有更优雅的方法呢?如果你和我一样有疑虑的话,可以考虑使用FilterServlet:
FilterServlet内部应该使用责任链(Chain of Responsibility)实现,在这里我们把对字符串的转码做为责任链中的一环,从上一环拿到request,处理后交给链的下一环。另外需要在web.xml里做些配置:
其中“REQUEST”指定了filter拦截的类型,有REQUEST、FORWARD、ERROR和INCLUDE,可组合选择,一般选REQUEST。全部设置好后重新打包、部署,这样Servlet就可以自动把所有的request转换为GBK的字符集了,是不是很方便? 但在这里加了filter后对性能方面的影响未知,大家可以讨论一下。
String latin
=
;
String gbk = new String(latin.getBytes( " iso-8859-1 " ), " gbk " );
String gbk = new String(latin.getBytes( " iso-8859-1 " ), " gbk " );
这个方法过去我也比较常用,的确有效,但很累赘耶,丝毫没有模式之美,有没有更优雅的方法呢?如果你和我一样有疑虑的话,可以考虑使用FilterServlet:
1
import
java.io.
*
;
2 import javax.servlet. * ;
3 import javax.servlet.http. * ;
4
5 import org.apache.log4j. * ;
6
7 public 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
2 import javax.servlet. * ;
3 import javax.servlet.http. * ;
4
5 import org.apache.log4j. * ;
6
7 public 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 >
< 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后对性能方面的影响未知,大家可以讨论一下。