在进行struts开发的过程中,总也是出现很多的乱码问题 ,但归根到底,也只是以下三种情况:
1.页面显示中文乱码
2.传递参数中文乱码
3.国际化资源文件乱码
下面就这三中情况介绍怎么在具体项目中处理这些乱码问题。而对于整体的处理思想,是要统一编码为: UTF-8
1.页面显示中文乱码
对于在页面中显示出现乱码,这个问题比较简单,便是检查你的JSP文件里是不是出现了中文要处理,因为JSP默认的编码格式为“ISO-8859-1”,当JSP中出现要处理的中文时,其显示就出现乱码了,这种情况一般出现在手写JSP,或修改时。因为在myeclipse6.0中,如果出现了编码错误时,程序不会让你保存,而是会提示你注意编码,这点很好。具体的修改办法是把
改成:
<%@ page language="java" import="java.util." pageEncoding="UTF-8">
2传递参数中文乱码
传递参数出现的乱码,参数的内容为中文。比如在struts应用中,简单的一个登录界面中,需要传递的登录名为中文时,你没经处理之前,是会出现乱码传递的,为了让我们能看到显示的乱码,我们在对应的Action类的子类里,修改一下,用System.out把接受到的参数输出,代码如下:
package com.finance.actions;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.finance.bussiness.UserInfoBussiness;
import com.finance.model.UserInfo;
public class RegistAction extends Action {
private UserInfoBussiness userInfoBussiness = null;
public UserInfoBussiness getUserInfoBussiness() {
return userInfoBussiness;
}
public void setUserInfoBussiness(UserInfoBussiness userInfoBussiness) {
this.userInfoBussiness = userInfoBussiness;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionErrors actionErrors = new ActionErrors();
this.userInfoBussiness = new UserInfoBussiness();
RegistActionForm registActionForm = (RegistActionForm)form;
String userid = registActionForm.getUserid();
String username = registActionForm.getUsername();
String password = registActionForm.getPassword();
String ageStr = registActionForm.getAge();
String sexStr = registActionForm.getSex();
String tel = registActionForm.getTel();
String email = registActionForm.getEmail();
UserInfo userInfo = new UserInfo();
userInfo.setAge(Integer.parseInt(ageStr));
userInfo.setEmail(email);
userInfo.setId(userid);
userInfo.setName(username);
userInfo.setPassword(password);
userInfo.setRegDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
userInfo.setRight("common");
if(sexStr.equals("1")){
userInfo.setSex(true);
}else{
userInfo.setSex(false);
}
userInfo.setTel(tel);
if(userInfoBussiness.addUserInfo(userInfo))
actionErrors.add("success", new ActionError("success.common.regist"));
else
actionErrors.add("failed", new ActionError("failed.common.regist"));
this.saveErrors(request, actionErrors);
return mapping.getInputForward();
}
}
那么当你提交了中文输入后就会出现乱码了。
具体的解决方法:
1.修改Tomcat---->conf----->server.xml文件,在修改端口的标签后面加一行代码,如下:
2.编写过滤器Filter
利用过滤器,把requst传递的中文参数都设成“UTF-8”编码。
3.修改web.xml文件
添加如下内容
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>com.finance.utils.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
为了使设置生效,重起tomcat。
3.国际化资源文件乱码
利用JDK的native2ascii工具进行编码转换
MessageResources.properties的内容如下:
#errors
error.login.nouserid=*账号不能为空!
error.regist.nousername=*用户名不能为空!
error.login.nopassword=*密码不能为空!
error.login.noright=*请选择权限!
error.regist.nopasswordag=*确认密码不能为空!
error.regist.notmatch=*两次密码不匹配!
error.common.age.notnumber=*年龄必须是一个整数!
#success
success.common.regist=注册成功!
#failed
failed.common.regist=账号已经存在!
但保存,myeclipse会报错,需要修改资源文件的编码格式。Windons---->Preferences---->Content Type------>Text----->JavaPropertiesFile,把其Default encoding改为“utf-8”,按“update”更新。但是,当进行验证的时候,则仍然是乱码。
这时,需要打开DOS窗口,CMD到资源文件所在目录,运用JDK的native2ascii工具把我们新建的资源文件改成另一个名字的资源文件,例如MessageResource_zh.properties。命令如下:
>native2ascii -encoding utf-8 MessageResources.properties MessageResources_zh.properties
打开MessageResources_zh.properties 资源文件,自动生成的代码如下:
error.login.nouserid=*/u8d26/u53f7/u4e0d/u80fd/u4e3a/u7a7a!
error.regist.nousername=*/u7528/u6237/u540d/u4e0d/u80fd/u4e3a/u7a7a!
error.login.nopassword=*/u5bc6/u7801/u4e0d/u80fd/u4e3a/u7a7a!
error.login.noright=*/u8bf7/u9009/u62e9/u6743/u9650!
error.regist.nopasswordag=*/u786e/u8ba4/u5bc6/u7801/u4e0d/u80fd/u4e3a/u7a7a!
error.regist.notmatch=*/u4e24/u6b21/u5bc6/u7801/u4e0d/u5339/u914d!
error.common.age.notnumber=*/u5e74/u9f84/u5fc5/u987b/u662f/u4e00/u4e2a/u6574/u6570!
success.common.regist=/u6ce8/u518c/u6210/u529f!
failed.common.regist=/u8d26/u53f7/u5df2/u7ecf/u5b58/u5728!
然后再到MyEclipse的项目视图中,将项目刷新一下,就可以看到MessageResources_zh.properties资源文件了,为了保险起见,重启tomcat服务器,再次进行验证,成功了,如下图所示: