给小白的Java EE指南(5) : AJAX

2022-12-23 0 668

原副标题:给阿宝的Java EE手册(5) : AJAX

责任编辑是给阿宝的Java EE存活手册的第5篇, 讲呵呵后端技师必不可少的AJAX的原委。

返回2001年, 彼时的老赵却是小张, 在representing跟著老板娘和云南的两个子公司密切合作,做两个近似于OA(网络化)的工程项目。

彼时小张刚大学毕业,写过许多asp的流程,在小张的觉悟之中, 却是真的如果你透过应用流程向伺服器T7250, 伺服器处置之后, 须要创下整座页面就可以看见伺服器处置的结论。

给小白的Java EE指南(5) : AJAX

但有一天我忽然看见工程项目中大牛写的两个页面,那个页面下面是工具栏,尾端是两个树型内部结构,代表者了两个子公司的各个单位。

点选了工具栏之后, 整座页面没创下, 奇妙的是那个职能部门的树型政府机构居然出现了变动! 换句话说整座页面没创下, 而已页面的局部性出现了创下。

太难以置信了 ! 我急忙关上那个一般的asp流程, 看一看见底是甚么情形。

原本点了工具栏之后, 继续执行了几段javascript, 当中创建了两个叫的小东西;

var xhr;

if (window.){

xhr=new (); //非IE应用流程

}else{

xhr=new ActiveXObject(“Microsoft.XMLHTTP“); //IE 应用流程

}

//放置两个回调函数: state_change, 当http的状态出现变动时会调用

xhr.onreadystatechange=state_change

xhr.open(“GET”,”http://xxxxxx.xxx/xxx.asp”,true);// true 表示异步调用

xhr.send(); //这是两个耗时的操作

//具体的回调函数定义

function state_change()

{

if (xmlhttp.readyState==4 && xmlhttp.status==200){

xmlRes = xhr.responseXML;

//对xml进行处置,更新职能部门的树型内部结构, 代码略

document.getElementById(deptTree).innerHTML = xxxxxxx

}

}

//其他代码, 略

你可以想象我第一次看见这样的处理时那种震惊的表情。 原本页面可以这么写, javascript 可以这么用!

其实这里体现的思想有两点:

1. 异步调用

异步的意思是说, 调用两个耗时的函数(上例中的xhr.send()) 之后, 不等到它返回,就直接继续执行后续的代码了。

当然在调用它之前会放置两个回调的函数callback(上例中的state_change),等到那个耗时的函数完成之后,再来调用callback 。

为甚么要这么做呢? 主要是网络操作太耗时了, 你在应用流程中的两个点选可能访问是地球那一边的伺服器, 如果是同步操作, 即等待网络操作完成之后再进行下一步, 就可能阻塞当前线程, 甚至会导致应用流程卡死的情形。

异步调用在编程中是个非常常用的手段, 后来伺服器端的javascript Node.js 几乎全是基于事件的异步调用。

2. 用XML做应用流程端和伺服器端的数据交换

这点毋庸解释, 参见《给阿宝的Java EE手册(3): XML》 ,看一看xml 的作用。

3. 局部性创下

Javascript 取到从伺服器端返回的XML之后, 解析该XML, 然后透过DOM对象只更新整座页面html的一部分,例如更新两个table, 两个div ….

document.getElementById(deptTree).innerHTML = xxxxxxx

异步的JavaScript和XML(Asynchronous Javascript And XML) 就简称AJAX, 你看这些缩写其实没甚么神秘的。

AJAX那个词2005才出现,之前已经出现了大量的“AJAX”Web应用, 我认为当中最著名的就是Google Maps 它

【XML VS JSON】

但在javascript中使用XML有两个问题:

1. XML 要求有开始标签和结束标签, 如<name>liuxin</name> ,name出现了两次, 这在网络传输中其实是一种冗余浪费。

2. javascript 须要解析xml , 然后展示到应用流程中。

第二点尤其不爽, 所以就有人发展了两个叫JSON(JavaScript Object Notation) 的两个轻量级的数据格式。 JSON其实就是javascript 语法的子集, 就是javascript中的对象和数组。

对象在js中表示为“{}”括起来的内容,数据内部结构为 {key:value,key:value,…}的键值对的内部结构。

数组在js中是中括号“[]”括起来的内容,数据内部结构为 [“java”,”javascript”,”vb”,…]。

这两种内部结构虽然很简单, 但递归组合起来能表达任意的数据内部结构, 这就是简单的力量, 下面就是两个例子:

{

“programmers”:

[{

“firstName”: “Brett”,

“lastName”: “McLaughlin”,

“email”: “aaaa”

}, {

“firstName”: “Jason”,

“lastName”: “Hunter”,

“email”: “bbbb”

}],

“authors”:

[{

“firstName”: “Isaac”,

“lastName”: “Asimov”,

“genre”: “sciencefiction”

}, {

“firstName”: “Tad”,

“lastName”: “Williams”,

“genre”: “fantasy”

}],

“musicians”:

[{

“firstName”: “Eric”,

“lastName”: “Clapton”,

“instrument”: “guitar”

}, {

“firstName”: “Sergei”,

“lastName”: “Rachmaninoff”,

“instrument”: “piano”

}]

}

由于JSON本身就是Javascript 语法的一部分, javascipt代码可以直接把他们当成对象来处置, 根本不用解析XML了。

再加上JSON内部结构很紧凑, 很快就流行开来了, 现在AJAX 基本上都是在用JSON来传递数据了。

题外话:第一次看见AJAX那个词的时候, 作为球迷的我脑海里第一反应是荷兰的阿贾克斯足球俱乐部, 在90年代, 阿贾克斯足球号称青年近卫军, 一帮小孩在欧冠决赛中把如日中天的AC米兰都搞定了, 后来由于《博斯曼法案》的实施,球员可以自由转会, 阿贾克斯就没落了。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务