Struts 1.1 + Tomcat 5.x 環境下,表單提交中文參數在 Action 中取得亂碼。嘗試過手動轉碼、Filter 等方法均不穩定。
Struts 處理請求的總入口是 ActionServlet.process()。在此最早期設定 request.setCharacterEncoding(),確保後續 ActionForm 自動綁定參數時編碼正確。
package strutsdemo;
import javax.servlet.http.*;
import org.apache.struts.action.ActionServlet;
public class MyActionServlet extends ActionServlet {
@Override
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 核心一行:在 Struts 內部處理前設定編碼
request.setCharacterEncoding("GB2312"); // 或 UTF-8
super.process(request, response);
}
}
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>strutsdemo.MyActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
.do、模組化子應用) 均經由此 Servlet。
<%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" %>
確保 JSP 編譯與輸出編碼一致。
若資料庫存取仍有亂碼,在 hibernate.cfg.xml 連線字串加入編碼參數:
<property name="hibernate.connection.url">
jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;characterEncoding=GBK;DatabaseName=myDB
</property>
SQL Server 驅動支援 characterEncoding 參數;MySQL 用 useUnicode=true&characterEncoding=GBK。
| 方案 | 優點 | 缺點 | 推薦度 |
|---|---|---|---|
手動 new String(req.getParameter().getBytes("ISO-8859-1"), "GBK") | 精確控制 | 汙染業務碼、易漏、GET/POST 不一 | ⭐ |
Filter request.setCharacterEncoding() | 通用、非 Struts 專屬 | 需確保 Filter 順序最前、forceEncoding | ⭐⭐⭐ |
| 繼承 ActionServlet 覆寫 process() | Struts 原生入口、最早、最全、零侵入 | 微侵入框架類 (可接受) | ⭐⭐⭐⭐⭐ |
Struts 專案中文亂碼,**繼承 ActionServlet 並在 process() 開頭設定 request.setCharacterEncoding() 是最乾淨、最徹底、最省心的方案**。配合 JSP 頁面編碼宣告與資料庫連線編碼參數,全鏈路無憂。