相信很多朋友在使用JSP/Servlet等技术进行页面编程的时候都会或多或少地遇到乱码问题。解决的方法有很多,比较常见的是手动对所有可能包含中文的字符串进行转码:
String latin =
;
String gbk = new String(latin.getBytes("iso-8859-1"),"gbk");
这个方法过去我也比较常用,的确有效,但很累赘耶,丝毫没有模式之美,有没有更优雅的方法呢?如果你和我一样有疑虑的话,可以考虑使用FilterServlet:
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后对性能方面的影响未知,大家可以讨论一下。



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

3

4

5

6

7

8



9

10

11

12



13

14

15

16



17



18

19

20



21

22

23



24

25

26

27



28

29

30



31

32

33

34

35



36

37

38

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









其中“REQUEST”指定了filter拦截的类型,有REQUEST、FORWARD、ERROR和INCLUDE,可组合选择,一般选REQUEST。全部设置好后重新打包、部署,这样Servlet就可以自动把所有的request转换为GBK的字符集了,是不是很方便?
