JSP中AJAX表单提交中文问题的简单解决方案GBK版本.docx
- 文档编号:3254786
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:14
- 大小:45.09KB
JSP中AJAX表单提交中文问题的简单解决方案GBK版本.docx
《JSP中AJAX表单提交中文问题的简单解决方案GBK版本.docx》由会员分享,可在线阅读,更多相关《JSP中AJAX表单提交中文问题的简单解决方案GBK版本.docx(14页珍藏版)》请在冰豆网上搜索。
JSP中AJAX表单提交中文问题的简单解决方案GBK版本
测试通过:
Resin3.0.18,Tomcat5.0.30,5.5.20;浏览器:
IE6/Firefox2.0.
上一篇文章JSP中AJAX的表单提交中文问题的简单解决方案 主要是针对UTF-8版本的进行处理的,鉴于中国大陆
地区大部分还是用GBK编码写JSP,因此本文就针对GBK的实践结果进行介绍.
有朋友提到当AJAX遭遇GBK的尴尬 里说当AJAX使用GBK编码后,表单提交将出现乱码.如前文所述,只要全部采用
UTF-8编码,是没有任何问题的.那么都用GBK呢?
首先要讲的是我们的文章还是一样的原则:
尽可能少的改动原来的代码来解决中文乱码问题.所以本文的示例没有用过
滤器等方法.
那么使用GBK编码到底有没有乱码问题呢?
第一个关键点就是AJAX的表单提交代码必须正确的按照HTTP规范实现,即要保持原来的GET/POST方式不变,
也要保持里面的内容和浏览器提交的内容一摸一样.以下内容摘自我编写的内部培训教材:
-----------------引用开始-----------------
首先必须要介绍一下HTTP协议和GET,POST的工作方式.
当用户在Web浏览器地址栏中输入一个带有http:
//前缀的URL并按下Enter后,或者在Web页面中某个以http:
//开头
的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.
随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,
其语法规则为:
{
<\n>
{EntityBody}
请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等.
在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":
"分隔;
报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),
Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.
在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个\n之后是请求消息的消息实体
(EntityBody).
Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:
{
<\n>
{EntityBody}
应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.
状态码由3位数字组成,有5类:
1XX保留
2XX表示成功
3XX表示URL已经被移走
4XX表示客户错误
5XX表示服务器错误
例如:
415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:
Last_Modified
(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.
在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.
下面是一个应答消息的例子:
HTTP/1.0200OK
Date:
Moday,07-Apr-9721:
13:
02GMT
Server:
NCSA/1.1
MIME_Version:
1.0
Content_Type:
text/html
Last_Modified:
ThuDec509:
28:
011996
Coentent_Length:
3107
那么GET和POST有什么区别?
区别就是一个在URL请求里面附带了表单参数和值,一个是在HTTP请求的消息实体中.
用下面的例子可以很容易的看到同样的数据通过GET和POST来发送的区别,发送的数据是username=张三:
GET方式,浏览器键入http:
//localhost?
username=张三
GET/?
username=%E5%BC%A0%E4%B8%89HTTP/1.1
Accept:
image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*/*
Accept-Language:
zh-cn
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.0;.NETCLR1.1.4322)
Host:
localhost
Connection:
Keep-Alive
POST方式:
POST/HTTP/1.1
Accept:
image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*/*
Accept-Language:
zh-cn
Content-Type:
application/x-www-form-urlencoded
Accept-Encoding:
gzip,deflate
User-Agent:
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.0;.NETCLR1.1.4322)
Host:
localhost
Content-Length:
28
Connection:
Keep-Alive
username=%E5%BC%A0%E4%B8%89
比较一下上面的两段文字,您会发现GET方式把表单内容放在前面的请求头中,而POST则把这些内容放在请求的主
体中了,同时POST中把请求的Content-Type头设置为application/x-www-form-urlencoded.而发送的正文都是一样的,
可以这样来构造一个表单提交正文:
encodeURIComponent(arg1)=encodeURIComponent(value1)&
encodeURIComponent(arg2)=encodeURIComponent(value2)&.....
注:
encodeURIComponent返回一个包含了charstring内容的新的String对象(Unicode格式),所有空格、标点、
重音符号以及其他非ASCII字符都用%xx编码代替,其中xx等于表示该字符的十六进制数。
例如,空格返回的是"%20"。
字符的值大于255的用%uxxxx格式存储。
参见JavaScript的encodeURIComponent()方法.
下面就讨论一下如何在JavaScript中执行一个GET或者POST请求.如果您用过Java,那么您可能熟悉下列的用.URLConnection类进行POST操作的代码(参考JavaTip34:
POSTingviaJava):
URLurl;
URLConnectionurlConn;
DataOutputStreamprintout;
//URLofCGI-Binorjsp,aspscript.
url=newURL("somepage");
//URLconnectionchannel.
urlConn=url.openConnection();
//......
//Nocaching,wewanttherealthing.
urlConn.setUseCaches(false);
//Specifythecontenttype.
urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
//SendPOSToutput.
printout=newDataOutputStream(urlConn.getOutputStream());
Stringcontent="name="+URLEncoder.encode("BufordEarly")+"&email="+URLEncoder.encode("buford@known-");
printout.writeBytes(content);
printout.flush();
printout.close();
以上的代码向somepage发送了一次POST请求,数据为name=BufordEarly,email=buford@known-.
用JavaScript来执行POST/GET请求是同样的原理,下面的代码展示了分别用XMLHttpRequest对象向somepage用GET和POST两种方式发送和上例相同的数据的具体过程:
GET方式
varpostContent=
"name="+encodeURIComponent("BufordEarly")+"&email="+encodeURIComponent("buford@known-");
xmlhttp.open("GET","somepage"+"?
"+postContent,true);
xmlhttp.send(null);
POST方式
varpostContent=
"name="+encodeURIComponent("BufordEarly")+"&email="+encodeURIComponent("buford@known-");
xmlhttp.open("POST","somepage",true);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send(postContent);
至此希望你已经能够理解如何用JavaScript中的XMLHttpRequest对象来执行GET/POST操作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JSP AJAX 表单 提交 中文 问题 简单 解决方案 GBK 版本