REASON
寫了一個表單頁面webBasic.jsp,資訊送出到Servlet,然後讀取資料庫資訊轉發到webBasic.jsp。
ERROR
輸出的漢字變為了亂碼。連jsp本身的内容,原先正常的也變成了亂碼。
主要代碼和效果截圖如下:
Servlet代碼:

Jsp代碼:
送出前界面:
送出後界面:
FIND
1、html,jsp,三處設定都為”UTF-8”,浏覽器編碼更改為UTF-8一樣會出現亂碼。
2、按照視訊裡的教育,在輸出前加上語句request.setCharacterEncoding(“UTF-8”);并沒有卵用。
3、按照網上的介紹,做了個過濾器,過濾/*,結果一打開所有頁面body裡的内容都沒了。隻好暫時改成/abc,過濾還沒學過,還是以後再用吧。
HANDLE
研究轉發的原理,我們最後得到的“整個頁面”應該就是最後Response的内容。也就是說Response的編碼有問題。
在CustomerServlet doGet的第一行加入response.setCharacterEncoding(“utf-8”);頁面正常。response.setContentType(“text/html;charset=UTF-8”);也可以。
進一步發現,亂碼的關鍵在于Servlet doGet中一個response.getWriter()語句,如果response.setCharacterEncoding(“utf-8”);在其之後,最後得到的頁面就會出現亂碼。
下面是這兩個語句之間的關系。
1、response.getWriter().append(“aaa”);
response.setCharacterEncoding(“utf-8”);
set語句在之後,出現亂碼
2、response.getWriter().append(“aaa”);
無set語句,出現亂碼
3、response.setCharacterEncoding(“utf-8”);
response.getWriter().append(“aaa”);
set語句在之前,無亂碼
4、兩個語句都沒有,無亂碼。
其中原因為何,尚待研究。
另外據說解決亂碼最徹底的方法還是設定一個filter,裡面是這三行語句,留下備忘。
request.setCharacterEncoding(“UTF-8”);
response.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=UTF-8”);