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

JSTL + Spring + Hibernate 中文亂碼徹底解決方案

     編輯:Java 相關知識

三層編碼統一鐵律

**請求 → 處理 → 回應** 每一環節編碼必須一致。以 **Big5** (繁體中文環境) 為例,UTF-8 環境請自行替換。

1. Web.xml:字元編碼過濾器 (最優先攔截請求)


<filter>
  <filter-name>SetCharacterEncoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>big5</param-value>
  </init-param>
  <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value> <!-- 強制覆蓋請求編碼 -->
  </init-param>
</filter>
<filter-mapping>
  <filter-name>SetCharacterEncoding</filter-name>
  <url-pattern>*.jsp</url-pattern>
</filter-mapping>

關鍵:forceEncoding=true 確保 request.getParameter() 正確解碼 POST 表單資料。

2. Spring MVC ViewResolver:指定輸出編碼


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
  <property name="contentType" value="text/html;charset=big5"/>
</bean>

JstlView 會正確設定 response.setContentType() 並配合 JSTL <c:out> 輸出。

3. JSP 頁面指令:雙重保險


<%@ page contentType="text/html;charset=big5" pageEncoding="big5" %>
  • contentType:回應 HTTP Header Content-Type
  • pageEncoding:JSP 檔案本身儲存編碼 (IDE 存檔編碼須一致)

4. 隱藏坑:Controller 綁定物件時的編碼

作者發現繼承 SimpleFormController 時,onSubmit 內 Person person = (Person) command; 取得的屬性已亂碼。

原因:Spring 預設使用 ISO-8859-1 解碼請求參數再綁定,Filter 雖設定了編碼,但綁定發生在 Filter 之後?實際上 CharacterEncodingFilter 應在 DispatcherServlet 前執行。若仍失效,可能是 Filter 順序或 forceEncoding 未生效。

補救方案 (治標) / 根治方案 (治本)

治標:Controller 內手動轉碼


person.setPname(new String(person.getPname().getBytes("ISO-8859-1"), "big5"));

治本:確保 Filter 正確配置與順序

  1. web.xml 中 CharacterEncodingFilter **必須在最前面** (第一個 <filter>)。
  2. forceEncoding=true 開啟。
  3. Tomcat 5.0+ server.xml <Connector URIEncoding="big5" /> (處理 GET 請求 URL 參數)。
  4. JSP 檔案以 Big5/UTF-8 無 BOM 格式儲存。

5. 資料庫層:Hibernate 連線編碼


<property name="hibernate.connection.url">
  jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=big5
</property>

MySQL 需 useUnicode=true&characterEncoding=big5;SQL Server 用 characterEncoding=GBK (見文中)。

總結檢查清單

層級配置點關鍵值
請求過濾CharacterEncodingFilterencoding=big5, forceEncoding=true
View 解析InternalResourceViewResolvercontentType=text/html;charset=big5
JSP 頁面page 指令contentType=..., pageEncoding=...
Tomcatserver.xml ConnectorURIEncoding=big5 (GET 參數)
資料庫JDBC URLcharacterEncoding=big5/GBK
檔案儲存IDE 編碼設定Big5 / UTF-8 無 BOM

逐項核對,亂碼無處遁形。

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