分析乱码出现的情况:
(1)开发环境 比如:eclipse中的window -->> Preferences -->>General-->>……
(2)页面设置
(3)服务器的配置 比如:tomcat的编码设置
(4)数据库乱码 比如:mySqL数据库中
表单提交后action获取到的中文为乱码排查步骤(提交的是action的属性):
1、需要在struts.xml中做i18n配置
<constant name="struts.i18n.encoding" value="utf-8" />
2、配置后action中打印是否能够获取到中文,如果获取不到中文,在action中进行转码,如下:
String name = new String(project.getName().getBytes("ISO-8859-1"),"UTF-8");
或者写一个类定义转换字符编码的方法如下:
public static String convert(String str){
try {
byte[] bytes = str.getBytes("ISO-8859-1");
return new String(bytes,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return str;
}
}
使用时:
String 转换后的字符串 = 类名.conert(要转换编码的字符串);
Action属性名.set方法(转换后的字符串)
Eg: String result = Chinese.convert(project.getName());
project.setName(result);
3、检查myeclipse的编码格式:
4、action调用dao的方法,DAO方法内部在插入前获取到插入的信息,中文能正常先生,但插入后数据库显示乱码,抛开数据库格式不是UTF-8的可能,用工具插入中文数据正常,用Myeclipse插入数据库中文时,显示乱码:
原因是:数据库连接时与工具连接的编码不一样导致失败的,在连接数据库时添加编码格式为UTF-8:
jdbc:MySQL://192.168.190.7:3306/struts2?useUnicode=true&characterEncoding=UTF-8
加如下一句话:URIEncoding = "utf-8",放到最后就ok了!
request经过struts处理后默认encoding是iso8859-1, 要纠正这个问题要赶在struts的黑手之前 ,建立filter,
在ActionServlet之前拦截*.do,转换编码
解决Struts乱码问题
a) 配置一个Filter过滤器,加入request.setCharacterEncoding("UTF-8");
b) 写一个Servlet继承自ActionServlet在doGet,doPost方法中加入request.setCharacterEncoding("UTF-8");
i. 修改web.xml,把ActionServlet改成自己的类
c) 利用自定义的RequestProceor类中的processPreprocess,加入request.setCharacterEncoding("UTF-8");
a) get/post 方式乱码解决方案:
i. Tomcat默认在5以后get和post提交的解决不一样。
ii. Post--->
1. 提交页面设置contentType="text/html;charset=utf-8";
2. 接收页面设置request.setCharacterEncoding("utf-8"),显示时也设置 contentType="text/html;charset=utf-8";
3. Struts1默认ISO-8859-1,所以我们需要人工设置乱码解决。参见四
iii. Get
1. 默认URL地址提交的是ISO-8859-1的编码。即使做了上面的处理,也不行。
2. 修改tomcat/conf/server.xml
a) <Connector port="80" protocol="HTTP/1.1"
b) connectionTimeout="20000"
c) redirectPort="8443" URIEncoding="UTF-8"/>