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

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

下面分两种情况来陈述:

第一种情况:没有上传功能的表单提交后出现乱码(即没有在页面使用上传功能的标签,如下):
<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"%>

完成这三步,就配置完成了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值