1. 程式人生 > >終極完美解決java web與tomcat伺服器中文亂碼問題

終極完美解決java web與tomcat伺服器中文亂碼問題

Java Web專案中,如果使用的是Tomcat伺服器的話,在資料互動時,經常會出現深惡痛絕 中文亂碼的問題,原因主要可以分為以下兩個方面:

1.在JSP頁面中,中文根本無法顯示。

這種情況下,通常的原因是:

沒有把檔案頭的字符集設定為中文字符集。

解決辦法:在檔案頭上寫明如下內容:

<%@ page language="java" pageEncoding="utf-8"%>

或者

<%@ page language="java" contentType="text/html; charset= utf-8"%>

utf-8編碼也可以用gb2312字符集替換,這兩個都是中文字符集,但一般普遍用utf-8

2.提交過程中顯示亂碼

提交過程中顯示亂碼指的是中文字元經過了tomcat伺服器之後,在IDE的控制檯中、提交到的頁面中等處產生的中文亂碼

我們一般可以通過url傳這個中文引數,看url中的中文引數是否亂碼判斷是在客戶端即瀏覽器中產生的亂碼還是在伺服器中產生的亂碼

在提交中文資料給伺服器,出現中文亂碼的原因是:

中文字元在被提交給伺服器時,由於伺服器會將其預設為ISO-8859-1 編碼,而在網頁上用的是utf-8或者gb2312編碼,不能相容。

有以下3個解決辦法

(1)直接將中文字串轉成utf-8格式

        String name = request.getParameter("stuname");
        name = new String(name.getBytes("ISO-8859-1"),"utf-8");

這種方法是直接將這個中文字串轉換成了支援中文的編碼,但是這種方法必須對每一個字串都進行轉碼,很直接但很麻煩

(2)直接修改request的編碼方式

可以將request的編碼修改為支援中文的編碼方式,這樣整個頁面中的請求,都可以自動轉為中文,

        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("stuname");

但是一定要注意的是:該方法必須在取出值之前就設定request的編碼,並且表單form的提交方式應該是post,並且這種方法必須對每個頁面都進行request的設定,也很麻煩

(3)使用過濾器

在大型專案中,如果每一個檔案都去設定編碼的話,十分繁瑣,故在工程中一般使用過濾器解決Tomcat中文亂碼問題。

利用過濾器,可以對整個Web應用進行統一的編碼過濾,比較方便。

注意:使用過濾器也要求表單提交方式是post,預設不設定的話表單提交方式是get

編寫過濾器方法:

首先,建立EncodingFilter的java類,程式碼如下

package Filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "EncodingFilter")
public class EncodingFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

然後,配置web.xml

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>Filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

要注意的是web.xml標籤是有一定順序的,順序不當會有The content of element type "web-app" must match "報錯,

例如,filter等的標籤應放在servlet的前面

重新提交併重啟,中文亂碼問題已成功解決  (也需要表單是post方法才行)

ps: 如果有任何問題可以評論留言,我看到後會及時解答,評論或關注,您的鼓勵是我分享的最大動力