`
逆风的香1314
  • 浏览: 1436674 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

经常有人问到,在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>
分享到:
评论
1 楼 janwen 2010-12-14  
好,以前有印象的,现在忘了

相关推荐

    jsp程序设计入门到精通

    ##### 4.6 JSP/Servlet中的汉字编码问题 - **字符集编码**:解决中文乱码问题,确保正确编码。 #### 第5章 全面解析JDBC ##### 5.1 JDBC接口综述 - **JDBC接口**:提供了与数据库交互的标准API。 - **...

    要想成为JAVA编程高手必须知道java问题解答-高级篇

    - **乱码问题**:乱码问题通常是由于字符编码设置不一致导致的。确保JSP文件、数据库连接和浏览器的字符编码设置一致,通常使用UTF-8。 **Q2.14 为什么使用gb18030而不是gb2312?** - **编码选择**:gb18030是一种...

    JSP程序设计从入门到精通

    - **汉字编码问题**:解决JSP和Servlet中的汉字乱码问题,确保中文字符的正确显示。 - **开发工具集成**:使用Eclipse等IDE与Tomcat集成开发Servlet,提高开发效率。 #### 八、数据库操作 - **JDBC概述**:Java ...

    Java方向企业笔试题

    选项B错误是因为即使不显式设置,Tomcat可能也会默认使用某种字符集,但可能会导致乱码问题。因此,正确答案是ACD,具体应选择适合的字符集,如GBK或GB2312。 2. ServletRequest接口的使用:getParameter方法用于...

    JSP考试复习资料

    当表单提交的参数中含有汉字时,接收页面需确保字符编码的正确性,通常使用`request.setCharacterEncoding("UTF-8")`设置请求编码,以避免乱码问题。 8. **JSP与Servlet关系**: JSP本质是Servlet,JSP文件会被...

    jsp教程详解

    - **3.1.2 处理汉字信息**:解决请求参数中的中文乱码问题。 - **3.1.3 常用方法举例**:如setAttribute()、getAttribute()等。 - **3.1.4 用户注册**:处理用户注册流程。 - **3.1.5 获取HTML表单提交的数据**:...

    (部分答案)java web 复习题.pdf

    - 解决使用`request`对象获取汉字信息时出现乱码,通常需要设置请求编码,如`request.setCharacterEncoding("UTF-8")`。 6. **HTML表单提交方式** - HTML表单数据的提交方式主要有两种:GET和POST。GET方式将数据...

    jsp仿google搜索

    3. JSP生命周期:JSP页面在首次被请求时被转换为Servlet,然后编译成.class文件运行。这个过程包括翻译、初始化、服务和销毁四个阶段。 二、搜索功能实现 1. 用户输入处理:在JSP页面上,可以使用HTML表单元素(`...

    基于HttpServletRequest 相关常用方法的应用

    `getHeader("referer")` 方法则可以获取到客户端发起请求前的页面URL,即Referer头信息,这在追踪用户来源时很有用。 2. **请求转发和重定向** - **请求转发(RequestDispatcher)**:使用 `request....

    JSP从入门到精通.pdf

    - 设置编码以解决中文乱码问题。 - **3.1.3 常用方法举例** - `request.getMethod()` 获取请求方法(GET/POST)。 - **3.1.4 用户注册** - 处理用户注册时提交的数据,并验证用户输入的有效性。 - **3.1.5 ...

    jsp开发讲义

    当`Request`对象获取客户提交的汉字字符时,会出现乱码问题,必须进行特殊处理。一种常见做法是先将获取的字符串用ISO-8859-1进行编码,再将其转换为字符串对象。例如: ```java String textContent = request....

    jsp 简易教程

    - **3.1.2 处理汉字信息**:设置正确的字符编码以防止乱码问题。 - **3.1.3 常用方法举例**:如`getHeader`, `getCookies`等。 - **3.2 response对象** - 控制向客户端发送的响应。 - 包括设置HTTP响应头、发送...

    JSP教程——必看.pdf

    - **3.1.2 处理汉字信息**:解决中文乱码问题,通常需要设置正确的编码。 - **3.1.3 常用方法举例**:例如使用`getHeader()`获取HTTP头部信息。 - **3.1.4 用户注册**:通过`request`对象收集用户的注册信息。 -...

    (部分答案)java web 复习题.docx

    3. 解决request对象获取汉字信息乱码问题,通常需要设置请求编码,例如在Servlet中使用`request.setCharacterEncoding("UTF-8")`,或者在JSP中使用`;charset=UTF-8"%&gt;`。 4. HTML表单数据的提交方式有GET和POST两种...

    jsp 教程

    - **3.1.2 处理汉字信息**:由于编码问题,需要正确设置编码以避免乱码。 - **3.1.3 常用方法举例**:例如使用`getParameter()`方法获取表单字段值。 - **3.1.4 用户注册**:利用request对象处理用户提交的注册...

    JSP教程

    - **3.1.2 处理汉字信息**:解决中文乱码问题,通常涉及到设置正确的字符编码。 - **3.1.3 常用方法举例**:如getParameter()方法用于获取参数值。 - **3.1.4 用户注册**:利用request对象处理用户提交的注册信息...

    Jsp教程(很全面)

    - **处理汉字信息**:使用setCharacterEncoding()方法设置字符编码,解决中文乱码问题。 - **常用方法举例**:如getHeader()、getSession()等,用于获取请求头信息或会话对象。 ##### 3.2 response对象 - **动态...

Global site tag (gtag.js) - Google Analytics