中文亂碼處理之Servlet

前些時間做實驗遇到的一些中文亂碼問題,我總結爲以下三種:

  1. 表單提交(GET&POST);
  2. 超鏈接;
  3. sendRedirect()(重定向);

我們首先分析以下,爲什麼會出現中文亂碼,而英文確不會亂碼?

原因是這樣的:當我們需要向服務器發送一個請求時,在瀏覽器上所用的編碼方式(一般是utf-8),發送給服務器時,服務器解碼方式默認爲iso-8859-1,編碼和解碼的方式不一致,也就是說服務器不認識瀏覽器發送過來的請求,無法進行處理,更不用說對瀏覽器做出響應。所以我們的解決方式就是對字符集進行一致性的更改。

 1.表單提交

 表單提交出現亂碼的情況可能是最爲常見的,因爲get和post兩種不同的提交方式,所以也對應着不同的處理方式。

GET:get請求內容位於URL中,

//獲取表單內容
String username=request.getParameter(“username”); 

//修改服務器端的解碼方式
String newString =new String(string.getBytes("ISO-8859-1"),"UTF-8");

 值傳遞給服務器時,服務器要將iso-8859-1的解碼方式改爲utf-8進行解碼。

POST: post 請求內容位於http請求體中,所以我們需要改變的是請求體中字符集編碼,(這個對於get是無效的,因爲get的內容位於URL中)執行代碼爲:

request.setCharacterEncoding("utf-8");

這樣就可以在控制臺輸出中文了,記住這裏只是在控制檯輸出。

如果想要在瀏覽器界面輸出中文不亂碼,那麼可以想一下,是誰在往頁面上輸出內容,正是服務器。所以我們只需要設置服務器發送響應時的編碼即可,response就是Servlet中的一個內置響應對象。

response.setCharacterEncoding("utf-8");

response.setContentType("text/html");

//兩條語句合併起來就是下面這句,實現效果一樣

response.setContentType("text/html;charset=utf-8");

 2.超鏈接

超鏈接攜帶參數的寫法:

<a href="/項目名稱/具體Servlet界面?變量名=變量值">鏈接文字</a>

<a href="/WebProject/GetServletInfo?username=小明">超鏈接亂碼測試</a>

當點擊鏈接後,我們會發現URL地址中會顯示攜帶參數,

所以說超鏈接提交本質上是get()提交,只需要用get處理方式就好了。

 3.重定向

重定向(sendRedirect)和重轉發(foward)都是用來完成頁面的跳轉,兩者不一樣的地方是,重定向發生在瀏覽器,也就是說相當於在瀏覽器重發一次http請求,而重轉發只是發生在服務器內部,通知服務器去調用另外一個web資源進行處理。重點是:他同樣是發生在瀏覽器,相當於重寫了一個頁面,而服務器還是按原來iso-8859-1的解碼方式接受,所以同樣用getBytes()方法解決。

以下是重定向和重轉發的區別:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章