问题:
使用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,如果是其它的编码,这里应该相应改一下。