Ajax经验总结

 
  1 AJAX
  * AJAX的很多经典应用其实都是利用xmlhttp空间访问后台程序,后台程序返回脚本用eval回调或者返回简单数据的方式来开发。这样的开发模式的好处是设计简单轻巧,对熟悉dhtml的开发者来说上手会比较块,跨浏览器问题也容易解决,做简单的应用也够用。gmail,google suggest都是用这种方式。
  * AJAX的一种传统做法是后台返回完整的xml文件后用脚本(利用控件)解析xml后操作页面的dom节点来动态生成页面的一部分。这样作的优点是可以充分利用xml的强大表达能力传输各种数据结构,缺点是页面的dom操作效率不高,而且IE在dom操作的API上bug多多。之所以叫“前AJAX”,因为我们在AJAX这个名词出现前已经这样做了很多年了。
  * AJAX另一种传统做法是后台返回完整的xml文件后用脚本(利用控件)解析xml后生成html代码再灌回页面的层中。这样的做法回避了页面dom操作的一些问题,在生成的内容比较多的时候利用一些字符串计算的优化技巧(主要是数组和正则的应用)可以相当高效的生成页面。在我看来这是未来的发展趋势。
  我现在的项目主要采用的是第三种方式,结合第二种。我使用的是自己的一个小巧的框架,模拟jsp的语法来生成html代码,但是依赖于浏览器的xml解析API,因此难以跨浏览器。google的开源项目ajaxslt提供了一个纯js的xslt解决方式,功能更强大,可以在页面中局部的应用xslt解析xml生成html或者其他形式的数据,但是带来了xslt这个技术门槛。sf上的ZK似乎也不错,但是带来的是xul这个技术门槛,同时后台被绑定在了J2EE服务器上面。

  2 CACHE
  如果使用xmlhttp控件,在发起http请求的时候IE会包办cache策略,很多时候更新了数据却无法获得更新后的数据。一开始试图用传统方式在URL后面加随机数来强制更新,但是IE仍然距不发出新的请求。
一个解决方法是在后台写expires: 0或者其他的禁止前台cache的头,但是这样在数据没有更新的时候又会带来不必要的服务器压力、响应延迟和带宽浪费。
  一个稍微好一点的解决方法是,前台在提交数据以后,需要强制更新数据的时候:
xmlhttp.setRequestHeader("If-Modified-Since","0");

  3 系统错误: -1072896748。
  用xmlhttp接收到数据的时候经常是用xmldom.loadXML(xmlhttp.responseXML.xml)来判断返回的数据的正确性,但是如果后台送过来不正确的xml的时候有时回触发-1072896748系统错误。这是因为xmlhttp.responseXML已经没有解析到东西了,我们还试图访问它的xml属性而触发的。
  解决的方法是在使用responseXML.xml 或者 responseText的时候要做try/catch:

try{var tmp = xmlhttp.responseXML.xml}catch(ex){err=true;}
  有些人喜欢catch的时候判断 exception.description=="系统错误: -1072896748。" , 如果客户端不是简体中文版的系统的时候就判断不到了。其实这个地方只要有异常,都必须走异常处理流程了,不用区分的那么仔细。

  4 坚持通过xmlhttp调用,不要用xmldom调用。IE5的xmldom有一些已知的bug是无法解决的。

  5 坚持通过异步调用,不要同步调用。否则页面会堵塞在每个调用上,浏览器会常常失去响应。

  6 坚持通过纯xml方式传递数据,不要通过普通文本方式传递html或者javascript代码。降低cgi和页面的耦合性,这样相同的一个xml数据才能很容易的使用在各种不同的页面上。google在这方面并不是一个好的榜样。

  7 通过一致性的接口调用,不要在代码里面随处创建控件发起http连接。否则代码将乱成一片。

  8 要预见到跨域访问问题的存在,不管是否跨域始终通过代理页面访问。这样静态页面才能在需要的时候自由的移动到其他服务器上。

  9 尽量用一致的代码库解析xml生成显示页面,不要在每个页面上各自写解析xml和生成html的代码。否则页面将来非常难以维护。Uuzone采用的开源项目sarissa或者Google发起的开源项目Ajaxslt都是可以考虑的选择。


  10 AJAX中文问题

  A 发送路径中的参数有中文,在服务器段接收参数值是乱码

例如:

var url=a.jsp?name=小李;

xmlHTTP.open (post,url,true);

解决办法:

利用javascript的提供的escape()或encodeURI()方法

例如:

客户端:

var url=a.jsp?name=小李;

url=encodeURI(url);

url=encodeURI(url); //两次,很关键[具体为什么,我也不清楚]

/********************************************/

也有人写成var url=a.jsp?name=escape(小李);

功能和encodeURI方法类似。

/********************************************/

xmlHTTP.setrequestheader(cache-control,no-cache);

xmlHTTP.setrequestheader(Content-Type,application/x-www-form-urlencoded);

xmlHTTP.setrequestheader(contentType,text/html;charset=uft-8)//指定发送数据的编码格式

xmlHTTP.open (post,url,true);

服务器端:

String name = request.getParameter(name);

name = java.net.URLDecoder.decode(name, UTF-8);

 B 返回来的responseText或responseXML的值中含有中文是乱码

原因:AJAX在接收responseText或responseXML的值的时候是按照UTF-8的格式来解码的,如果服务器段发送的数据不是UTF-8的格式,那么接收responseText或responseXML的值有可能为乱码。

解决办法:在服务器指定发送数据的格式:

在jsp文件中:

response.setContentType(text/text;charset=UTF-8);//返回的是txt文本文件

或是

response.setContentType(text/xml;charset=UTF-8);//返回的xml文件

总结:1)ajax提交数据的格式默认为utf-8,利用javascript的提供的escape()或encodeURI()方法.在服务器端接收的时候要使用java.net.URLDecoder.decode(,UTF-8)方法进行解码.

2)xtmlhttp 返回的数据默认的字符编码是utf-8,所以服务器要向客户端发送数据的时候,也要采用utf-8编码

如果上述方法仍然解决不了乱码问题,那你尝试一下把jsp,htm,java文件用UTF-8编码格式保存.

总之:前后台数据交互都采用utf-8编码就行了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值