Servlet類與前端進行數據交互


本文轉自:https://blog.csdn.net/kevinr1990/article/details/78655407

Servlet與頁面之間的中文亂碼問題

1介紹

很多時候,我們在寫JavaEE的Servlet程序時,需要從前端頁面獲取數據,在控制台打印輸出,或者在Servlet中設置名稱,在其它頁面顯示或其他程序中輸出等。如果數據帶有中文字符,經常容易出現亂碼問題。
現在對各種亂碼的情況做一個歸納:

2原因分析

亂碼產生的原因是在一方編碼后,另一邊解碼時,解碼的字符集和編碼的不一致而導致的。可以簡單理解為(各種字符需要先編碼以后,再傳輸,對方接收以后再按照指定的字符集進行解碼,同時顯示到頁面,或者打印到控制台)。

不同數據來源的編(解)碼格式不同:

數據來源 默認編碼格式
瀏覽器頁面 GBK
(可在瀏覽器頁面右鍵切換)
request(get) ISO-8859-1
request(post) GBK(同瀏覽器),但是如果是服務器來的頁面一般已經設置了UTF-8(例如JSP提交的頁面)
Servlet(response) ISO-8859-1

3亂碼處理方式

接收中文亂碼(就是頁面向服務器提交數據)

get方式  
    解決方式:new String(string.getBytes("ISO-8859-1"),"UTF-8");
    分析:表單中文數據在頁面以ISO編碼后,通過Http協議傳輸,到達Servlet后,若以UTF-8解碼,會出現亂碼。所以需要先轉成字節(ISO-8859-1解碼,傳過來的是以它編碼的),再包裝成字符串(UTF-8編碼)。Servlet中就可以顯示了(UTF-8)。
post方式 
    解決方式:request.setCharacterEncoding("UTF-8");
    分析:這里單向設置服務器端的解碼方式UTF-8即可(注意是通過request設置)。因為從服務器來的頁面一般已經設置成了UTF-8格式了(例如JSP提交的頁面)。
   
   
   
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

輸出中文亂碼(服務器向頁面輸出)

字符流
    解決方式一:response.setContentType("text/html;charset=UTF-8");
    等價於解決方式二:response.setCharacterEncoding("UTF-8");//UTF-8編碼
                    response.setHeader("Context-Type","text/html;charset=utf-8");
                    //通知瀏覽器UTF-8解碼網頁文件
    分析:方式一和方式二作用一樣。這種場景一般是Servlet程序中有中文字符,需要向頁面輸出。先設置服務器端的編碼方式UTF-8(注意是通過response設置),再通過設置響應的頭字段,通知瀏覽器以UTF-8進行解碼即可。
字節流
    解決方式:response.setHeader("Content-Type", "text/html;charset=UTF-8"); 
            // 設置瀏覽器默認打開的時候采用的字符集編碼
            response.getOutputStream().write("中文".getBytes("UTF-8"));    
            // 設置中文轉成字節數組的時候取出的編碼,默認會是ISO-8859-1
    分析:字節流的中文輸出包括兩步:先通知瀏覽器以UTF-8解碼。再想頁面(字節流)輸出字節。輸出內容:將中文字符串轉成字節數組(並設置以指定的UTF-8編碼)。
   
   
   
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4注意

1,一般情況下,JSP頁面的默認編碼字符集要設置成UTF-8。否則無法完成中文顯示和數據傳輸。這里不考慮GBK的情況
2,在服務器端的程序之間,數據傳輸都是以UTF-8格式傳輸的。所有不用考慮中文亂碼問題
3,setCharacterEncoding(“UTF-8”)是設置字符集,request調用是設置解碼方式(因為是從頁面過來的),而response調用時設置編碼方式(因為要想頁面輸出內容,先在Servlet中編碼)
4,getBytes(“UTF-8”);方法通過字符串調用,是按照指定字符集編碼。
5,new String(string.getBytes(“ISO-8859-1”),”UTF-8”);方法將string字符串先以原始(ISO-8859-1)進行解碼轉成字節數組,在以(UTF-8)編碼封裝成新字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM