首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts 中文亂碼終極解決:繼承 ActionServlet 統一設定 request 編碼

     編輯:Java 相關知識

問題背景

Struts 1.1 + Tomcat 5.x 環境下,表單提交中文參數在 Action 中取得亂碼。嘗試過手動轉碼、Filter 等方法均不穩定。

核心方案:自訂 ActionServlet 覆寫 process()

Struts 處理請求的總入口是 ActionServlet.process()。在此最早期設定 request.setCharacterEncoding(),確保後續 ActionForm 自動綁定參數時編碼正確。

MyActionServlet.java


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);
    }
}

web.xml 替換預設 ActionServlet


<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>

為何此法最有效?

  • 時機最早:Struts 核心控制器第一時間處理,早於任何 Action、Form Bean、Interceptor。
  • 覆蓋面最廣:所有請求 (含 .do、模組化子應用) 均經由此 Servlet。
  • 零侵入業務碼:無需在每個 Action、BaseAction、Filter 中重複設定。

輔助配置:JSP 頁面編碼宣告


<%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" %>

確保 JSP 編譯與輸出編碼一致。

Hibernate 同場加映:JDBC URL 指定編碼

若資料庫存取仍有亂碼,在 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 頁面編碼宣告與資料庫連線編碼參數,全鏈路無憂。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved