您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 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消息,其语法规则为:MethodURLHTTPVersion\n{Header:Value\n}*\n{EntityBody}请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等.在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以:分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个\n之后是请求消息的消息实体(EntityBody).Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:HTTPVersionStatusCode[Message]\n{Header:Value\n}*\n{EntityBody}应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类:1XX保留2XX表示成功3XX表示URL已经被移走4XX表示客户错误5XX表示服务器错误例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.下面是一个应答消息的例子:HTTP/1.0200OKDate:Moday,07-Apr-9721:13:02GMTServer:NCSA/1.1MIME_Version:1.0Content_Type:text/htmlLast_Modified:ThuDec509:28:011996Coentent_Length:3107HTMLHEADTITLE.../HTML那么GET和POST有什么区别?区别就是一个在URL请求里面附带了表单参数和值,一个是在HTTP请求的消息实体中.用下面的例子可以很容易的看到同样的数据通过GET和POST来发送的区别,发送的数据是username=张三:GET方式,浏览器键入=张三GET/?username=%E5%BC%A0%E4%B8%89HTTP/1.1Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*/*Accept-Language:zh-cnAccept-Encoding:gzip,deflateUser-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.0;.NETCLR1.1.4322)Host:localhostConnection:Keep-AlivePOST方式:POST/HTTP/1.1Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*/*Accept-Language:zh-cnContent-Type:application/x-:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.0;.NETCLR1.1.4322)Host:localhostContent-Length:28Connection:Keep-Aliveusername=%E5%BC%A0%E4%B8%89比较一下上面的两段文字,您会发现GET方式把表单内容放在前面的请求头中,而POST则把这些内容放在请求的主体中了,同时POST中把请求的Content-Type头设置为application/x-而发送的正文都是一样的,可以这样来构造一个表单提交正文:encodeURIComponent(arg1)=encodeURIComponent(value1)&encodeURIComponent(arg2)=encodeURIComponent(value2)&.....注:encodeURIComponent返回一个包含了charstring内容的新的String对象(Unicode格式),所有空格、标点、重音符号以及其他非ASCII字符都用%xx编码代替,其中xx等于表示该字符的十六进制数。例如,空格返回的是%20。字符的值大于255的用%uxxxx格式存储。参见JavaScript的encodeURIComponent()方法.下面就讨论一下如何在JavaScript中执行一个GET或者POST请求.如果您用过Java,那么您可能熟悉下列的用java.net.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-);//SendPOSToutput.printout=newDataOutputStream(urlConn.getOutputStream());Stringcontent=name=+URLEncoder.encode(BufordEarly)+&email=+URLEncoder.encode(buford@known-space.com);printout.writeBytes(content);printout.flush();printout.close();以上的代码向somepage发送了一次POST请求,数据为name=BufordEarly,email=buford@known-space.com.用JavaScript来执行POST/GET请求是同样的原理,下面的代码展示了分别用XMLHttpRequest对象向somepage用GET和POST两种方式发送和上例相同的数据的具体过程:GET方式varpostContent=name=+encodeURIComponent(BufordEarly)+&email=+encodeURIComponent(buford@known-space.com);xmlhttp.open(GET,somepage+?+postContent,true);xmlhttp.send(null);POST方式varpostContent=name=+encodeURIComponent(BufordEarly)+&email=+encodeURIComponent(buford@known-space.com);xmlhttp.open(POST,somepage,true);xmlhttp.setRequestHeader(Content-Type,application/x-);xmlhttp.send(postContent);至此希望你已经能够理解如何用JavaScript中的XMLHttpRequest对象来执行GET/POST操作,剩下的工作就是您如何来构造这些提交的参数了,最后我给出一个将现有的form提交代码修改为异步的AJAX提交的代码(注意目前作者还不知道如何让file上传表单域也能异步上传文件).首先请看两个JavaScript函数://form-theformtosubmit//resultDivId-thedivisionofwhichtodisplayresulttextin,innull,then//createanelementandaddittotheendofthebodyfunctionajaxSubmitForm(form,resultDivId){varelements=form.elements;//Enumerationtheformelementsvarelement;vari;varpostContent=;//Formcontentsneedtosubmitfor(i=0;ielements.length;++i){varelement=elements[i];if(element.type==text||element.type==textarea||element.type==hidden){postContent+=encodeURIComponent(element.name)+=+encodeURIComponent(element.value)+&;}elseif(element.type==select-one||element.type==select-multiple){varoptions=element.options,j,item;for(j=0;joptions.length;++j){i
本文标题:JSP中AJAX表单提交中文问题的简单解决方案(GBK版本)
链接地址:https://www.777doc.com/doc-4335337 .html