本篇将以JSP页面中可能存在的中文乱码问题进行分析和解决。

  中文乱码的问题一直是国人在编程过程中的一大头疼问题,这点上在JSP、Servlet或Tomcat上随处可见。比如我们在写一个Servlet时,经常要使用响应对象Response来设置使用的编码表或者给浏览器输出的响应中的响应头设置某个编码表,如在之前博客《Servlet的学习之Response响应对象(1)》 中介绍的一样。

  本篇主要以上一篇《JSP的学习(3)——语法知识二之page指令》中page指令的最后部分的两个属性“pageEncoding”和“contentType”所涉及到的编码及中文乱码的解决。

  我们先来看“pageEncoding”属性。

  当我们使用MyEclipse创建一个JSP后,由于MyEclipse使用模板创建JSP,所以新建的JSP中都会有page指令设置了这个属性,例如:

  

  MyEclipse中给我们创建的JSP默认使用“ISO-8859-1”码表,当然我们可以在模板中改变成别的码表,这里先记住这个默认的编码表。

  “pageEncoding”属性是在JSP页面的编码,指定了在将该JSP页面中的内容由JSP引擎(或Tomcat)将其翻译转换成.java文件(即Servlet)时所采用的编码表。

  在JSP标准语法中,如果”pageEncoding”属性存在,那么JSP页面的字符编码方式就由pageEncoding指定;否则就由“contentType”属性中的”charset”决定,如果”charset”也不存在,那么就默认采用“ISO-8859-1”编码表。

  如果我们不是用一个开发工具,例如MyEclipse来编写JSP,而是采用如记事本或者EditPlus这样的文本编辑器来写JSP(总有要装的很牛逼的时候嘛)。那么我们存储时总是要选择何种编码来将我们的文件内容存储在计算机硬盘中。如果这时候我们选择的编码跟以后要进行解码的码表不对,中文基本都是要出现问题的,所以我们在存储JSP页面时,一定要按照”pageEncoding”属性来选择以何种码表形式来存储。

  下面以一个动图的方式来展示为什么会出现这个问题:

  动图中的原因很好地解释了在服务器端就有可能出现的中文乱码问题,上面还没涉及用户从浏览器请求数据,而服务器给用户可能看到的乱码。

  因此请务必保证你存储JSP所使用的码表和你JSP页面中设置的”pageEncoding”属性保持一致,那么我们再来重新看看在服务器端解决了中文乱码问题的动图过程:

  而如果是用像MyEclipse这样比较“聪明的开发工具”,在我们保存JSP时,它会自动自动根据我们所设置的“pageEncoding”属性的编码表进行保存:

  例如我将某个web工程下的“index.jsp”中的“pageEncoding”属性改为“utf-8”,接着右键点击工作目录下的“index.jsp”,选择最下方的【Preference】:

  

我们可以看到MyEclipse自动帮我们把该JSP保存为UTF-8编码格式:

  

如果我们再将这个“index.jsp”中的“pageEncoding”属性改为“GB2312”,保存后重新查看:

  

就是这么“智能”,但如果不知道这一点的人会比较纳闷MyEclipse是以怎么样的方式保存的。

  现在我们再来看“contentType”这个page指令的属性。

  想起我们以前在写Servlet程序中也提到过中文乱码问题,如果还记得在 《Servlet的学习之Response响应对象(1)》 中提到的我们在Servlet的开始调用response.setContentType(“text/html;charset=UTF-8”)或者如果是字符流还必须先指明使用的字符表,调用response.setCharacterEncoding(“UTF-8”)来解决中文乱码问题。

  之前利用Servlet来做是因为我们的代码直接都写在Servlet中,而现在我们是编写JSP代码,我们对JSP更关心的获取和怎么显示数据,并且服务器总要将JSP翻译转换为Servlet,而这个Servlet在Tomcat的【work】目录中,我们应该是不对其进行操作的,因此我们必须要将这个翻译转换后的Servlet能进行以前一些我们直接编写Servlet的设置,比如说给浏览器反馈而指示浏览器应该采用何种编码表来解析显示数据。

  这一点就是“contentType”这个属性所做的工作,当我们设置了“contentType”,那么在JSP转换成Servlet后,在这个Servlet中服务器自动帮我们添加response.setContentType方法或也有response.setCharacterEncoding方法。这时浏览器就能根据这个Servlet发回的响应对象选择合适的编码表进行数据解析并显示。

  请看下面最终我们能从浏览器正确地看到在JSP中所编写中文数据动图过程:

  最后的最后,我们再来说一个比较“欠扁”的事,其实只要我们设置了“pageEncoding”属性,我们就默认地也设置了“contentType”的编码表。但记住保存JSP时还是要注意采用的编码表,不要因为MyEclipse能自动根据我们设置的“pageEncoding”而选择编码表保存而我们使用别的方式保存JSP就忘了怎么回事。

  比如我们将某个web工程中的“pageEncoding”属性改为“GB2312”,那么在JSP转换成的Servlet中,会自动将response.setContentType(…)方法中的编码表改变:

    response.setContentType("text/html;charset=GB2312");

