JSP/servlet页面之间的字符乱码问题

问题描述

我用MVC写了个最简单的登陆功能,DAO就不贴了,关键是jsp和servlet两个代码,第一次访问jsp页面时一切正常,但是当登陆成功或者失败后forward的那个页面永远是乱码(中文都是问号),之后我在servlet中加了一句response.setContentType("text/html;charset=GBK");没有加request.setCharacterEncoding("GBK");问题就解决了,虽然没问题,但是我完全不知道为什么,我明明在jsp页面中都写了contentType="text/html;charset=GBK",为何还需要指定编码呢?以下是我运行正常的代码,分别是一个servlet,两个jsp(一个登陆页面,一个登陆后的欢迎页面):importjavax.servlet.*;importjavax.servlet.http.*;importjavax.servlet.annotation.*;importjava.io.PrintWriter;importjava.io.IOException;importjava.io.*;importjava.sql.*;@WebServlet(name="login",urlPatterns={"/login"})publicclassLoginServletextendsHttpServlet{publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,java.io.IOException{//request.setCharacterEncoding("GBK");response.setContentType("text/html;charset=GBK");//加了这一句就正常了StringerrMsg="";RequestDispatcherrd;PrintWriterout=response.getWriter();out.println("begin");Stringusername=request.getParameter("username");Stringpass=request.getParameter("pass");try{out.println("beforeDao");DbDaodd=newDbDao("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/liuyan","root","200194");ResultSetrs=dd.query("selectpassfromuser_inf"+"wherename=?",username);if(rs.next()){out.println("haveusername");if(rs.getString("pass").equals(pass)){out.println("passwordiscorrect");HttpSessionsession=request.getSession(true);session.setAttribute("name",username);rd=request.getRequestDispatcher("/welcome.jsp");rd.forward(request,response);//跳转之后乱码}else{out.println("passwordwrong");errMsg+="密码错误";}}else{out.println("nousername");errMsg+="用户不存在";}}catch(Exceptione){out.println("exception!!!");e.printStackTrace();}if(errMsg!=null&&!errMsg.equals("")){out.println("returnlogin");rd=request.getRequestDispatcher("/login.jsp");request.setAttribute("err",errMsg);rd.forward(request,response);//跳转之后乱码}out.println("end");}}

<%@pagecontentType="text/html;charset=GBK"pageEncoding="gbk"language="java"errorPage=""%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>用户登录</title></head><body><spanstyle="color:red;font-weight:bold"><%if(request.getAttribute("err")!=null){out.println(request.getAttribute("err")+"<br/>");}%></span><divstyle="text-align:center">请输入用户名密码:<formid="login"method="post"action="login">用户名:<inputtype="text"name="username"/><br/>密&nbsp;&nbsp码:<inputtype="password"name="pass"/><br/><inputtype="submit"value="登陆"/><br/></form></div></body></html>

<%@pagecontentType="text/html;charset=GBK"language="java"errorPage=""%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>欢迎页面</title></head><body><h3>欢迎登录</h3><%=session.getAttribute("name")%>,欢迎登录!</body></html>

解决方案

本帖最后由 whj92115 于 2015-01-07 13:26:28 编辑
解决方案二:
本人刚接触javaweb没几天,希望能听大神比较详尽的解释
解决方案三:
response输出结果至JSP页面,不设置setContentType默认编码为ISO-8859-1,现在你的参数在SERVLET层,需要输出至JSP层,如果不设置setContentType默认为ISO-8859-1显示,所以中文显示乱码。JSP编码设置只用于JSP要展示的静态数据,而你现在发现的这种情况,是SERVLET传到JSP的时候已经是乱码了,JSP只做展示,不会自动转码。
解决方案四:
引用2楼cao_yunfei的回复:

response输出结果至JSP页面,不设置setContentType默认编码为ISO-8859-1,现在你的参数在SERVLET层,需要输出至JSP层,如果不设置setContentType默认为ISO-8859-1显示,所以中文显示乱码。JSP编码设置只用于JSP要展示的静态数据,而你现在发现的这种情况,是SERVLET传到JSP的时候已经是乱码了,JSP只做展示,不会自动转码。

我能这样理解吗:servlet中通过forward方式跳转到jsp页面默认都是以ISO-8859-1编码的对吧?
解决方案五:
直接在容器中加encoding效果更好
解决方案六:
引用3楼whj92115的回复:

Quote: 引用2楼cao_yunfei的回复:
response输出结果至JSP页面,不设置setContentType默认编码为ISO-8859-1,现在你的参数在SERVLET层,需要输出至JSP层,如果不设置setContentType默认为ISO-8859-1显示,所以中文显示乱码。JSP编码设置只用于JSP要展示的静态数据,而你现在发现的这种情况,是SERVLET传到JSP的时候已经是乱码了,JSP只做展示,不会自动转码。

我能这样理解吗:servlet中通过forward方式跳转到jsp页面默认都是以ISO-8859-1编码的对吧?

你可以这样理解,但是如果你在jsp中加了encoding="GBK",可以不使用这句话。。。
解决方案七:
引用5楼u013762572的回复:

Quote: 引用3楼whj92115的回复:
Quote: 引用2楼cao_yunfei的回复:
response输出结果至JSP页面,不设置setContentType默认编码为ISO-8859-1,现在你的参数在SERVLET层,需要输出至JSP层,如果不设置setContentType默认为ISO-8859-1显示,所以中文显示乱码。JSP编码设置只用于JSP要展示的静态数据,而你现在发现的这种情况,是SERVLET传到JSP的时候已经是乱码了,JSP只做展示,不会自动转码。

我能这样理解吗:servlet中通过forward方式跳转到jsp页面默认都是以ISO-8859-1编码的对吧?

你可以这样理解,但是如果你在jsp中加了encoding="GBK",可以不使用这句话。。。

我有加PageEncoding=“GBK",好像没用啊
解决方案八:
页面中的contentType指页面的类型,跟服务器端无关,而response中指定的是服务器传过来的数据的类型
解决方案九:
jsp:<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/><%@ page contentType="text/html;  pageEncoding="UTF-8" language="java" errorPage=""%>java:req.setCharacterEncoding("UTF-8");res.setCharacterEncoding("UTF-8");

时间: 2024-09-17 17:14:02

JSP/servlet页面之间的字符乱码问题的相关文章

请问jsp,servlet,javabean之间如何相互访问

问题描述 请问jsp,servlet,javabean之间如何相互访问 有几张jsp页面,页面之间需要数据往来.具体问题如下: 方法1.用session传值,各个jsp页面提交后,servlet将网页传来的值写到session中,下一张jsp读出session的值,显示在相应位置.问题是,下一张jsp中要取得的值不完全是上一张提交的,可能需要上一张提交的内容进行大量运算得到,要用一个javabean进行计算,javabean中如何取得session的值呢?我想通过在jsp中构造函数传递用<%Re

如何解决页面之间传输中文乱码的问题

如何解决页面之间传输中文乱码的问题hbzxf(阿好)http://www.cnblogs.com/hbzxf 有的时候我们需要在页面之间传输中文,但是.NET模认在Webconfig中为我们建立的编码格式为utf-8,于是在传输中文的时候变成了乱码,相应的接受也会是乱码信息,如何解决这个问题,我们可以用两种方法. 更改Webconfig中的编码方式,如下:1.在你的web.config中把编码 <globalization requestEncoding="utf-8" resp

jsp注册页面输入中文后乱码!!!!!

问题描述 我在dbcp.properties中配置: url=jdbc:mysql://localhost:3309/dang?useUnicode=true&characterEncoding=gbkstruts.xml中web.xml中和各JSP中都设置的编码GBK, 数据库用的mysql, 设置了default character set gbk;  可以在注册界面输入中文时注册成功后, 跳转页面昵称就变成了?????, 火狐浏览器的页面编码也设置的是gbk, 求解啊  问题补充:<d

jsp中页面之间的跳转forward与sendRedirect的区别_JSP编程

页面之间的跳转可以通过两种方式实现:forward和sendRedirect. forward:可以在JSP页面中使用,可以在Servlet中实现. 在JSP页面中使用<jsp:forward page="目标文件"/>,例如要跳转到userlist.jsp,可以写: 复制代码 代码如下: <jsp:forward page="userlist.jsp"/> 在Servlet中使用RequestDispatcher的forward方法,要跳转

jsp简单实现页面之间共享信息的方法_JSP编程

本文实例讲述了jsp简单实现页面之间共享信息的方法.分享给大家供大家参考.具体如下: 这里演示jsp父页面得到在子页面的配置信息,减少代码重复. 1. 父页面: <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html ng-app> <head> <meta http-equiv="Content-Type

JSP/Servlet中的汉字编码问题

js|servlet|编码|汉字|问题 网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理,并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余的.内容: 问题的起源 GB2312-80,GBK,GB18030-2000 汉字字符集及 Encoding 中文转码时´?´.乱码的由来 JSP/Servlet 汉字编码问题及在 WAS 中的解决办法 结束语 参考文章 1. 问

JSP/Servlet 中的汉字编码问题(转)

js|servlet|编码|汉字|问题 . 问题的起源     每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII码, 中国的 GB2312-80,日本的 JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用.字符编码集按长度分为 SBCS(单字节字符集),DBCS(双字节字符集)两大类.早期的软件(尤其是操作系统),为了解决本地字符信息的计算机处理,出现了各种本地化版本(L10N),为了区分,引进了 LANG, Codepage 等概念.但是由于各

JSP/Servlet 中的汉字编码问题_JSP编程

JSP/Servlet 中的汉字编码问题 网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理,并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余的.内容: 问题的起源 ??????-80,GBK,GB18030-2000 汉字字符集及 Encoding 中文转码时'?'.乱码的由来 JSP/Servlet 汉字编码问题及在 WAS 中的解决办法 结束语 参考文章 1.

jsp/servlet中文问题的解决(转贴,好东西)

js|servlet|解决|问题|中文 JSP/Servlet 中的汉字编码问题(作者:张建芳,转自IBM DeveloperWorks 中国网站 2001年04月18日 15:08) 网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理,并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余的. 1.问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国