


這個方法過去我也比較常用,的確有效,但很累贅耶,絲毫沒有模式之美,有沒有更優雅的方法呢?如果你和我一樣有疑慮的話,可以考慮使用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的字符集了,是不是很方便?
