Tomcat+struts中文乱码问题

 

在进行struts开发的过程中,总也是出现很多的乱码问题 ,但归根到底,也只是以下三种情况: 

1.页面显示中文乱码 

2.传递参数中文乱码 

3.国际化资源文件乱码
 

下面就这三中情况介绍怎么在具体项目中处理这些乱码问题。而对于整体的处理思想,是要统一编码为: UTF-8

1.页面显示中文乱码 
    对于在页面中显示出现乱码,这个问题比较简单,便是检查你的JSP文件里是不是出现了中文要处理,因为JSP默认的编码格式为“ISO-8859-1”,当JSP中出现要处理的中文时,其显示就出现乱码了,这种情况一般出现在手写JSP,或修改时。因为在myeclipse6.0中,如果出现了编码错误时,程序不会让你保存,而是会提示你注意编码,这点很好。具体的修改办法是把

Html代码


改成:

Html代码



2传递参数中文乱码 

         传递参数出现的乱码,参数的内容为中文。比如在struts应用中,简单的一个登录界面中,需要传递的登录名为中文时,你没经处理之前,是会出现乱码传递的,为了让我们能看到显示的乱码,我们在对应的Action类的子类里,修改一下,用System.out把接受到的参数输出,代码如下:

Java代码

 

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文件,在修改端口的标签后面加一行代码,如下:

Xml代码


2.编写过滤器Filter

Java代码
package com.finance.utils;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter{
 public void destroy() {
  
 }
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  request.setCharacterEncoding("utf-8");
  chain.doFilter(request, response);
 }
 public void init(FilterConfig arg0) throws ServletException {
  
 }
}



利用过滤器,把requst传递的中文参数都设成“UTF-8”编码。 

3.修改web.xml文件

添加如下内容

<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.wiley.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>  
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>


为了使设置生效,重起tomcat。 

3.国际化资源文件乱码 

     利用JDK的native2ascii工具进行编码转换 
     MessageResources.properties(ISO-8859-1编码格式)的内容如下:

     #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 资源文件,自动生成的代码如下:

#errors
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
success.common.regist=/u6ce8/u518c/u6210/u529f!
#failed
failed.common.regist=/u8d26/u53f7/u5df2/u7ecf/u5b58/u5728!

然后再到MyEclipse的项目视图中,将项目刷新一下,就可以看到MessageResources_zh.properties资源文件了,为了保险起见,重启tomcat服务器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章