Servlet 采用 forward 时,页面出现汉字乱码问题的分析
来源:互联网 发布:同济医学院知乎 编辑:程序博客网 时间:2024/06/06 09:03
经常有人问到,在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);
}
}
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);
}
}
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);
}
}
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>
<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>
<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 时,页面出现汉字乱码问题的分析
- Servlet 采用 forward 时,页面出现汉字乱码问题的分析
- Servlet采用forward出现中文乱码问题解决
- jquery Ajax 传递汉字到 servlet 时出现乱码的问题
- JSP页面到Servlet出现乱码问题
- 从servlet转发跳到Jsp页面中时出现的乱码问题
- Servlet出现乱码问题
- servlet页面跳转出现乱码
- Servlet之浏览器页面出现中文乱码问题
- servlet 跳转页面乱码的问题
- 记一次 从servlet传参数到jsp页面出现乱码问题的解决参考
- servlet通过URL传参到jsp页面出现乱码问题的解决
- 解决EditPlus在设置了UTF-8之后,编写的HTML页面仍出现汉字乱码问题
- 网页采用UTF-8编码,传递汉字参数时出现乱码解决方法
- jsp页面出现乱码问题的解决方法
- MySQL插入显示汉字出现乱码问题的解决
- MySQL插入显示汉字出现乱码问题的解决
- servlet中通过request.getRequestDispatcher跳转到jsp页面汉字乱码问题
- 人物:22年前的天才程序员,今天在干什么?
- 如何使用log4j设置tomcat 5.5版本的的日志功能
- 2008年2月26日碰撞算法
- 微软公布四大战略转变 软件系统走向开放
- JDBC 获得自动生成的字段值
- Servlet 采用 forward 时,页面出现汉字乱码问题的分析
- ADSL无法上网修复心得
- 将jasper文件转化为报表输出的代码
- java输出excel文件加密码保护问题
- 最近负责招聘,收了无数简历,是在看下去了,说两句吧
- 在Wince下使用钩子函数
- javaScript操作页面对象组件
- 失业了,理由是能力太强,我靠,什么世道。
- 南财成教08第一学期课程表