- 浏览: 7936126 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
本文乃本人原作,发表在:http://publish.itpub.net/a2011/0828/1238/000001238694.shtml,
转载请注明:
在HTML5中,新增加了方便客户端存储的API,这将比传统的cookies的功能更加强大。尽管目前HTML5标准还在不断草拟和修改中,还没最终定稿,但越来越多的浏览器已经开始对其进行支持了。这意味者,在HTML5中,用户可以使用HTML5专门为存储方面提供的API: sessionStorage和localStoreage。在本文中将初步探讨这两种API的功能。
COOKIES的限制和缺陷
首先,让我们来回顾下cookies。Cookies的出现可谓大大推动了Web的发展,但它既有优点也有一定的缺陷。Cookies的优点在于,它可以允许我们在登陆网站时,记住我们输入的用户名和密码,这样在下一次登陆时就不需要再次输入了,达到自动登陆的效果。
另一方面,cookie的安全问题也日趋受到关注,比如cookie由于存储在客户端浏览器中,很容易受到黑客的窃取,安全机制并不是十分好。
另外一个问题是cookies存储数据的能力有限。目前在很多浏览器中规定每个cookie只能存储不超过4KB的限制,这估计是来自
1997年rfc2109中的规定(http://tools.ietf.org/html/rfc2109)。目前的浏览器大多允许用户创建30到50个cookies,所以一旦cookie的内容超过4KB,唯一的方法是重新创建。
此外,cookie的一个缺陷是每次的HTTP请求中都必须附带cookie,这将有可能增加网络的负载。
HTML5中的Web存储
在HTML5中新出现的Web 存储机制正好弥补了cookies的缺点,Web存储机制在以下两方面作了加强:
首先,对于web开发者来说,它提供了很容易使用的API接口,通过设置键值对即可使用,下文中会有例子谈到。
其次,在存储的容量方面,可以根据用户分配的磁盘配额进行存储,这就可以在每个用户域下存储不少于5-10MB的内容。这就意味者,用户可以不仅仅存储session了,还可以在客户端存储用户的设置偏好,本地化的数据,离线的数据,这对提高效率是很有帮助的。
而web存储更提供了使用Javascript编程的接口,这将使得开发者可以使用Javascript,在客户端做很多以前要在服务端才能完成的工作。目前,各主流浏览器已经开始对web存储的支持,如下图:
[img]http://image20.it168.com/201108_0x0/752/2256569e51b646c.jpg
[/img]
Session存储和本地化存储
在HTML5的web存储中,分为session存储和本地化存储两类。
sesssion存储只能针对单一的浏览器进程或单一页面的数据,换句话说,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储
而localStorage则是可以不受浏览器窗口进程的限制,只要使用localStorage保存了的数据,即使在新打开了浏览器窗口或者将浏览器关闭后,数据依然保存。网站在页面加载完毕后可以通过Javascript来获取这些数据。
要注意的是,以上两类web存储机制,在不同类型的浏览器之中还是不能互相访问的,比如在Firefox中用localstorage存储的时候,是不能在IE中去访问读取的。
何时去使用它们
使用localStorage存储机制的场合是十分多的,比如你的应用中是一个在线的任务应用,需要用户在线填写大量的表单和数据,而且在指定的时间间隔后,才把这些数据发送到服务端,又或者是在线购物时,用户的购物车(这时可以在购物车中保存更多的数据了,等用户下次再登陆时,购物车中的数据依然是存在的)。又或者开发的离线应用,用户在离线状态下把数据填写好,等在线的时候,再一次性把数据提交。
除此之外,更有研究表明,可以使用localStorage去存储图片等二进制数据(图片需要经过Base64编码),其效率大为提高,详见这篇文章。
那么什么时候需要使用sessionStorage呢?在有些情况下,如果你需要当浏览器窗口关闭或者不需要数据在当用户新打开一个窗口依然能被访问的情况下,可以使用sessionStorage。比如在运行某个游戏的两个实例或者在运行多个单元测试时,不希望数据之间有冲突,这时可以使用sessionStorage。
使用WebStorage的API
下面我们讲解如何使用WebStorage的API。目前WebStorage的API有如下这些:
• length – 获得当前webstorage中的数目。
• key(n) – 返回webstorage中的第N个存储条目
• getItem(key) –返回指定key的存储内容,如果不存在则返回null。注意,返回的类型是String字符串类型。
• setItem(key, value) –设置指定key的内容的值为value
• removeItem(key) 根据指定的KEY,删除键值为key的内容。
• clear – 清空webstorate的内容。
可以看到,webstorage API的操作机制实际上是对键值对进行的操作。下面是一些相关的例子:
localStorage.setItem("key", "value);
var val = localStorage.getItem("key");
当然也可以直接使用localStorage的key方法,而不使用setItem和getItem方法,如下:
localStorage.key = "value";
var val = localStorage.key;
在有的浏览器中,甚至支持使用如下的方式进行设置:
localStorage["key"] = "value";
var val = localStorage["key"];
要注意的是,sessionStorage和localStorage的使用方法是一样的,所以例子这里就不再详细给出。
WebStorage的相关事件
当我们使用localstorage存储数据时,在其他浏览器窗口或者浏览器的选项卡中,会发生storage事件,如果用户打开不同的窗口(或者浏览器选项卡)访问同一网址时,在不同的窗口或选项卡之间,会进行数据同步,如下图:
[img]http://image20.it168.com/201108_0x0/752/8e91a5cf0391e8c4.jpg
[/img]
当用户修改了localstorage中的数据内容时,如将新的数据值赋值给原来的KEY时,会发生storage事件,事件的响应代码如下:
window.addEventListener('storage', function(event) {
console.log('The value for ' + event.key + ' was changed from' + event.oldValue + ' to ' + event.newValue);
}, false);
其中,event.key为原来旧的key的名称,event.oldValue为旧的key所对应的值,event.newValue为新的key的值。
storage的事件机制,在Firefox 5, Safari 5, Chrome 12, Opera 10.5 和 IE9中将得到支持。
一个localstorage的例子
最后,我们来看一个localstorage的小例子,例子运行后,当每次加载刷新页面时,会显示当前已刷新的次数给用户,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function pageLoadCounter() {
if (!localStorage.getItem('loadCounter')) {
localStorage.setItem('loadCounter', 0);
}
localStorage.setItem('loadCounter', parseInt(localStorage.getItem('loadCounter')) + 1);
document.getElementById('counter').innerHTML = localStorage.getItem('loadCounter');
}
</script>
</head>
<body onload="pageLoadCounter()">
<form id="form1">
You have viewed this page <span id="counter"></span> times.
<input type="button" onclick="localStorage.clear();" value="Clear Storage" />
</form>
</body>
</html>
在上面的代码中在pageLoadCounter()事件中,首先判断localstorage中是否有localCounter的值存在,如果没的话,则初始化为0,然后每当刷新页面时,使用setItem方法重新设置了loadCounter的值,令其加1,最后再显示在页面中。
WebStorage目前存在的问题
目前,WebStorage的机制实现方面,其安全性依然跟cookies一样,还是有令人担忧的地方,所以建议敏感数据是不要直接通过web storage机制进行保存。
小结
在本文中, 对HTML5的新增的webstorage存储机制进行了初步的简单介绍,介绍了sessionStorage及localStorage的特点和应用场合,以及它们的使用的API和事件,分析了其中的不足之处。相信随着HTML5标准的逐渐完善,各浏览厂商的不断努力下,Webstorage机制在不久的将来将更加完善。
转载请注明:
在HTML5中,新增加了方便客户端存储的API,这将比传统的cookies的功能更加强大。尽管目前HTML5标准还在不断草拟和修改中,还没最终定稿,但越来越多的浏览器已经开始对其进行支持了。这意味者,在HTML5中,用户可以使用HTML5专门为存储方面提供的API: sessionStorage和localStoreage。在本文中将初步探讨这两种API的功能。
COOKIES的限制和缺陷
首先,让我们来回顾下cookies。Cookies的出现可谓大大推动了Web的发展,但它既有优点也有一定的缺陷。Cookies的优点在于,它可以允许我们在登陆网站时,记住我们输入的用户名和密码,这样在下一次登陆时就不需要再次输入了,达到自动登陆的效果。
另一方面,cookie的安全问题也日趋受到关注,比如cookie由于存储在客户端浏览器中,很容易受到黑客的窃取,安全机制并不是十分好。
另外一个问题是cookies存储数据的能力有限。目前在很多浏览器中规定每个cookie只能存储不超过4KB的限制,这估计是来自
1997年rfc2109中的规定(http://tools.ietf.org/html/rfc2109)。目前的浏览器大多允许用户创建30到50个cookies,所以一旦cookie的内容超过4KB,唯一的方法是重新创建。
此外,cookie的一个缺陷是每次的HTTP请求中都必须附带cookie,这将有可能增加网络的负载。
HTML5中的Web存储
在HTML5中新出现的Web 存储机制正好弥补了cookies的缺点,Web存储机制在以下两方面作了加强:
首先,对于web开发者来说,它提供了很容易使用的API接口,通过设置键值对即可使用,下文中会有例子谈到。
其次,在存储的容量方面,可以根据用户分配的磁盘配额进行存储,这就可以在每个用户域下存储不少于5-10MB的内容。这就意味者,用户可以不仅仅存储session了,还可以在客户端存储用户的设置偏好,本地化的数据,离线的数据,这对提高效率是很有帮助的。
而web存储更提供了使用Javascript编程的接口,这将使得开发者可以使用Javascript,在客户端做很多以前要在服务端才能完成的工作。目前,各主流浏览器已经开始对web存储的支持,如下图:
[img]http://image20.it168.com/201108_0x0/752/2256569e51b646c.jpg
[/img]
Session存储和本地化存储
在HTML5的web存储中,分为session存储和本地化存储两类。
sesssion存储只能针对单一的浏览器进程或单一页面的数据,换句话说,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储
而localStorage则是可以不受浏览器窗口进程的限制,只要使用localStorage保存了的数据,即使在新打开了浏览器窗口或者将浏览器关闭后,数据依然保存。网站在页面加载完毕后可以通过Javascript来获取这些数据。
要注意的是,以上两类web存储机制,在不同类型的浏览器之中还是不能互相访问的,比如在Firefox中用localstorage存储的时候,是不能在IE中去访问读取的。
何时去使用它们
使用localStorage存储机制的场合是十分多的,比如你的应用中是一个在线的任务应用,需要用户在线填写大量的表单和数据,而且在指定的时间间隔后,才把这些数据发送到服务端,又或者是在线购物时,用户的购物车(这时可以在购物车中保存更多的数据了,等用户下次再登陆时,购物车中的数据依然是存在的)。又或者开发的离线应用,用户在离线状态下把数据填写好,等在线的时候,再一次性把数据提交。
除此之外,更有研究表明,可以使用localStorage去存储图片等二进制数据(图片需要经过Base64编码),其效率大为提高,详见这篇文章。
那么什么时候需要使用sessionStorage呢?在有些情况下,如果你需要当浏览器窗口关闭或者不需要数据在当用户新打开一个窗口依然能被访问的情况下,可以使用sessionStorage。比如在运行某个游戏的两个实例或者在运行多个单元测试时,不希望数据之间有冲突,这时可以使用sessionStorage。
使用WebStorage的API
下面我们讲解如何使用WebStorage的API。目前WebStorage的API有如下这些:
• length – 获得当前webstorage中的数目。
• key(n) – 返回webstorage中的第N个存储条目
• getItem(key) –返回指定key的存储内容,如果不存在则返回null。注意,返回的类型是String字符串类型。
• setItem(key, value) –设置指定key的内容的值为value
• removeItem(key) 根据指定的KEY,删除键值为key的内容。
• clear – 清空webstorate的内容。
可以看到,webstorage API的操作机制实际上是对键值对进行的操作。下面是一些相关的例子:
localStorage.setItem("key", "value);
var val = localStorage.getItem("key");
当然也可以直接使用localStorage的key方法,而不使用setItem和getItem方法,如下:
localStorage.key = "value";
var val = localStorage.key;
在有的浏览器中,甚至支持使用如下的方式进行设置:
localStorage["key"] = "value";
var val = localStorage["key"];
要注意的是,sessionStorage和localStorage的使用方法是一样的,所以例子这里就不再详细给出。
WebStorage的相关事件
当我们使用localstorage存储数据时,在其他浏览器窗口或者浏览器的选项卡中,会发生storage事件,如果用户打开不同的窗口(或者浏览器选项卡)访问同一网址时,在不同的窗口或选项卡之间,会进行数据同步,如下图:
[img]http://image20.it168.com/201108_0x0/752/8e91a5cf0391e8c4.jpg
[/img]
当用户修改了localstorage中的数据内容时,如将新的数据值赋值给原来的KEY时,会发生storage事件,事件的响应代码如下:
window.addEventListener('storage', function(event) {
console.log('The value for ' + event.key + ' was changed from' + event.oldValue + ' to ' + event.newValue);
}, false);
其中,event.key为原来旧的key的名称,event.oldValue为旧的key所对应的值,event.newValue为新的key的值。
storage的事件机制,在Firefox 5, Safari 5, Chrome 12, Opera 10.5 和 IE9中将得到支持。
一个localstorage的例子
最后,我们来看一个localstorage的小例子,例子运行后,当每次加载刷新页面时,会显示当前已刷新的次数给用户,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function pageLoadCounter() {
if (!localStorage.getItem('loadCounter')) {
localStorage.setItem('loadCounter', 0);
}
localStorage.setItem('loadCounter', parseInt(localStorage.getItem('loadCounter')) + 1);
document.getElementById('counter').innerHTML = localStorage.getItem('loadCounter');
}
</script>
</head>
<body onload="pageLoadCounter()">
<form id="form1">
You have viewed this page <span id="counter"></span> times.
<input type="button" onclick="localStorage.clear();" value="Clear Storage" />
</form>
</body>
</html>
在上面的代码中在pageLoadCounter()事件中,首先判断localstorage中是否有localCounter的值存在,如果没的话,则初始化为0,然后每当刷新页面时,使用setItem方法重新设置了loadCounter的值,令其加1,最后再显示在页面中。
WebStorage目前存在的问题
目前,WebStorage的机制实现方面,其安全性依然跟cookies一样,还是有令人担忧的地方,所以建议敏感数据是不要直接通过web storage机制进行保存。
小结
在本文中, 对HTML5的新增的webstorage存储机制进行了初步的简单介绍,介绍了sessionStorage及localStorage的特点和应用场合,以及它们的使用的API和事件,分析了其中的不足之处。相信随着HTML5标准的逐渐完善,各浏览厂商的不断努力下,Webstorage机制在不久的将来将更加完善。
发表评论
-
微信开发工具中时间问题的小坑
2018-02-07 19:07 816刚开始用微信小程序开发工具,每次运行任何应用,都报这个错误: ... -
三篇不错的介绍CSS GRID的文章
2017-12-06 09:08 533三篇不错的介绍CSS GRID的文章: http://www. ... -
双因素认证(2FA)教程
2017-11-03 09:16 1570http://www.ruanyifeng.com/blog/ ... -
es6 中的export
2017-08-20 08:00 814https://juejin.im/post/5998625f ... -
markdown中的空格
2017-08-20 07:53 1694即使手动输入空格, 也是很不推荐的方法。我推荐全角空格,切换 ... -
(转)讲真,别再使用JWT了
2017-08-17 23:21 1007不错的好文: http://insights.thoughtw ... -
(转)手把手教你WebStorm+chrome实现时时调试刷新
2017-08-15 10:50 3019参考: http://jingyan.baidu.com/ar ... -
IntelliJ Idea 2017 免费激活方法
2017-08-15 09:38 93121. 到网站 http://idea.lanyus.com/ ... -
前端框架这么多,该何去何从?
2017-08-04 07:17 645http://insights.thoughtworkers. ... -
记录一个HTML 5画拓扑图的商业公司
2017-07-18 19:56 844http://qunee.com/ DEMO:http:// ... -
vue 2例子学习收集
2017-07-16 11:46 9981 vue2.0手撸闲鱼App https://githu ... -
(收藏)虚拟DOM内部是如何工作的
2017-07-13 22:08 588虚拟DOM内部是如何工作的 https://segmentfa ... -
最近看到的几篇精彩JAVASCRIPT博客文章推荐
2017-07-11 07:10 562【深度长文】JavaScript数组所有API全解密 http ... -
jsonp 跨域原理:深入浅出 jsonp
2017-07-10 19:55 1427https://lzw.me/a/jsonp.html jso ... -
(转)深度长文-JavaScript数组所有API全解密
2017-07-08 19:59 817深度长文-JavaScript数组所有API全解密 http: ... -
(收藏)网页导出PDF的方案
2017-07-06 07:13 960(收藏)网页导出PDF的方案 https://yiqiwuli ... -
Chromium 新的弹窗机制以及 HTML 的 <dialog> 元素
2017-06-28 12:37 1144https://juejin.im/post/59525195 ... -
国内一个不错的大屏UI设计厂家
2017-06-03 19:43 3156http://www.lanlanwork.com/dp.ph ... -
canvas仿芝麻信用分仪表盘
2017-05-28 20:21 1584canvas仿芝麻信用分仪表盘 https://segment ... -
(转)CSS 变量教程
2017-05-10 21:12 573http://www.ruanyifeng.com/blog/ ...
相关推荐
HTML5 Canvas API 是一项强大的技术,它允许在网页中直接绘制图形、图表、图像以及动画。与传统的图像加CSS的方法相比,Canvas API 提供了一种更为灵活和强大的渲染系统,可以动态生成内容,并且能够很好地处理用户...
在HBuilder中,开发者可以享受到HTML5+ API的语法提示,从而提高开发效率。此外,HBuilder还集成了真机运行环境,使得开发者可以方便快捷地在真实设备上测试和调试应用。 在开发HTML5Plus移动App时,一些示例应用和...
课程设计的目的是弥补传统实验中因分时分批进行而导致的整体性缺失,让学生能够系统地理解并开发一个完整的Web应用程序。 **一、课程设计目的** 课程设计的主要目标是让学生: 1. 明确Web开发的重要性与复杂性。 2....
在这个"Vue.js前端开发实战-自测卷和课后习题答案"的压缩包中,包含了与Vue.js实战相关的测试题目及其解答,对于学习者来说是宝贵的资源。 首先,Vue.js的核心概念包括: 1. **数据绑定**:Vue.js实现了双向数据...
HTML5在移动端的应用已经变得越来越广泛,特别是在手机网站和H5应用开发中,它提供了许多增强用户体验的功能。其中,拖放(Drag and Drop)功能是HTML5的一项重要特性,允许用户通过手势操作来移动元素,如图片和...
H5+ API是一套专为HTML5开发者打造的原生接口集,它弥补了Web App在硬件访问和系统功能上的不足。通过H5+ API,开发者可以调用设备的摄像头、GPS、蓝牙、存储等硬件功能,还可以实现推送通知、分享、支付等功能。H5+...
在移动应用开发中,HTML5与CSS3、JavaScript共同构建了前端开发的三大支柱。CSS3提供了丰富的样式控制,如动画、过渡、多列布局、媒体查询等,让移动应用的界面设计更加灵活多样。JavaScript作为动态脚本语言,通过...
在移动互联Web前端开发项目1和2中,我们聚焦于为移动电子商务构建高效、响应式且用户友好的界面。Web前端开发是构建互联网应用程序的重要组成部分,它涉及到网站的视觉呈现、交互性和用户体验。在这个领域,...
Web应用程序(Web App)与HTML5的出现对前端开发带来了革命性的变化,它们共同推动了互联网体验的新纪元。HTML5作为下一代超文本标记语言,提供了丰富的功能和接口,为Web App的构建提供了坚实的基础。在本文中,...
HTML5 Canvas是现代网页开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,提供了丰富的API来创建复杂的2D图像。"HTML5 Canvas实现web画图之自由画笔"这一主题,主要关注的是如何利用Canvas API创建一个...
[C#开发实战1200例.(第Ⅰ卷)].王小科.王军.扫描版 学习C#的经典书籍 只可惜是扫描版的 但是足够的例子 足以弥补这个缺憾 赞 赞 赞 ~~! 由于上传附件大小限制 将文件压缩为5个压缩包 全部下载 自行解压即可 (不要...
然而,随着HTML5的进步,如CSS3的动画效果、离线存储等功能,使得Web应用也能提供接近原生的用户体验。对于开发者而言,要确保在各个平台上提供一致的用户体验,无论是原生APP还是HTML5,都需要进行大量的测试和优化...
在HTML5中,引入了许多创新的元素和API,如离线存储(离线Web应用程序)、拖放功能、媒体元素(audio和video)、 canvas画布、svg矢量图、geolocation定位、web workers和web sockets等。然而,不是所有浏览器都完全...
通过学习这些PPT,读者不仅可以了解HTML5的基本语法,还能掌握如何在实际项目中有效利用HTML5的新特性,提升网页设计与开发技能。 PPT的学习通常包括概念讲解、实例解析和实战演练三部分。概念讲解会帮助你理解...
文章还提到了Java在Web开发中的其他重要技术,比如JavaBean组件技术的引进,它弥补了JSP技术的不足,提高了Web开发的灵活性和效率。这些技术的应用和发展,使得Java Web开发在性能和功能性上不断进步,成为计算机...
“Dreamweaver CSS3的HTML5拓展包”就是为了弥补这一短板,使Dreamweaver能够更好地适应HTML5的开发需求。安装这个拓展包后,用户可以在Dreamweaver中直接编写和预览HTML5代码,享受无缝的集成开发环境。拓展包中...
1. HTML5:HTML5是HTML的最新版本,引入了许多新特性,如离线存储(离线Web应用)、媒体元素(audio和video)、拖放功能、 canvas画布、svg矢量图、geolocation定位、web workers和web sockets等,极大地增强了网页...
- HTML5的出现是为了弥补HTML4的不足,并且为了满足不断发展的Web需求。它不仅仅是一个新的文档类型,更是一种新的思维方式和技术栈的一部分。 - HTML5的设计理念强调向前兼容,即旧版本的浏览器也能解析大部分HTML5...
Torque游戏实战开发I是一本针对初学者的实用游戏开发教程,主要介绍了Torque游戏引擎的使用。Torque引擎由GarageGames公司开发,因其低价位和功能全面而受到游戏开发爱好者的青睐。本书的目的是为了弥补国内关于...