Servlet 采用 forward 时,页面出现汉字乱码问题

系统 1416 0

经常有人问到,在servlet里面forward到一个页面之后,浏览器总是汉字的乱码。经调试发现,是由于在servlet里面不能正确调用 response.getWriter()方法造成的。

servlet 如下,如果去掉注释,则会出现乱码

package  test;

import  java.io.IOException;
import  java.io.PrintWriter;
import  javax.servlet.RequestDispatcher;
import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

public   class  TestServlet  extends  HttpServlet  ... {
  @Override
  
public   void  doGet(HttpServletRequest request, HttpServletResponse response)  throws  IOException, ServletException  ... {
//     PrintWriter out = response.getWriter();
    RequestDispatcher requestDispatcher  =  request.getRequestDispatcher( " /test/test2.jsp " );
    requestDispatcher.forward(request, response);
  }

}

曾经尝试增加如下语句,问题依然存在

package  test;

import  java.io.IOException;
import  java.io.PrintWriter;
import  javax.servlet.RequestDispatcher;
import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

public   class  TestServlet  extends  HttpServlet  ... {
  @Override
  
public   void  doGet(HttpServletRequest request, HttpServletResponse response)  throws  IOException, ServletException  ... {
    PrintWriter out 
=  response.getWriter();
    response.setCharacterEncoding(
" UTF-8 " );
    response.setContentType(
" text/html;charset=UTF-8 " );
    RequestDispatcher requestDispatcher 
=  request.getRequestDispatcher( " /test/test2.jsp " );
    requestDispatcher.forward(request, response);
  }

}

去掉后,就可以正常显示汉字了,

再次测试,发现是语句的顺序有问题,需要调整为如下的代码即可

package  test;

import  java.io.IOException;
import  java.io.PrintWriter;
import  javax.servlet.RequestDispatcher;
import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

public   class  TestServlet  extends  HttpServlet  ... {
  @Override
  
public   void  doGet(HttpServletRequest request, HttpServletResponse response)  throws  IOException, ServletException  ... {
    response.setCharacterEncoding(
" UTF-8 " );  //  先指定输出流的编码
    PrintWriter out  =  response.getWriter();  //  再拿到输出对象
    response.setContentType( " text/html;charset=UTF-8 " );
    RequestDispatcher requestDispatcher 
=  request.getRequestDispatcher( " /test/test2.jsp " );
    requestDispatcher.forward(request, response);
  }

}

看来,response.getWriter() 在内部的实现上,影响了输出流的编码集。必须先指定编码集,再调用Writer才可以。

 

附test2.jsp的代码

<% @ page language = " java "  contentType = " text/html; charset=UTF-8 "  pageEncoding = " UTF-8 " %>
< pre > 中文
<%= " 中文2 " %>
</ pre >

web.xml, 未使用任何过滤器 

<? xml version="1.0" encoding="UTF-8" ?>
< web-app  id ="WebApp_ID"  version ="2.4"  xmlns ="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
  
< display-name > www.java2000.net </ display-name >
  
< welcome-file-list >
    
< welcome-file > index.html </ welcome-file >
    
< welcome-file > index.htm </ welcome-file >
    
< welcome-file > index.jsp </ welcome-file >
    
< welcome-file > default.html </ welcome-file >
    
< welcome-file > default.htm </ welcome-file >
    
< welcome-file > default.jsp </ welcome-file >
  
</ welcome-file-list >
</ web-app >

Servlet 采用 forward 时,页面出现汉字乱码问题的分析


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论