- 浏览: 429458 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiesbao:
找到了,太坑爹了。
Intellij Idea 滚动条跳动的问题 -
hvang1988:
按照你说的例子,主备说的是dbtest1,dbtest2,db ...
阿里开源Mysql分布式中间件:Cobar -
hvang1988:
问个问题:一个数据库的表的全部数据只分布在一个cobar上。多 ...
阿里开源Mysql分布式中间件:Cobar -
SiKing:
多谢,一直被这个问题困扰
Intellij Idea 滚动条跳动的问题 -
guodage003:
多谢 解决了这个蛋疼的问题。。
Intellij Idea 滚动条跳动的问题
当请求一个JSP页面时,一般的都需要经历下面几个阶段:
1、应用服务器根据JSP页面生成一个Java文件
2、应用服务器调用java.exe将Java文件编译成一个Servlet对应的class文件
3、用户的浏览器请求JSP对应的Servlet,Web容器起一个线程执行Servlet,将数据返回给客户端浏览器
4、用户的IE根据返回的数据,将结果显示给用户。
第一步中应用服务器根据Jsp页面生成一个Java文件时,需要读取源Jsp页面到内存中,然后以某种编码方式生成Servlet类文件,这一读的过程会涉及到采用什么编码方式来读取的问题?这里先看一下结论:如页面中设置了pageEncoding="XX",则服务器在读取Jsp页面时,就会使用上面设置的XX来读取,如果没有设置,再看是否设置了contentType="text/html; charset=XXX" ,如果设置了,则用charset中指定的编码方式来读取。如果这两个都没有指定时,则使用默认的编码方式ISO8859-1来读取 。
以上是读取的过程,当把Jsp页面读取到内存后,在内存中以Unicode编码存在,这时需要根据Jsp文件生成Servlet类文件,既然要定文件,这里又会涉及到编码问题,这里该使用什么编码方式来输出到文件呢?先看结论:Tomcact是使用UTF-8编码方式来输出的 ,这也是理所当然的,因为页面上会有不同的各种语言。
下面来证实上面的两个结论。
首先我们写一个Jsp页面gbk.jsp,从文件名就可知我们创建一个以GBK编码方式保存的Jsp文件。
下面是我创建并设置好编码方式的过程:
- <%@ page language="java" %>
- <html>
- <body>
- <form name=form1 action="" method="get">
- <input type="text" name="textParam1" size="50 px" value="國a">
- <br>
- <input type="file" name="fileParam" size="50 px" value="">
- <br>
- <input type="button" value="submit" onclick="submitForm()">
- </form>
- <script type="text/javascript">
- function submitForm(){
- //注释
- var str ="國a";
- form1.action = "http://localhost:8088/gb2312rs.jsp?qryParam1=" +
- encodeURIComponent(str) + "&qryParam2="+ encodeURIComponent(form1.textParam1.value) ;
- form1.submit();
- }
- </script>
- </body>
-
</html>
保存后,我们开始访问一下,浏览器显示如下:
从上图看出浏览器使用的是ISO编码方式,所以上面文本框里显示正常才怪呢~!但当我们把浏览器的编码方式换成GBK时,看是什么样,~!~#@!¥,晕~!找了半天浏览器上面根本就没有GBK这一编码方式,中文的就只有GB2312,我们就选一下GB2312试试看,如下图:
咦~!我们选择是GB2312怎么也可显示出繁体字啊?其实浏览器中的GB2312就是用的操作系统默认的编码GBK来显示的,至于解释请看《Java中的字符集编码入门(三)GB2312,GBK与中文网页 》。好奇心没有后继续往下看。我们打开服务器帮我们生成的Servlet类文件,其中输出中文的地方代码片断如下:
我们发现中文“注释”与“國”字,都变成了乱码。既我们知道了上面结论:该文件是UTF-8编码格式的,那我就以UTF-8来读读这个文件,读代码如下:
- String fileName = "E:/tomcat-5.5.23/work/Catalina/localhost/HttpStream/org/apache/jsp/gbk_jsp.java";
- PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("e:/tmp/gbk_jsp.java"), "UTF-8"));
- BufferedReader br = new BufferedReader(new InputStreamReader(
- new FileInputStream(fileName), "utf-8"));
- String readContent = null;
- while ((readContent = br.readLine()) != null) {
- pw.write(readContent+"\r\n");
- pw.flush();
- }
- pw.close();
读出的文件片断如下:
从上面输出的结果可以进一步证明生成的Sevlet就是UTF-8编码方式的存储的,因为这两个文件内容乱码显示的样子都是一样的。
从最开始来看在浏览器中能正常显示,那说明生成的Servlet类文件真实的内容没有毁坏,不然不可能在浏览器中能正常显示的,我们要坚信这一点。那既然文件内容没有毁坏,为什么生成的Servlet类文件却显示的是乱码呢?
经过我的一些分析,原因大致如下:
服务器在读取Jsp源文件时是采用的ISO8859-1来读取的(这是因为页没有配置任何编码信息),而Jsp源文件本身却又是GBK编码的,这一读的过程为字符解码过程,且又是以ISO8859-1来解的(会把GBK编码每个字节映射到ISO8859-1字符集下,而每个字节的大小为0-255,在ISO8859-1字符集里是可以找到对应的字符来替代的),这一转换过程并不会丢失任何编码信息,只是字符的显示方式不同而已了(GBK是一个个汉字的显示,而ISO却是半个半个地显示)。
而在读取完后放在内存里以Unicode形式存在(即ISO字符以Unicode编码存储,而非原来ISO编码,这一过程由Java完成,但ISO的编码实质上与Unicode编码是一样的,只是所占字节数不一样),再以UTF-8输出时,由于这些Unicode字符在UTF-8字符集编码里是存在的,并为上面显示的那些字符(实质上这些字符就是ISO字符集中的字符),也不会造成编码信息丢失。
既然我们知道了是这样一过程:GBK文件——》以ISO8859-1来读(解码)——》以UTF-8输出(编码),那我现在还她一个眉目清秀,先以UTF-8来读生成的Servlet文件(解码),然后以ISO8859-1来编码(这样就回到了服务器以ISO8859-1读取的内容了),最后以GBK来解码(就回到了最原始的Jsp文件了),最后...当然是现原型了(狐狸精一个啊,不过还是挺美的哦),一切显示正常,回到了过去。
以下是代码实现:
- String fileName = "E:/tomcat-5.5.23/work/Catalina/localhost/HttpStream/org/apache/jsp/gbk_jsp.java";
- PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(
- "e:/tmp/gbk_jsp.java"), "UTF-8"));
- BufferedReader br = new BufferedReader(new InputStreamReader(
- new FileInputStream(fileName), "utf-8"));
- String readContent = null;
- while ((readContent = br.readLine()) != null) {
- pw.write(new String(readContent.getBytes("iso8859-1"), "gbk") + "\r\n");
- pw.flush();
- }
- pw.close();
结果如何,看看下面小小的截图便知:
发表评论
-
深入理解Java内存模型
2014-11-08 16:54 1025深入理解Java内存模型(一)——基础深入理 ... -
阿里开源Mysql分布式中间件:Cobar
2014-08-12 11:54 64462这几天研究 ... -
今日开源介绍:Google Guava、Google Guice、Joda-Time
2014-08-11 11:55 18253一、Guava 是一个 Google 的基于java1.6的 ... -
Jackson 动态过滤属性
2014-06-20 16:15 3038在把java对象转换为json时,有时需要依据需求动态过滤掉 ... -
自实现CAS原理JAVA版,模拟下单库存扣减
2014-04-02 17:47 7073在做电商系统时,库存 ... -
JAVA逻辑判断工具类
2013-09-06 21:33 1758在开发过程中,经常需要对“对象”、Map、Collecti ... -
Servlet2.4 监听器
2011-06-17 17:48 1586Servlet API提供了基本的应用程序事件监听器接口。编程 ... -
Java中的字符集编码入门(六)Java中的增补字符
2011-02-23 12:11 1479Java号称对Unicode提 ... -
Java中的字符集编码入门(五)Java代码中的字符编码转换
2011-02-23 12:08 1157如果你是JVM的设计者,让你来决定JVM中所有字符的表 ... -
Java中的字符集编码入门(四)网页文件的编码
2011-02-23 12:03 1100接着上节的思路说,一个网页要想在浏览器中能够正确显示,需要在三 ... -
Java中的字符集编码入门(三)GB2312,GBK与中文网页
2011-02-23 12:02 1258GB2312是对中国的开发人员来说很重要的一个词汇,它的来龙去 ... -
Java中的字符集编码入门(二)编码字符集与字符集编码的区别
2011-02-23 12:01 933需要再一次强调的是, ... -
Java中的字符集编码入门(一)Unicode与UCS的历史恩怨
2011-02-23 11:59 1061ASCII及相关标准 ... -
方便管理工程中的SQL语句
2010-10-13 17:13 1849引用 之前在项目开发时候,经理要求把所有的SQL语句挑出 ... -
常见通信名称缩写解释
2010-09-03 16:05 2348引用 在看新闻时,购买手机时,经常听到关于通信方面的一 ... -
飞信维脉系统(定时短息发送系统)
2010-08-01 21:27 1600引用 因为工作原因 ... -
HTTP协议介绍
2010-07-28 09:45 822引用 HTTP(HyperTextTransferPro ... -
Java调用存储过程举例
2010-07-23 18:22 917Java调用oracle存储过程的示例总结如下。 ... -
Oracle数据库链接池
2010-04-13 17:28 2013引用 很多时候我们都要操作数据库,高效数据库操作的第一步 ... -
不区分大小写查找字符串(二)
2010-03-25 20:56 2310引用 上次发表了自己编写不区分大小查找的方法,这次使用了 ...
相关推荐
jsp编码乱码问题是jsp开发中常见的问题之一,该问题可能会导致jsp页面显示乱码,影响用户体验。因此,了解jsp编码的原理和解决乱码问题的方法是非常重要的。 jsp编码的原理 jsp编码是指jsp页面中的编码方式,jsp...
- **指令**:用于配置页面或者影响JSP编译过程,如`<%@ page %>`, `<%@ include %>`, `<%@ taglib %>`等。 - **动作元素**:用于调用JSP组件,如`<jsp:include>`, `<jsp:forward>`, `<jsp:param>`等。 **3. 注释** ...
2. **Web容器对JSP文件的编译**:Web容器会将JSP文件编译成Servlet类文件。编译过程中,Web容器需要根据一定的规则来识别JSP文件的编码方式。 3. **HTTP请求中的编码**:浏览器向服务器发送请求时,数据(如表单数据...
在Tomcat的`conf/web.xml`配置文件中,你可以找到关于JSP编译的相关设置。其中,`javax.servlet.jsp.jstl.core.LogicalView`和`org.apache.jasper.Constants`这两个servlet定义了JSP的编译路径。默认情况下,JSP页面...
Servlet接收上传文件,将其保存到服务器的指定目录,并将路径信息存入数据库,以便在JSP页面中展示。 - **权限管理**:通过Servlet实现用户角色划分,例如普通用户只能阅读和评论,而管理员可以发布、编辑和删除文章...
JSP文件会被Web服务器转换为Servlet,然后编译成字节码执行。通过使用JSP,开发者可以更专注于页面的展示,而将复杂的Java代码隐藏在后台处理。 2. **Servlet**: Servlet是Java EE规范的一部分,是用于扩展服务器...
pageEncoding 是 JSP 中的一个指令,它指定了 JSP 文件在编译成 Servlet 时所使用的编码方式。通常,在 JSP 文件中定义的字符串或直接作为 HTML 输出的字符串出现乱码时,都是由于该参数设置错误引起的。 ...
- **作用**:`pageEncoding` 属性用于设置JSP文件编译成Servlet时的编码方式。这是JSP特有的属性,不能在Servlet中使用。 - **应用场景**:当JSP文件中有直接定义的字符串时(即不在表单提交中出现的字符串),如果...
在Java开发过程中,中文乱码问题常常困扰着开发者,尤其是在处理JSP页面时。这篇"java中文乱码解决之道(7)JSP页面编码过程"的主题深入探讨了如何有效地解决这个问题,提供了宝贵的Java经验和技巧。这里我们将详细...
pageEncoding 的作用是设置 JSP 编译成 Servlet 原代码文件时所使用的编码。JSP 在服务器上是要先被编译成 Servlet 的类文件的。pageEncoding 的作用就是告诉 JSP 编译器在将 JSP 文件编译成 Servlet 文件时使用的...
总结起来,解决Servlet和JSP中的乱码问题,关键在于正确设置请求和响应的字符编码,并确保整个开发环境和部署环境的一致性。对于复杂的项目,使用过滤器可以提供更统一和灵活的解决方案。通过理解字符编码的基本原理...
JSP文件在服务器上被编译成Servlet(Java Servlet)来执行,Servlet是Java编程语言中的一个接口,用于扩展服务器的功能,处理HTTP请求。 【JSP页面结构】 一个典型的JSP页面包含两部分:静态内容(如HTML)和动态...
如果没有其他指定,则JSP编译后的Servlet也会使用该编码格式来读取JSP文件。此外,还可以指定: ```jsp ;charset=UTF-8" %> ``` 这一行指定了服务器返回给客户端的HTML文档的编码格式,即解码格式。当这两行都...
3. **JSP转换过程**:JSP页面在首次请求时被Web容器转换为Servlet源码,编译成.class文件,然后执行。 4. **JSP内置对象**:包括request、response、session、out、pageContext、config、application、page等,它们...
综上所述,通过合理设置JSP页面、Servlet请求、页面间转发、数据库查询结果以及全局编码等方式,可以有效地解决JSP页面乱码的问题。开发者应该根据实际情况选择合适的解决方案,并保持编码设置的一致性和准确性。
- **执行过程**:JSP页面首先被编译成Servlet,然后由服务器执行并生成HTML内容返回给客户端。 - **优点**: - 内容生成与表示分离。 - 强调组件的重用。 - 简化了页面开发过程。 #### 五、JSP语法 - **脚本元素...
在Web开发中,JSP中文乱码是一个常见的问题,主要涉及页面显示、表单提交以及数据库操作等环节。理解并掌握这些环节的编码处理至关重要,以确保数据的准确性和用户体验。 1. **JSP文件的编码与保存** JSP文件本质...
在运行时,JSP文件会被转换成对应的Servlet类并由Java虚拟机执行。 2. **职责分工**:JSP更适合于页面展示,因为它允许开发者直接在HTML中嵌入Java代码,方便处理动态内容的生成。而Servlet则更擅长处理业务逻辑和...