对jsp编码解码过程的疑惑

ThinkCat 2010-11-08 12:14:53
前两天搞的中文乱码问题,搞得晕头转向的。发了个帖子(http://topic.csdn.net/u/20101105/10/69f0a103-0a9b-492a-a345-fe62f5386cc0.html?seed=70058667&r=69678814#r_69678814),还是先谢谢回帖的各位,大家提供了不少建议,像写过滤器、设置request.setCharacterEncoding、response.setCharacterEncoding等等。

不过我想先不用这些,想搞清楚jsp的编码到底是什么过程,可能是本人比较愚钝,搜了各种帖子,各种看,结果确实越看越晕。也没发现讲jsp的书哪块讲到了jsp的编码问题。

以下是我对jsp执行过程的理解和疑惑:

1、一个jsp页面在编辑完后,会以一种编码方式保存在硬盘上,比如我用的MyEclipse,其默认的编码方法 为GBK,可以在Windows->Preferences->General->Workspace中进行修改;

2、然后当运行jsp时,一个jsp文件要进行一系列的转换, .jsp -> .java -> .class,这其中又进行了一系列的编码解码。

(1) 要读取第一步存储的硬盘上的文件,读取就应该是解码,那么用谁来解码呢,<疑惑一> 是由pageEncoding来指定的吗?</疑惑一>

(2) 对解码后的文件转换成servlet,之后在进行编码,<疑惑二>这一步是由tomcat配置文件server.xml中的URIEncoding来编码的吗?还是必须用UTF-8编码?</疑惑二>我比较偏向于后者,因为Java文件就是Unicode编码方式的,如果是前者,那么可以随便设置,就有可能出来的.java文件不是UTF-8的。但如果真是后者,<疑惑三>那么server.xml中的URIEncoding是干嘛的?为了保证get数据采用某种编码方式吗?(网上看的)</疑惑三>

(3) 将编码后的servlet转换成字节码文件,即class文件。这一步应该简单,用UTF-8的形式解码(Java就是Unicode编码方式,而UTF-8正是Unicode中的一种),然后转换成字节码。这一步应该是由jvm自动完成的,我们是干预不了。

(4) 接下来tomcat会载入和执行(3)得来的二进制代码,输出一个页面,这个页面由contentType的charset来负责编码。

(5) 浏览器接收到tomcat传过来的页面,用contentType的charset来解码,然后根据语法规则把它解释出来,这就是我们最终所见到的结果了。

还有一点疑问,<疑惑四>如果一个jsp页面中含有表单,那么jsp中本来的内容和表单中的内容是同时进行编码解码的吗?<疑惑四>

最后哪位朋友能提供些相关的资料,最好是官方的关于编码解码过程的说明,api里貌似没有这个。
...全文
218 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sddlw-stack 2012-08-21
  • 打赏
  • 举报
回复
你提到几个问题很实在很好,很收益
yuan921145774 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 chan10 的回复:

引用楼主 bgsbati1987 的回复:
<疑惑四>如果一个jsp页面中含有表单,那么jsp中本来的内容和表单中的内容是同时进行编码解码的吗?<疑惑四>

编码是一样的但是解码不一样
ThinkCat 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chan10 的回复:]

引用楼主 bgsbati1987 的回复:
<疑惑四>如果一个jsp页面中含有表单,那么jsp中本来的内容和表单中的内容是同时进行编码解码的吗?<疑惑四>

直接没懂意思。
首先表单数据得按post方法提交,才能ContentType的设置起作用。

表单内容提交后,应答页面的ContentType如果和请求的不一致,
一般需要用request.setCharacterEncodi……
[/Quote]疑惑四大致就是你理解的意思。原理还是不太懂,最终用过滤器解决的。
chan10 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 bgsbati1987 的回复:]
<疑惑四>如果一个jsp页面中含有表单,那么jsp中本来的内容和表单中的内容是同时进行编码解码的吗?<疑惑四>
[/Quote]
直接没懂意思。
首先表单数据得按post方法提交,才能ContentType的设置起作用。

表单内容提交后,应答页面的ContentType如果和请求的不一致,
一般需要用request.setCharacterEncoding(XXX)【XXX为请求页面的charset内容】
对请求数据进行编码。

chan10 2010-11-18
  • 打赏
  • 举报
回复
首先,本人也被乱搞搞的很无力,看了几天,还是没什么头绪。

个人观点:
首先、JSP编译成.class文件应该和具体的应用服务器关系不大,这些应该是在规范中定义的。

纯属个人观点:
[Quote=引用楼主 bgsbati1987 的回复:]
(1) 要读取第一步存储的硬盘上的文件,读取就应该是解码,那么用谁来解码呢,<疑惑一> 是由pageEncoding来指定的吗?</疑惑一>
[/Quote]
搜索JSP文件中指定的charset,如果没有,用file.encoding来进行解码。
ThinkCat 2010-11-09
  • 打赏
  • 举报
回复
这帖子又要杯具了
ThinkCat 2010-11-08
  • 打赏
  • 举报
回复
关于疑惑四的一点补充:jsp中本身的内容和表单中的输入的内容是用同一套标准来编解码的吗?
ThinkCat 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 daixiaolong_1588466 的回复:]

正在寻找 答案哈
[/Quote]搞了挺长时间了,还是不太明白
ThinkCat 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zheng192004 的回复:]

我来友情帮顶~~话说乱码真的很烦
[/Quote]是很烦啊。以前碰到过一个jsp的小项目,没用到框架,觉得乱码也没什么,把jsp页面中的几个地方改成utf-8,再改一下tomcat的配置文件,就没事了。可是,现在就挺崩溃了......
zheng192004 2010-11-08
  • 打赏
  • 举报
回复
我来友情帮顶~~话说乱码真的很烦
  • 打赏
  • 举报
回复
正在寻找 答案哈

67,518

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