Java 與 UTF-8 編碼 (三)
這個系列的文章,主要都是要解決亂碼的問題。如果是英語系的國家,基本上就不用處理這些煩人的問題了。Java 本身就提供了原生的 Unicode Support,所以我的經驗是乾脆就全部都使用 UTF-8 編碼。(從網頁 --> 程式 --> 資料庫)
在 Java 與 UTF-8 編碼 (一) 跟 Java 與 UTF-8 編碼 (二) 都是比較偏向於網頁端處理部分,在裡面的例子我使用一支 Servlet 來處理 Form Submit 的處理,程式如下:
package com.esolution.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingTestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println(name+ "
");
}
}
裡面仔細看會看到
req.setCharacterEncoding("utf-8");
...
resp.setContentType("text/html;charset=utf-8");
分別對 HttpServletRequest 設定 UTF-8 encoding 以及對最後的 HttpServletResponse 設定 Content Type 的 charset 為 UTF-8。但是如果每個處理程式都要這樣做那有沒有更簡單的方式呢?有的,那就是使用 Filter。
Filter 在 Servlet 2.3 Spec. 中佔有很重要的地位,這篇文章有簡介 Filter 的功用以及介紹一些現成可以使用的 Filter。根據上面文章的解釋:
A filter is an object that can transform a request or modify a response. Filters are not servlets; they don't actually create a response. They are preprocessors of the request before it reaches a servlet, and/or postprocessors of the response leaving a servlet.
上面點出了 Filter 的最大功用,可以針對 request 做前置處理,以及 response 做後置處理。而我們現在就是希望可以在每個 request 以及 response 裡面加入 encoding 以及 content type 修改。其實在 Tomcat 裡面就已經有這個 Filter 了,內容如下:
package com.esolution.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String encoding = selectEncoding(request);
if (encoding != null) {
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
除了上面的程式之外,web.xml 也需要做一些設定:
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>com.esolution.filter.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這樣就可以用一支 Filter 把所有程式裡面的 request 以及 response 關於 encoding 跟 content type charset 都設定為 UTF-8 了。
沒有留言:
張貼留言