一、基本概念
1、Jsp页面指令也叫做page指令。Page指令是在<%...%>l里面。以下属性在page指令中:
1)pageEncoding: 指定JSP页面的编码方式,默认情况下为ISO-8859-1,在页面上显示中文时,必须修改为gbk或者2312.。
2)contentType: 设置MIME类型和字符集,格式为<%@page contentType="MIME,charset=字符集"%>。默认情况下,MIME类型为text/html,字符集为ISO-8859-1,如需要显示中文,需要设置为gbk或者gb2312。
(什么是MIME类型? 描述被传输文档的类型的一种方法。因其格式借用了多用途网际邮件扩展(MIME)而得名。由以斜杠分隔的一个主类型和一个副类型组成。例如: text/html , image/gif , application/octet-stream 。在HTTP中,MIME类型包含在 Content-Type 头(header)中被传输。)
2、servlet通过request对象获取客户端的请求信息。
jsp向servlet传递参数有两种方式,GET和POST。jsp通过response内部对象对用户进行相应,在servlet中也是使用response对象(doGet方法或者doPost方法中的第二个参数)完成对用户的响应。设置响应内容的MIME类型:
response.setContentType("text/html;charset=gb2312");
二、问题:Servlet接收和JSP传递的参数后乱码问题。
解析:
jsp向servlet传递参数有两种方式,GET和POST。而这两种传递机制又有所不同(这是产生乱码的根源,想从根本上解决问题就要深刻理解这点)
当用GET方式发送参数的时候,Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,web浏览器先将参数转码为ISO-8859-1格式,然后再发送出去,因此servlet接收到得get请求的参数是ISO-8859-1格式的,要想得到中文格式,必须对参数进行转码
当用POST方式发送参数的时候,参数会按照页面的编码方式发送参数出去,servlet只要与jsp页面编码方式一致就可以得到相应的文字格式了。 post提交时,如果没有设置提交的编码格式,则会以iso8859-1(Tomcat默认编码格式)方式进行提交,如果接受的jsp或者servlet却以utf-8或者gbk或者gb2312的方式接受则会导致乱码。
三、解决方案及代码说明
EncodingTest.jsp:
<%@page contentType="text/html" pageEncoding="GBK"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <title>中文传递</title> </head> <body> <h1>页面提交中文测试!</h1> <h2>GET方式</h2> <a href="servlet?param=jsp-->中文">GET方式提交中文测试</a> <h2>POST方式</h2> <form action="servlet" method="post"> <input type="text" name="param" value="jsp-->中文"/> <button type="submit" name="提交中文参数测试" value="提交中文参数测试"/> </form> </body> </html>
EncodingServlet:
public class servlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String param = request.getParameter("param"); System.out.println("GET方式获取的中文参数值(转码前):" + param); String x = new String(param.getBytes("ISO-8859-1"), "GBK"); System.out.println("GET方式获取的中文参数值:" + x); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("GBK"); String param = request.getParameter("param"); System.out.println("POST方式获取的中文参数值:" + param); } }
测试结果:
GET方式获取的中文参数值(转码前):jsp-->????
GET方式获取的中文参数值:jsp-->中文
POST方式获取的中文参数值:jsp-->中文
搞清楚问题的本质,从根源处解决问题就不会像一个救火队员一样在自己的项目开发中到处救火了(解决乱码问题)