数据库查询正常,但servlet返回乱码的解决方案

      在从事Java开发过程中,经常会遇到中文乱码的问题。比如从数据库查出来中文还是好的,可是经过servlet或controller一转发就乱码了。最早笔者是通过在web.xml里增加如下监听解决的:

  <listener>
    <listener-class>  
	          org.springframework.web.context.ContextLoaderListener  
	  </listener-class>
  </listener>

      这种方式只适用于使用了Spring的站点。

      当站点很小没必要使用Spring时,就显得有些累赘了。后来,又尝试在servlet里增加如下代码:

response.setCharacterEncoding("UTF-8");

      发现不管用。于是又尝试了如下方法:

strValue = new String(strValue.getBytes("ISO8859-1"),"UTF-8");

      并将servlet的java文件编码也改为了UTF-8。然而依旧是不管用,只是将乱码改为一串儿问号了。

      真是百思不得姐!于是又尝试了如下方法:

response.setContentType("text/html; charset=UTF-8");
response.setHeader("Content-Type", "text/html; charset=UTF-8");

      问题解决!OMG!

    原来决定servlet或页面(本质上也是servlet)输出编码的并不是一个response.setCharacterEncoding(),而是由setContentType()和setHeader()方法决定的。

      为了不至于在所有需要输出中文的servlet里都这么来一遍,可通过增加过滤器的方式解决,过滤器代码如下:

package 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 ServletFilter implements Filter {
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=utf-8");
    chain.doFilter(request,response);
  }
  public void init(FilterConfig config) {}
  public void destroy() {}
}

      并在web.xml里增加如下配置:

<filter>

    <filter-name>ServletFilter </filter-name>

    <filter-class>filter.ServletFilter </filter-class>

</filter>

<filter-mapping>

    <filter-name>ServletFilter </filter-name>

    <servlet-name>*</servlet-name>

</filter-mapping>

      这样只要是servlet里需要输出中文的地方,都可以自动解决中文乱码的问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值