问题描述
我用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/>密  码:<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");