問題:
使用Struts的ActionForm接收到的中文全部是亂碼,例如提交過去的“測試”字符串,得到的是“??????è????”。開頭以為是傳統的encoding識別的問題,但是用各種編碼重新構造得到的byte[]數組,依然無法得到正確的中文。但是如果用普通的jsp來接收form的數據,中文是完全正常的。
我開始覺得是struts的流程當中,錯誤地使用了編碼,以至最后得到的結果完全亂了。搜索了好多文章,總算找到一個比較接近的。
解決方法:
定義一個filter,filter只做一件事情,就是:
request.setCharacterEncoding("UTF-8");
在web.xml的filter mapping里,設定和struts的action同樣的mapping。
解釋: Filter最先攔截web請求,在這里設置了正確的CharacterEncoding,接下來各個處理的組件就不會搞錯了。在沒有Filter的情況下,我的resin服務器上獲得的是null,估計struts不同的處理組件對null的解釋和處理不太一致,導致錯誤的產生。
要注意我所有頁面都是UTF-8編碼,所以在filter里面定義了UTF-8,如果是其它的編碼,這里應該相應改一下。