- 我是一个线程(修订版)
- 我是一个 Java class
- Javascript:一个屌丝的逆袭
- Java : 一个帝国的诞生
- JSP 一个装配工的没落
- TCP/IP 之 大明王朝邮差
- TCP/IP 之大明内阁
- TCP/IP 之蓟辽督师
- CPU 阿甘
- CPU 阿甘之烦恼
- CPU 阿甘:函数调用的秘密
- 我是一个网卡
- 我是一个路由器
- 我是一个进程
- 我是一块硬盘(上)
- 我是一块硬盘(下)
- 我是一个键盘
- 张大胖的 socket
- 张大胖学递归
- 学习面向对象的令狐冲
- 张大胖学数据库
- 数据库村的旺财和小强
- 小李的数据库之旅(上)
- 小李的数据库之旅(下)
- 漫画:什么是机器学习?
- 那些烦人的同步和互斥问题
- IE 为什么把火狐和 Chrome 给打伤了?
- 对浏览器村的第二次采访
- 节约标兵 IE 的自述
- EMail 诞生记
- Email 诞生记(下)
- Http 历险记(上)
- Http 历险记(下)-- Struts 的秘密
- 动物王国的面向对象
- 冯·诺伊曼计算机的诞生
- Http Server : 一个差生的逆袭
- 张大胖的加法器
- 从 1 加到 100:一道简单的数学题挑战下你的大脑
- 编程语言
- Javascript:一个屌丝的逆袭
- 计算机语言之战
- 我和编程语言的爱恨情仇(上)
- 我和编程语言的爱恨情仇(下)
- Android 为什么选择了 Java
- iOS 为什么选择了 Object-C?
- Basic : 一个老兵的自述
- Node.js : 我只需要一个店小二
- 命令式编程 vs 声明式编程
- 编译还是解释?
- 程序人生
- “架构师"小赵
- 师兄说
- 师姐说
- 小王的架构师之路
- 小李的版本管理系统
- 小超穿越记
- 小李的 Build 之路(上)
- 小李的 Build 之路(下)
- 张大胖改 Bug
- 我的编程之路--大学趣事
- 码农小王的一天
- 小李在外企
- 张大胖的需求估算
- 从厨师到码农
- 聊一聊那些神一样的程序员们(上)
- 聊一聊那些神一样的程序员们(中)
- 聊一聊那些神一样的程序员们(下)
- 谁是互联网之父?
- 一个价值百万的创业教训
- 让自己与众不同 - 提升工作的价值
- 看看你的“易燃性”
- 从无聊的工作中寻找价值
- 什么样的学生适合报考计算机?
- 谈谈程序员的职业方向(上)
- 谈谈程序员的职业方向(中)
- 谈谈程序员的职业方向(下)
- 谈谈培训班的作用
- 码农需要知道的“潜规则”
- 学习编程的加速度
- 码农在工作中的必备能力
- 码农和英语
- 老司机经验
- 假如时光能够倒流, 我会这么学习 Java
- 假如我是计算机系老师
- 学会编程, 而不是学会 Java
- 从增删改查中突围
- 抽象:程序员必备的能力
- 懒就一个字
- 编程的自学方法
- 小王买房记
- 从一道面试题谈谈一线码农应该具备的基本素质
- 想写框架的看过来
- 苹果手机变砖头以后
- 如何快速的学习一门技术?
- 唯一不变的是变化: 谈谈微信应用号
- 什么是企业应用?
- 勿以浮沙筑高台
- 为什么敏捷开发难于成功?
- localhost vs 127.0.0.1
- GitHub/Stackoverflow 找工作时有什么用?
- 动词 or 名词 :这是一个问题
- 如何选择入行语言
- 有时候,沉默是金
- 零 Bug 的代码是怎么炼成的?
- 浮点数为什么不精确?
- 文章错误大全
- Open Source--不要为了开源而开源
- 一不留神,代码就腐化了
- 先做个“键盘侠”, 再来写程序
- 不加断点调试的程序员是好程序员
- 码农必备技能:烂代码的处理之道(上)
- 码农必备技能:烂代码的处理之道(下)
- 学习数据结构有用吗?
- 从现在开始,丰富你的简历
- 那些永不过时的书,你看过几本吗?
- 学好编程必备的一个品质你知道吗?
- 你最爱的 Java
- 搞懂了这几点,你就学会了 Web 编程
- Spring 的本质系列(1) -- 依赖注入
- Spring 本质系列(2)-AOP
- 三层架构和 MVC 那点事儿
- Java 帝国之拨云见日识回调
- 小张的 Duck Typing
- JDBC 的诞生
- JDBC 后传
- 一个不安分的 JDBC 驱动
- Java 帝国之 Java bean (上)
- Java 帝国之 Java bean(下)
- Java 帝国之函数式编程
- Java 帝国之函数式编程(下)
- 关于 Java 初学者需要知道的 10 件事
- JUnit 你不知道的那些事儿
- 圣诞礼物:Java EE 的历史
- Java EE 读书指南
- 给小白的 Java EE 指南
- 给小白的 Java EE 指南(2)
- 给小白的 Java EE 生存指南(3) : XML
- 给小白的 Java EE 生存指南(4) : 一只叫 Tom 的猫
- 给小白的 Java EE 指南(5) : AJAX
- 给小白的 Java EE 生存指南(6) :Java 反射
- 闲聊
- "饿了么"初体验
- 来自大脑的控诉
- 一个高中生是怎么玩自媒体的?
- 尝试 分答
- 到底应不应该上培训班?
- 自学编程中遇到问题怎么办?
- 据说 99%的初级程序员看完后都不迷茫了
- 一行代码引发的“血案”
- 对一个死锁问题的思考
- 通过外包进入名企
- 请开往十年前的今天
- 为什么自学中最好有个师傅指导一下?
- 这个网站值得你花时间投入
- 为什么你无法坚持自学编程?
给小白的 Java EE 指南(5) : AJAX
本文是给小白的 Java EE 生存指南的第 5 篇, 讲一下前端工程师必备的 AJAX 的来龙去脉。
回到 2001 年, 当时的老刘还是小刘, 在计算所跟着老板和四川的一个公司合作,做一个类似于 OA(办公自动化) 的项目。
当时小刘刚毕业,写过一些 asp 的程序,在小刘的意识当中, 还是觉得只要你通过浏览器向服务器发出请求, 服务器处理以后, 需要 刷新整个网页 才能看到服务器处理的结果。
但是有一天我突然看到项目中大牛写的一个页面,这个页面上面是菜单,中间是一个树形结构,代表了一个公司的各个部门。
点击了菜单以后, 整个页面没有刷新, 神奇的是那个部门的树形机构竟然发生了变化! 也就是说整个页面没有刷新, 只是 页面的局部发生了刷新。
太不可思议了 ! 我赶紧打开那个普通的 asp 程序, 看看到底是什么情况。
原来点了菜单以后, 执行了一段 javascript, 其中创建了一个叫 XMLHttpRequest 的东西;
var xhr;
if (window.XMLHttpRequest){
xhr=new XMLHttpRequest (); //非 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){
//获取到服务器返回的 xml
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 它使用 XMLHttpRequest 异步调用服务器端来获取数据,并将数据应用在客户端,实现了无刷新的效果,极好的用户体验让 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 米兰都搞定了, 后来由于《博斯曼法案》的实施,球员可以自由转会, 阿贾克斯就没落了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论