如果我们的JSP页面中没有“pageEncoding”属性,那么你会发现对应的Servlet中setContentType的代码是这样写的:

    response.setContentType("text/html");

即不设置任何编码表,因此服务器将JSP转换为Servlet所采用的编码表和服务器通知浏览器所采用的编码表都将采用“ISO-8859-1”。

  所以我们本篇文章说了这么多,其实只要设置一个“pageEncoding”属性就好了。但是本篇文章写下来,也加深了对JSP及Tomcat处理Servlet的编码表这些底层原理的了解。

JSP的学习(4)——中文乱码的解决的更多相关文章

  1. jsp表单提交中文乱码的解决

    <%@ page language="Java" contentType="text/html; charset=utf-8 "    pageEncod ...

  2. jsp中文乱码终极解决方法(转)

    一, 找出问题的根源乱码可能出现的地方: jsp页面中 jsp页面之间相互传参的参数 与数据库中数据的存取 基本归纳为以上几种. 二, 寻找解决方案 出现在jsp页面中,是由于没有设置jsp页面的中文 ...

  3. jsp中文乱码终极解决方法

    转载http://blog.csdn.net/csh624366188/article/details/6657350 一 找出问题的根源    乱码可能出现的地方:1 jsp页面中          ...

  4. JSP和Servlet的中文乱码处理

    JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我 ...

  5. 详解get请求和post请求参数中文乱码的解决办法

    首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...

  6. js url传值中文乱码完美解决(JAVA)

    js url传值中文乱码完美解决(JAVA) 首先在你的jsp页面这样更改: var url="你要传入的Action的位置&ipid="+ipid+"& ...

  7. Jsp页面中的中文乱码问题解决

    Jsp页面中的中文乱码问题解决 在编写Jsp页面的时候,发现写入其中的中文在浏览器浏览的时候会出现乱码的情况. 出现乱码的原因分析: 因为页面中对自己的编码格式的声明和页面的实际编码格式不相同,而浏览 ...

  8. resin后台输出中文乱码的解决办法!

    resin后台输出中文乱码的解决办法! 学习了:https://blog.csdn.net/kobeguang/article/details/34116429 编辑conf/resin.con文件: ...

  9. resin后台输出中文乱码的解决的方法!

    近期从tomcat移植到resin,发现这东西不错啊! 仅仅是后台输出时有时候中文会乱码. 如今找到resin后台输出中文乱码的解决的方法: 编辑conf/resin.con文件: <!--ja ...

随机推荐

  1. m序列产生器

    扩频通讯中会用的到伪随机数列 —— m序列 代码中是5bit原始码 module m_generate ( clock , reset , m_code ); input clock ,reset ; ...

  2. Nutch 是一个开源Java 实现的搜索引擎

    Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting,他同时也是Lucene.Hado ...

  3. 关于libgdx中UI控件的旋转和缩放的备忘

    最近遇到这样一个问题,定义了一个ImageButton后,想对按钮进行下旋转,结果setRotation(-90f),不起作用.后来在官网上找到了原因 关于UI控件的旋转 缩放官网上有这样一段话(链接 ...

  4. WPF实现界面动态布局

    曾经总认为动态布局是个非常麻烦的问题.是个非常须要功力的问题.可是貌似在.NET中,在WPF中却不是那么的麻烦.以下介绍我如今实现的一个动态布局的实例. 由于有需求,所以困难得克服!而我们的需求表名. ...

  5. quartz群调查调度机制和源代码分析

    pageId=85056282#quartz集群调度机制调研及源代码分析-quartz2.2.1集群调度机制调研及源代码分析" style="color:rgb(59,115,17 ...

  6. 网页制作之JavaScript部分 2 - DOM操作

    1.DOM的基本概念  htmlDOM是一种面向对象的树的模型,它包含html中的所有元素:通过html可以找到所有包含在dom中的元素. DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对 ...

  7. HTTP1.1协议中文版-RFC2616

    转自:http://www.cnpaf.net/Class/HTTP/200811/23277.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善.请参考 “互联网官方协 ...

  8. IntelliJ IDEA 开发swing(二)

    原文:idea开发swing(二) 闲话少说,书接idea开发swing(一). 程序编译完成后,需要打包发布,如果有fat_jar的同学可以通过该插件打包,这里是使用ant来打包,步骤如下: 一.编 ...

  9. html:打开新的页面

    在html页面中,打开一个新的页面,有两种方式: 一.利用超链接 <a href="newurl">新页面</a> 上面代码添加了一个新链接,点击链接时会打 ...

  10. CCIE路由实验(7) -- MPLS VPN

    1.LDP协议的各种情况2.LDP和BGP交互3.LDP高级部分4.MPLS VPN (RIP和静态)5.MPLS VPN (EIGRP)6.MPLS VPN (OSPF)7.MPLS VPN (EB ...