现在的位置: 首页 > 综合 > 正文

Struts1乱码解决方案:

2013年07月10日 ⁄ 综合 ⁄ 共 3681字 ⁄ 字号 评论关闭

Struts1乱码解决方案:
 用一个字符过滤器即可解决问题,但要注意的是,过滤器设置的字符集编码要与你的jsp页面的编码要一致,
 还有建好数据库和表后,如果要在Mysql的dos客户端要向表中插入一些初始数据(包括中文数据),则首先
 客户端的编码设置是否为gbk或gb2312,查看编码的命令为:show variables like '%char%';,修改其中
 的character_set_client的编码为gbk或者gb2312,就可在dos窗口中对中文数据进行插入,而不导致乱码
 
 过滤器的写法与配置:
字符过滤器
package com.filter;

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 {

 String encoding = null;
 FilterConfig filterConfig = null;
 
 /** 初始化方法 */
 public void init(FilterConfig filterConfig) throws ServletException {
  this.filterConfig = filterConfig;
  this.encoding = filterConfig.getInitParameter("encoding");
 }

 /** 过滤处理方法 */
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  if (encoding!=null){
   //对请求进行编码设置
   request.setCharacterEncoding(encoding);
  }
  System.out.println("设置的字符集为:"+encoding);
  System.out.println("经过过滤器后的字符集为 : "+request.getCharacterEncoding());
  
  //将处理权转交给下一个处理器
  chain.doFilter(request,response);
 }

 /** 销毁方法 */
 public void destroy() {
  this.encoding = null;
  this.filterConfig = null;
 }

}

过滤器配置:
<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>com.filter.CharacterEncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>GB2312</param-value>
  </init-param>
 </filter>
 
 <filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <!--<servlet-name>action</servlet-name>-->
  <url-pattern>/*</url-pattern><!--这里对应用下的所有请求都进行过滤-->
 </filter-mapping>
产生疑问的代码片段: 
     /***********************添加图书信息
     * @throws UnsupportedEncodingException **************************/
    private ActionForward bookAdd(ActionMapping mapping, ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response) {
      /**
      * 疑点:为何在此设置编码还是会出现乱码,而必须用过滤器设置编码才起作用
      * 我在想是不是ActionForm表单处理器可能是在bookAdd这一步的时候,已经以
      * iso8859-1编码的形式封装了表单数据,所以用过滤器在到达这个请求之前对
      * 字符集编码进行设置,这样form表单中封装的数据就是过滤器中设置好的字符集编码
      * 我把过滤器去掉,用request.setCharacterEncoding("gb2312")设置了编码,然后用request.getParameter("bookName")
      * 取表单中的数据时,结果还是乱码,我就真纳闷了,以前写jsp的时候乱码问题也挺好解决的,到Struts这就不好使了
      *
      */
     
     
     //过滤中已经设置好了request字符编码
  System.out.println("bookAdd方法字符编码:"+request.getCharacterEncoding());

System.out.println(request.getParameter("bookName"));
           BookForm bookForm = (BookForm) form;
System.out.println("bookname:   "+bookForm.getBookName());
           bookForm.setBarcode(bookForm.getBarcode());
           bookForm.setBookName(bookForm.getBookName());
           bookForm.setTypeId(bookForm.getTypeId());
           bookForm.setAuthor(bookForm.getAuthor());
           bookForm.setTranslator(bookForm.getTranslator());
           bookForm.setIsbn(bookForm.getIsbn());
           bookForm.setPrice(bookForm.getPrice());
           bookForm.setPage(bookForm.getPage());
           bookForm.setBookcaseid(bookForm.getBookcaseid());   
           //获取系统日期
           Date date1=new Date();
           java.sql.Date date=new java.sql.Date(date1.getTime());
           bookForm.setInTime(date.toString());
           bookForm.setOperator(bookForm.getOperator());
 System.out.println(bookForm.getBookName()+bookForm.getBarcode());
           int a=bookDAO.insert(bookForm);
           if(a==1){
               return mapping.findForward("bookAdd");
         }else if(a==2){
             request.setAttribute("error","该图书信息已经添加!");
             return mapping.findForward("error");
         }else{
             request.setAttribute("error","图书信息添加失败!");
             return mapping.findForward("error");
        }
       }

抱歉!评论已关闭.