一、基本概念
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-->中文
搞清楚问题的本质,从根源处解决问题就不会像一个救火队员一样在自己的项目开发中到处救火了(解决乱码问题)
分享到:
相关推荐
### javaweb servlet(jsp)的乱码问题原理及解决 #### HTTP协议的基本理解与乱码问题背景 HTTP协议作为互联网应用中最为广泛使用的通信协议之一,它定义了客户端和服务端之间的交互规则。HTTP请求主要分为GET和...
本文档提供了JSP中文乱码问题的全面解决方案。 首先,我们来看**JSP页面中文乱码**。当JSP页面中的静态HTML内容或动态输出的中文出现乱码时,可以通过在JSP页面指令中设置编码来解决。例如,添加`;charset=UTF-8" %...
- 解决方案:在服务器端处理请求前,应指定正确的字符编码,如在Servlet中设置`request.setCharacterEncoding("UTF-8")`。 3. **数据库读写乱码**:在数据库操作时,读取或写入的中文数据出现乱码。这可能是数据库...
在讨论解决方案之前,我们先来了解一下为什么会发生中文乱码的情况。当服务器接收到客户端发送的请求时,会根据请求中的参数解析出相应的处理逻辑。如果客户端与服务器之间存在编码不一致的情况,就可能导致中文字符...
下面是一些从提供的文件内容中归纳出的常见Java错误及其解决方案: 1. **严重:Dispatcher initialization failed** 这个错误通常出现在使用Struts框架时,提示classes目录下的`struts.xml`配置文件出现问题。解决...