上传文件同时提交表单出现乱码(小结)

今天,想简单地总结一下,提交表单后出现乱码的问题.

下面分两种情况来陈述:

第一种情况:没有上传功能的表单提交后出现乱码(即没有在页面使用上传功能的标签,如下):
<input type="file"name="upload"contentEditable="false"/>

一般情况下,在每一个JSP页面的最上方加上下面一句:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>,然后把这个页面的表单提交到后台时,获取到的中文一般不会出现乱码的,如果出现乱码,我们可以在后台处理的JSP上或者servlet对应的方法里加入这一句(注意:这一句一定要放在你取出表单数据之前,也就是说先添加这一句,然后再取出表单的值.)request.setCharacterEncoding("gbk");这样就可以解决当前提交过来的表单乱码.


第二种情况:上传文件同时提交表单后出现乱码(不管你是用STRUTS框架,还是纯JSP,以下的解决办法都管用,它更方便的来解决乱码问题,因为可以动态设置字符集编码,而且对于上面第一种情况同样适用.)

步骤如下:
  1.添加一个类,通过这个类来进行字符集编码的转换来解决乱码问题,如下:
package com.flybaba.web;

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 CharacterEncodingFileter implements Filter{
   
    private String charset;

    public void destroy(){

    }

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException{
        /*设置request的字符编码,
         **这一句的作用和上面说的,直接在处理页面加,是一样的效果,
         **只不过现在不用在每个处理表单的后台页面加上这一句.
          */
        req.setCharacterEncoding(charset);
        /*设置完成后,把请求转回到表单处理的后台页面*/
        chain.doFilter(req, res);
    }

    public void init(FilterConfig config) throws ServletException{

        /*获取web.xml文件中的
           *<param-name>charset</param-name>标签的名字charset对应的值
         */ 
        charset = config.getInitParameter("charset");
    }
}

2.找到你所在项目的web.xml文件,然后在web.xml文件中的</web-app>标签前加上以下配置内容:

<filter>
      <filter-name>filter</filter-name>
      <filter-class>com.flybaba.web.CharacterEncodingFileter </filter-       class>
      <init-param>
          <param-name>charset</param-name>
          <param-value>gbk</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>filter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
 
下面简单的解释一下这个配置的原理,每定义一个过滤器都要在这个<filter></filter>标签内定义, <filter-name>filter</filter-name>标签是定义过滤器名字,是自定义的,与下面过滤器映射标签<filter-mapping></filter-mapping>内的过滤器名字对应,否则过滤器会不起作用.而初始化参数标签<init-param></init-param>内可以定义多个参数,我们可以在对应的过滤器类中获取得到.如我们上面定义的过滤器类中,在初始化方法init()中的,通过这一句config.getInitParameter("charset");就可以获取到web.xml文件中,初始化参数标签"charset"对应的值"gbk".
      <init-param>
         <param-name>charset</param-name>
         <param-value>gbk</param-value>
      </init-param>
而在映射标签 <filter-mapping></filter-mapping>中的子标签<url-pattern>/*</url-pattern>的值为"/*",意思是这个过滤器会拦截所有的用户请求,如果你不想拦截所有的请求页面,你可以修改它的值,假设我只拦截test.jsp,那么可以设成<url-pattern>/test.jsp</url-pattern>,不过还是建议拦截所有的用户请求.

3.在每一个JSP页面的最上方加上下面一句(注意pageEncoding的值最好是gbk或者gb2312,否则有可能过滤器失效,大家不妨试试:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

完成这三步,就配置完成了.

你可能感兴趣的:(Web,jsp,xml,servlet,struts)