乱码的原因:
编码不一致导致乱码。(原因很简单是不是)
解决乱码:
规范、统一编码。(这不废话嘛,赶紧入正题)
好了,我们已经知道产生乱码的原因,更重要的我们已经知道解决乱码问题的思路,那么,
有了思路就有了切入点(这里只讨论jsp/serlet,原理是通用的)。
简化的B/S请求(不让上传本地图片,只好先上传到微博,用画图画的。。。)
测试环境:eclipse+weblogic+jdk1.5.22
web.xml:
<context-param>
<param-name>weblogic.httpd.inputCharset./*</param-name>
<param-value>GBK</param-value>
</context-param>
设置weblogic http-request全局编码,即对所有request请求都设置request.setCharacterEncoding("GBK")。
test.jsp:
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=GB18030"%>
...
...
...
<html:form action="/csi/bx/op" method="post">
姓名:<input name="personName" />
...
...
JSP文件头设置pageEncoding和contentType指令。
在姓名文本框中输入:“编码”这两个汉字,使用TCPMON抓包:
request报文:
POST /csi/bx/op.do HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Referer: http://localhost:7001/csi/bx/a.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:7001
Content-Length: 95
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JZZZGSESSION=7PJ3PhjSc723MvJ1k4YZVv0KJY79tySnTCtX1Gh2Qf7VKWmVdyh7!-528097381
personId=&identityNo=&personName=%B1%E0%C2%EB&b_sybxpayment=%B2%E9%D1%AF&methodName=sybxPayment
看最后一行,汉字 “编码” 已经被url encoding成%B1%E0%C2%EB,使用的编码是GB18030,也就是contentType设置的编码。
response报文:
HTTP/1.1 200 OK
Date: Fri, 27 Apr 2012 09:25:59 GMT
Content-Length: 2578
Content-Type: text/html; charset=GB18030
X-Powered-By: Servlet/2.5 JSP/2.1
response返回报文使用的编码是GB18030,也是contentType设置的编码。
不信?那我们把test.jsp文件的contentType换成UTF-8,在姓名文本框中一样输入汉字”编码“,继续抓包:
request报文:
POST /csi/bx/op.do;JZZZGSESSION=nJMqPhkGJWHwLMqHTX7WWMKvThZv45JsdPXwQ7TmW8TycpZLpmT1!-528097381 HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Referer: http://localhost:7001/csi/bx/a.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:7001
Content-Length: 107
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JZZZGSESSION=nJMqPhkGJWHwLMqHTX7WWMKvThZv45JsdPXwQ7TmW8TycpZLpmT1!-528097381
personId=&identityNo=&personName=%E7%BC%96%E7%A0%81&b_sybxpayment=%E6%9F%A5%E8%AF%A2&methodName=sybxPayment
很显然,汉字”编码“被编码成%E7%BC%96%E7%A0%81,使用UTF-8编码,每个汉字占3个字节。
乱码产生了:由于weblogic容器使用的编码为GBK,上面有描述,即requset.setCharacterEncoding("GBK"),
而客户端request报文是以UTF-8进行编码,那么,在request.getParameter得到的就是乱码。
response报文:
HTTP/1.1 200 OK
Date: Fri, 27 Apr 2012 09:19:12 GMT
Content-Length: 2580
Content-Type: text/html; charset=UTF-8
X-Powered-By: Servlet/2.5 JSP/2.1
response返回报文使用的编码已经是UTF-8了(这次信了吧)。
由此,可以看出contentType会影响url-encoding(URL编码-简单理解就将汉字表示成以%开头的字符串,每个字符串占1个字节),
同时会影响response报文的编码,如果在代码中有response.setCharacterEncoding(charset),
response报文的编码将以代码的为主。
接下来是pageEncoding,顾名思义,pageEncoding就是页面编码,通俗点就是文件编码或JSP文件编码,
文件是什么编码,pageEncoding写什么编码,这个很简单了吧。
但是,我们通常会遇到一种情况,如果在浏览器直接访问test.jsp,页面正常无乱码,当我们提交action,
服务器重新跳转到test.jsp,页面上出现了乱码,原因是response报文的编码和pageEncoding编码不兼容导致的。
JSP:
<%@ page language="java" pageEncoding="GB2312"%>
页面的编码是GB2312。
response报文:
HTTP/1.1 200 OK
Date: Fri, 27 Apr 2012 09:25:59 GMT
Content-Length: 2578
Content-Type: text/html; charset=UTF-8
X-Powered-By: Servlet/2.5 JSP/2.1
报文的编码是UTF-8,那么JSP页面就会出现乱码。
总结:
1、pageEncoding=文件编码
2、contentType=request.setCharacterEncoding(一般在代码或过滤器中会设置)
3、pageEncoding的编码要 兼容 contentType或response.setCharacterEncoding设置的编码,
比如UTF-8兼容GB2312,但GB2312不兼容UTF-8
”=“表示一致
分享到:
相关推荐
《使用JSP+Servlet实现的车辆租借系统详解》 ...通过深入研究和实践这样的项目,开发者不仅可以掌握核心技术,还能体验到软件开发的完整流程,从需求分析、设计、编码到测试和部署,对整个开发过程有更全面的认识。
通过这个项目对JSP、Servlet、JDBC、mysql数据库等技术有一个初步的认识和理解,同时也希望能够帮助有需要的朋友。 Mysql数据库和服务器 我使用的数据库版本为8.0.15; 服务器为Tocmat9.0.2; 数据表在src/test/...
通过以上对Servlet和JSP的基础概念、工作原理以及学习路径的详细介绍,相信读者已经对这两种技术有了较为全面的认识。希望每位学习者都能结合自身实际情况,制定出合理的学习计划,不断实践,最终成为一名合格的Java...
在Servlet中,我们可以使用`RequestDispatcher`进行请求转发,这会在同一个请求中调用多个Servlet或JSP。而重定向则是让客户端发起一个新的请求到指定URL。 9. **过滤器(Filter)** Filter允许我们在请求到达...
这个项目可以作为初学者了解Web开发的起点,通过它,学生可以学习到从需求分析、系统设计、编码实现到测试和部署的全过程,对Java Web开发有更全面的认识。同时,这也是一个实践动手能力的锻炼,有助于提升编程技能...
3. 编码实现:编写JSP页面、Servlet、JavaBean等,完成各功能模块。 4. 测试:单元测试、集成测试、性能测试,确保系统稳定可靠。 5. 部署上线:配置服务器环境,部署应用,进行线上测试。 6. 维护优化:根据用户...
通过以上介绍,你已经对JSP有了初步的认识。接下来,你可以尝试创建一个简单的JSP页面,运行并观察结果,以加深理解和实践。同时,学习更多关于Servlet、MVC模式和相关框架(如Spring MVC)的知识,将有助于你更好地...
3. 使用版本控制工具,确保团队成员对编码设置有统一的认识。 4. 对于用户提交的数据,始终使用标准的字符集进行处理,避免直接拼接字符串。 5. 在数据库设计初期,就确定好字符集,避免后期修改带来的麻烦。 ...
- `<jsp:forward>`:将请求转发到另一个JSP或Servlet。 - `<jsp:include>`:动态包含其他页面内容。 - `<jsp:plugin>`:创建浏览器插件交互。 - `<jsp:getProperty>`和`<jsp:setProperty>`:用于访问和修改JavaBeans...
通过深入学习和分析这个项目,可以全面理解和掌握JSP开发技能,同时对Web应用程序的开发流程有更深刻的认识。对于初学者,这是一个很好的实践案例,有助于理论知识与实际操作相结合,提升自身的编程能力。
对于学习者来说,此项目提供了一个实战练习平台,能帮助理解JSP、Servlet、JavaBean和前端技术的综合运用,同时加深对Web应用程序开发流程和MVC模式的认识。 通过分析和实践【JAVA+JSP程序系统的JSP聊天室】,...
和已经出版的同类图书相比,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》讲解由浅入深,涵盖更多内容,列举了大量典型实例具有超强的实用性,另外,《Java Web开发技术大全:JSP+Servlet+...
通过专题讲座,学生们深入学习了Web开发的基础知识,对JSP的页面结构、脚本元素、指令以及EL和JSTL有了一定的认识,同时也了解到Struts2、Spring和Hibernate在业务逻辑处理和数据持久化方面的优势。 3. 企业参观...
**JSP学习教程** JSP(JavaServer Pages)是一种基于Java技术的...通过上述内容,初学者可以对JSP有全面的认识,并逐步掌握网页制作和Java网站开发的基本技能。记得理论与实践相结合,多做项目,才能真正掌握JSP技术。
和已经出版的同类图书相比,《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》讲解由浅入深,涵盖更多内容,列举了大量典型实例具有超强的实用性,另外,《Java Web开发技术大全:JSP+Servlet+...
通过解决实际问题,深刻理解了软件工程的各个环节,包括需求分析、设计、编码和测试,也认识到用户体验在产品中的重要性。 总之,这个私家车位管理系统是利用现代信息技术解决社会问题的一个实例,通过合理的系统...
**JSP基础教学** ...通过以上对JSP基础的讲解,初学者应能建立起对JSP的初步认识。学习过程中,可以参考提供的PPT资源,如“jsp程序设计_基础知识.ppt”等,深入理解每个概念和实践案例,从而扎实地掌握JSP技术。
学习和理解这个源码可以帮助开发者掌握如何在JSP中处理文件系统、图片显示和动画,同时对服务器端的安全控制有更深的认识。对于初学者来说,这是一个实践Java Web开发和理解JSP工作原理的好案例。通过深入研究和调试...
【基于jsp的公司宣传系统】是一个专为公司打造的在线宣传平台,旨在通过网页形式展示公司的产品信息、企业文化,以提升公司形象,增加用户对企业的认识。该系统以JavaServer Pages(JSP)技术为核心,结合后端Java...
在编码实现阶段,使用Java语言编写后端逻辑,利用JSP进行前端展示,结合Servlet进行请求处理。数据库选用MySQL,确保数据存储的安全和高效。 4.4 系统测试 系统测试阶段包括单元测试、集成测试和系统测试,以验证...