1、 目 录第1章 基础知识11.1 Internet简介21.1.1 起源21.1.2 Internet的含义21.1.3 IP地址31.1.4 域名31.2 万维网51.2.1 起源51.2.2 Web还是Internet51.3 Web浏览器61.4 Web服务器71.4.1 Web服务器操作71.4.2 服务器的一般特性81.4.3 Apache91.4.4 IIS91.5 统一资源定位符91.5.1 URL的格式101.5.2 URL路径101.6 MIME111.6.1 类型说明111.6.2 实验性文档类型121.7 超文本传输协议121.7.1 请求阶段131.7.2 响应阶段14
2、1.8 安全性151.9 Web编程工具箱171.9.1 XHTML概述171.9.2 创建XHTML文档的工具181.9.3 插件和过滤器191.9.4 XML概述191.9.5 JavaScript概述201.9.6 Flash概述201.9.7 PHP概述211.9.8 Ajax概述211.9.9 Servlet、JavaServer Pages和JavaServer Faces概述221.9.10 ASP.NET概述221.9.11 Ruby概述231.9.12 Rails概述231.10 本章小结241.11 复习题251.12 练习题26第2章 XHTML简介292.1 HTML和
3、XHTML的起源和演变292.1.1 HTML和XHTML的版本302.1.2 HTML与XHTML312.2 基本语法312.3 XHTML文档的标准结构322.4 基本的文本标记332.4.1 段落332.4.2 换行352.4.3 保留空白字符352.4.4 标题362.4.5 文本块引用372.4.6 字体样式与大小382.4.7 字符实体392.4.8 水平线392.4.9 meta元素402.5 图片402.5.1 图片格式402.5.2 标签412.5.3 XHTML文档的验证432.6 超链接442.6.1 链接452.6.2 位于文档内部的目标472.6.3 使用链接472.
4、7 列表472.7.1 无序列表482.7.2 有序列表482.7.3 定义列表512.8 表格522.8.1 基本的表格标签522.8.2 属性rowspan与colspan542.8.3 属性align与valign562.8.4 属性cellpadding与cellspacing572.8.5 表格分块592.9 表单592.9.1 标签592.9.2 标签602.9.3 标签632.9.4 标签652.9.5 动作按钮662.9.6 一个完整的表单示例662.10 HTML与XHTML之间的语法差异692.11 本章小结712.12 复习题722.13 练习题73第3章 层叠样式表75
5、3.1 简介753.2 样式表的层次763.3 样式说明格式773.4 选择器格式783.4.1 简单的选择器格式783.4.2 类选择器793.4.3 通用选择器793.4.4 id选择器803.4.5 通配选择器803.4.6 伪类803.5 属性值的格式813.6 字体属性823.6.1 字体族833.6.2 字体大小833.6.3 字体变体843.6.4 字体样式843.6.5 字体粗细843.6.6 简写字体属性843.6.7 文本修饰873.7 列表属性883.8 颜色913.8.1 颜色组913.8.2 颜色属性923.9 文本对齐933.10 盒模型953.10.1 边框953
6、.10.2 内边距和外边距973.11 背景图片993.12 标签和标签1013.13 冲突解决方案1023.14 本章小结1033.15 复习题1043.16 练习题105第4章 JavaScript基础知识1074.1 JavaScript概述1074.1.1 起源1074.1.2 JavaScript与Java1084.1.3 JavaScript的用途1084.1.4 浏览器和XHTML/JavaScript文档1094.2 面向对象和JavaScript1104.3 一般的语法特征1114.4 基本数据类型、操作和表达式1134.4.1 基本数据类型1134.4.2 数值型和字符串字
7、面量1144.4.3 其他基本数据类型1144.4.4 声明变量1154.4.5 数值运算符1154.4.6 Math对象1164.4.7 Number对象1174.4.8 字符串连接运算符1174.4.9 隐式类型转换1184.4.10 显式类型转换1184.4.11 String属性和方法1194.4.12 typeof运算符1204.4.13 赋值语句1204.4.14 Date对象1214.5 屏幕输出和键盘输入1214.6 控制语句1244.6.1 控制表达式1254.6.2 选择语句1264.6.3 switch语句1274.6.4 循环语句1294.7 创建和修改对象1314.8
8、 数组1324.8.1 创建Array对象1324.8.2 Array对象的特征1334.8.3 Array方法1344.9 函数1364.9.1 基础知识1364.9.2 局部变量1374.9.3 参数1384.9.4 复习sort方法1404.10 示例一1404.11 构造函数1424.12 利用正则表达式进行模式匹配1424.12.1 字符和字符类模式1434.12.2 锚1454.12.3 模式修饰符1454.12.4 String对象中的其他模式匹配方法1464.13 示例二1464.14 脚本中的错误1484.15 本章小结1494.16 复习题1514.17 练习题152第5章
9、 JavaScript与XHTML文档1555.1 JavaScript的执行环境1565.2 文档对象模型1565.3 在JavaScript中访问元素1595.4 事件与事件处理1625.4.1 事件处理的基本概念1625.4.2 事件、属性和标签1635.5 处理主体元素的事件1655.6 处理按钮元素的事件1665.7 处理文本框和密码框元素的事件1715.7.1 focus事件1715.7.2 验证表单输入1735.8 DOM 2事件模型1785.8.1 事件传播1795.8.2 事件处理程序的注册1805.8.3 DOM 2事件模型示例1815.9 navigator对象1835.
10、10 DOM树的遍历和修改1855.10.1 DOM树的遍历1855.10.2 DOM树的修改1855.11 本章小结1855.12 复习题1865.13 练习题187第6章 利用JavaScript开发动态文档1896.1 简介1896.2 元素定位1906.2.1 绝对定位1906.2.2 相对定位1936.2.3 静态定位1946.3 移动元素1946.4 元素可见性1976.5 修改颜色和字体1986.5.1 修改颜色1986.5.2 修改字体1996.6 动态内容2016.7 堆叠元素2036.8 定位鼠标光标2066.9 响应鼠标单击2086.10 缓慢移动元素2096.11 拖放
11、元素2126.12 本章小结2166.13 复习题2166.14 练习题217第7章 XML简介2197.1 简介2197.2 XML语法2217.3 XML文档结构2237.4 文档类型定义2257.4.1 元素声明2257.4.2 属性声明2277.4.3 实体声明2287.4.4 一个DTD的示例2287.4.5 内部和外部DTD2297.5 名称空间2307.6 XML架构2327.6.1 架构的基本原理2327.6.2 架构的定义2337.6.3 定义架构实例2347.6.4 数据类型概述2357.6.5 简单类型2357.6.6 复杂类型2367.6.7 架构实例的验证2387.7
12、 显示没有格式化的XML文档2397.8 通过CSS显示XML文档2407.9 XSLT样式表2417.9.1 XSLT概述2427.9.2 用于表现的XSL转换2437.10 XML处理器2497.10.1 XML处理器的用途2497.10.2 SAX方式2497.10.3 DOM方式2507.11 Web服务2507.12 本章小结2517.13 复习题2537.14 练习题254第8章 Flash简介2578.1 Flash的起源与用途2578.2 初步了解Flash创作环境2588.3 绘图工具2628.3.1 预定义图形2628.3.2 线条和徒手画2678.3.3 文本2678.3
13、.4 元件和库2688.4 静态图形2698.5 动画和声音2748.5.1 动画简介2748.5.2 移动图形2748.5.3 更多动画2768.5.4 形状动画2788.5.5 声音2808.6 用户交互2828.6.1 动作2838.6.2 Flash组件2838.6.3 示例2838.7 小结2868.8 复习题2878.9 练习题288第9章 PHP简介2899.1 PHP的起源和用途2899.2 PHP概述2909.3 基本语法特征2919.4 基本数据类型、操作和表达式2919.4.1 变量2929.4.2 整数类型2929.4.3 双精度类型2929.4.4 字符串类型2929
14、.4.5 布尔类型2939.4.6 算术运算符和表达式2939.4.7 字符串操作2949.4.8 标量类型转换2959.4.9 赋值运算符2969.5 输出2969.6 控制语句2989.6.1 关系运算符2989.6.2 布尔运算符2989.6.3 选择语句2989.6.4 循环语句2999.6.5 示例2999.7 数组3019.7.1 创建数组3019.7.2 访问数组元素3029.7.3 数组处理函数3029.7.4 数组元素的按序访问3049.7.5 数组排序3069.8 函数3079.8.1 函数的基本特征3079.8.2 参数3089.8.3 变量的作用域3099.8.4 变量
15、的生命周期3109.9 模式匹配3119.10 表单处理3139.11 文件3189.11.1 打开和关闭文件3189.11.2 读取文件3199.11.3 文件写入操作3209.11.4 文件加锁3209.12 cookie3209.12.1 cookie简介3219.12.2 PHP对cookie的支持3229.13 会话跟踪3229.14 本章小结3239.15 复习题3249.16 练习题325第10章 Ajax简介32910.1 Ajax概述32910.1.1 Ajax的历史32910.1.2 Ajax技术33010.1.3 实现Ajax33110.2 Ajax基础知识33210.2
16、.1 应用程序33210.2.2 表单文档33210.2.3 请求阶段33410.2.4 响应文档33610.2.5 接收器阶段33710.2.6 跨浏览器支持33910.3 返回文档的格式34010.3.1 HTML和XHTML34010.3.2 XML34110.3.3 JavaScript Object Notation34210.4 Ajax工具包34310.4.1 Dojo34410.4.2 示例34610.4.3 Prototype34810.5 安全性与Ajax34910.6 本章小结35010.7 复习题35110.8 练习题351第11章 Java Web软件35311.1
17、servlet简介35311.1.1 概述35311.1.2 详解35411.1.3 servlet容器35711.2 NetBeans集成开发环境35811.3 调查表示例36511.4 在客户端存储信息37211.4.1 cookie37211.4.2 servlet对cookie的支持37311.4.3 示例37411.5 JSP38011.5.1 开发JSP的动机38011.5.2 JSP文档38011.5.3 表达式语言38311.5.4 JSTL中用于控制的动作元素38511.6 JavaBean38911.7 模型-视图-控制器应用体系结构39211.8 JSF39311.8.1
18、 内核标签库和HTML标签库39411.8.2 JSF事件处理39511.8.3 示例应用程序39511.9 本章小结40011.10 复习题40111.11 练习题402第12章 ASP.NET简介40512.1 .NET Framework概述40512.1.1 背景40612.1.2 .NET语言40612.1.3 公共语言运行库40612.1.4 公共语言基础结构40712.2 C#简介40812.2.1 起源40812.2.2 基本数据类型和表达式40812.2.3 数据结构40912.2.4 控制语句40912.2.5 类、方法和结构41012.2.6 异常处理41112.2.7
19、输出41112.3 ASP.NET简介41212.3.1 基本知识41212.3.2 ASP.NET文档41312.3.3 代码隐藏文件41512.4 ASP.NET控件41712.4.1 Web控件41712.4.2 简单的ASP.NET文档的生命周期41812.4.3 Visual Studio42212.4.4 ASP.NET事件42712.4.5 用代码创建控件元素42812.4.6 控件的响应输出42912.4.7 列表控件42912.4.8 验证控件43312.4.9 主文档43912.5 ASP.NET AJAX44212.6 Web服务44712.6.1 构建Web服务4471
20、2.6.2 使用Web服务45012.6.3 传播Web服务45412.7 本章小结45412.8 复习题45512.9 练习题457第13章 基于Web的数据库访问45913.1 关系数据库45913.2 结构化查询语言简介46213.2.1 SELECT命令46213.2.2 连接46213.2.3 INSERT命令46413.2.4 UPDATE命令46413.2.5 DELETE命令46413.2.6 DROP命令46513.2.7 CREATE TABLE命令46513.3 数据库访问的体系结构46613.3.1 客户端-服务器体系结构46613.3.2 Microsoft ODBC
21、体系结构46613.3.3 PHP和数据库访问46713.3.4 Java JDBC体系结构46713.4 MySQL数据库系统46813.5 使用PHP和MySQL实现数据库访问47013.5.1 特殊字符的潜在问题47013.5.2 连接MySQL并选择数据库47113.5.3 请求MySQL操作47113.5.4 PHP-MySQL示例47213.6 使用JDBC和MySQL实现数据库访问47713.6.1 JDBC和MySQL47713.6.2 元数据48013.6.3 示例48113.7 使用ASP.NET和MySQL实现数据库访问48413.7.1 MySQL和ADO.NET484
22、13.7.2 数据绑定48513.7.3 连接字符串48613.8 本章小结49013.9 复习题49113.10 练习题492第14章 Ruby简介49314.1 Ruby的起源与用途49314.2 标量类型及其操作49414.2.1 数值与字符串字面量49414.2.2 变量和赋值语句49514.2.3 数值运算符49614.2.4 String的方法49714.3 简单的输入输出50114.3.1 屏幕输出50114.3.2 键盘输入50114.4 控制语句50314.4.1 控制表达式50314.4.2 选择语句和循环语句50414.5 数组基础50714.5.1 for-in语句50
23、814.5.2 数组和列表的内置方法50914.5.3 示例51114.6 散列51214.7 方法51414.7.1 基础知识51414.7.2 局部变量51514.7.3 参数51514.8 类51714.8.1 类的基础知识51714.8.2 访问控制51914.8.3 继承52114.9 块和迭代器52214.10 模式匹配52414.10.1 模式匹配的基础知识52414.10.2 存储匹配52614.10.3 替换52614.11 本章小结52714.12 复习题52714.13 练习题528第15章 Rails简介52915.1 Rails概述52915.2 文档请求53115.
24、2.1 静态文档Hello World53115.2.2 动态文档53515.3 使用数据库的Rails应用程序53715.3.1 构建基本应用程序53815.3.2 完成应用程序54615.3.3 修改数据库55015.3.4 布局和样式表55215.4 采用Ajax技术的Rails55315.4.1 初始的表单文档55415.4.2 触发Ajax55615.4.3 控制器55815.5 本章小结56015.6 复习题56115.7 练习题561附录A Java简介563附录B 颜色名及其十六进制值577附录C Java Applet581基 础 知 识随着万维网的出现,工业化国家的绝大部分
25、居民和非工业化国家的一部分居民的生活已经发生了永久性的变化。虽然万维网也带来了一些负面影响 例如,访问色情信息和参与赌博变得更容易了,有害思想的传播也有了更便捷的通道 但是,万维网带来的巨大影响总体上是正面的。很多人都在日常生活中使用Internet和万维网,包括通过E-mail和社交网站来联系亲朋好友和商业伙伴,在任何地方都几乎可以购买任何商品,搜索无数的各种各样的信息,这些信息包括从电影院的放映时间表到几乎全球所有城市宾馆的住宿价格,甚至还包含一些偏远少数民族的历史文化特色。创建用于提供所有这些信息的软件和数据需要用到几种不同的技术,如标记语言和元标记语言,以及利用多种不同编程语言的编程技
26、术,其中有一些是专门针对万维网的,另一些则是专为通用计算而设计的。为了能够获取构建万维网站点所需的知识和技术,本书提供了必要的背景和基础知识,使构建的万维网站点不仅可以呈现用户所需的信息,还能发布商业广告。本章是本书其余章节的基础。首先介绍Internet和万维网的一部分发展历史。接下来将讨论Web浏览器和服务器的作用和一些特征。然后将描述统一资源定位符(Uniform Resource Locator,URL),URL为Web中的可用资源指定了地址。接下来将介绍多用途网际邮件扩充协议(Multipurpose Internet Mail Extension,MIME),它定义具有不同类型内容
27、的文件的文件类型和文件扩展名。此后将讨论超文本传输协议(Hypertext Transfer Protocol,HTTP),它提供了浏览器和Web服务器之间连接的通信接口。本章最后将简单介绍Web程序员常用的一些工具,包括XHTML、XML、JavaScript、Flash、Servlet、JSP、JSF、ASP.NET、PHP、Ruby、Rails以及Ajax。所有这些工具都将在本书的后续章节中详细介绍(第2章和第3章将讨论XHTML;第4章、第5章和第6章将讨论JavaScript;第7章将讨论XML;第8章将讨论Flash;第9章将讨论PHP;第10章将讨论Ajax;第11章将讨论Ser
28、vlet、JSP和JSF;第14、15章将讨论Ruby;第15章将讨论Rails)。1.1 Internet简介本书讨论的所有主题都与Internet有关。因此,首先简单讨论一下Internet本身。1.1.1 起源20世纪60年代,美国国防部(Department of Defense,DoD)开始对开发一些新的大规模计算机网络产生兴趣。开发这样的一个网络,其目的在于为从事与国防相关合同项目的研究人员提供通信、程序共享和远程计算机访问等功能。这种网络的一个基本要求是必须足够可靠,即使当其中的某些节点由于破坏、战争和其他正常原因而失去作用后,整个网络还可以继续运行。DoD的高级研究计划局(Ad
29、vanced Research Projects Agency,ARPA)1 ARPA在1972年更名为美国国防高级研究计划局(Defense Advanced Research Projects Agency,DARPA)。提供经费支持了第一个这种网络的构建,这个网络将ARPA支持的大约12个实验室和大学连接在一起。该网络中的第一个节点是1969年在UCLA建立的。由于这个网络是由ARPA提供经费支持的,因此被命名为ARPAnet。尽管最初的设计目标很多,但是这个网络的初衷主要是通过E-mail进行基于文本的简单通信。由于ARPAnet只是在ARPA资助的实验室和大学中可用,因此绝大部分教育
30、机构并没有连接进来。所以,20世纪70年代后期和80年代早期又开发了很多其他网络,其中包括BITNET和CSNET。BITNET是Because Its Time Network的缩写,是由纽约城市大学(City University of New York)首创。该网络的初衷是提供电子邮件和文件传输功能。CSNET是Computer Science Network的缩写,它将特拉华大学(University of Delaware)、普渡大学(Purdue University)、威斯康星大学(University of Wisconsin)、兰德公司(RAND Corporation)、B
31、olt、Beranek以及Newman(马萨诸塞州坎布里奇市的一家研究公司)连接在一起。该网络最初的设计目标是提供电子邮件功能。由于各种不同的原因,BITNET和CSNET都没有发展为占有绝对优势的全国性网络。1986年出现了一个新的全国性的网络NSFnet,顾名思义,这是由美国国家科学基金会(National Science Foundation,NSF)出资赞助的。NSFnet最初连接了NSF赞助下的位于5个大学中的超级计算机中心。但是,在该网络建立后不久,其他学术机构和实验室也开始使用该网络。到1990年,NSFnet在绝大部分非军事领域应用中已经取代了ARPAnet,大量组织成为NSF
32、net中的节点 到1992年,NSFnet已经连接了全球中一百万台以上的计算机。1995年,NSFnet中的一小部分网络重新成为学术网络。其余部分就成为著名的Internet,虽然这一术语很早就已经在ARPAnet和NSFnet中使用过了。1.1.2 Internet的含义Internet是在一个通信网络中连接的计算机的大规模集合。这些计算机的大小、配置和制造商都是我们熟知的。实际上,连接到Internet中的一些设备如绘图机和打印机 根本就不是计算机。能够使所有这些不同的设备通过Internet进行通信的创新之举是一个单独的、低层的协议,即传输控制协议/Internet协议(Transmis
33、sion Control Protocol/Internet Protocol,TCP/IP)。TCP/IP在1982年成为计算机网络连接的标准协议,它允许某台计算机中的程序通过Internet直接和另一台计算机中的程序进行通信。但在绝大多数情况下,在TCP/IP之上还要运行一个较高层的协议。即便如此, TCP/IP为连接到Internet的计算机(及其他设备)提供了低层的通信接口也是非常重要的 TCP/IP并非Internet所采用的唯一通信协议有时也选用UDP/IP。一般情况下,同一个组织中的多台计算机并不是直接连接到Internet中的每台计算机上的,而是相互连接构成了一个局域网,然后这
34、个局域网中的一个节点物理连接到Internet中。因此,Internet实际上并不是计算机的网络,而是网络的网络。很明显,必须可以唯一地标识出所有连接到Internet的设备。1.1.3 IP地址对于我们来说,Internet节点是通过名称进行标识的;而对于计算机来说,它们是通过数字地址进行标识的。这种机制类似于程序中的变量名和变量的数字内存地址之间的关系。我们是通过变量名来标识变量,计算机则是通过变量的数字形式的内存地址来标识变量。计算机接入到Internet的IP地址是一个唯一的32位数字。通常IP地址会写为(或者认为)是由4个8位数字,中间用西文句点分隔而成的。IP地址中的这4个部分则分
35、别由不同的Internet路由计算机解析,然后确定某个消息下一步必须去往何处才能最终到达目的地。不同的组织分配了不同的IP块,然后再细分给所有需要接入到Internet的计算机 此时的机器大部分指的是计算机。例如,一个较小的组织可能分配了256个IP地址,可能是191.57.126.0191.57.126.255。一些大型组织,如美国国防部,可能分配了1600万个IP地址,这些IP地址的第一个8位数是特殊的,如12.0.0.012.255.255.255。虽然人们几乎总是在浏览器中输入域名,但并不影响IP的正常工作。例如,美国联合航空公司(United Airline,其网站地址是)的IP地址
36、是209.87.113.93。因此,如果在浏览器中输入http:/ 209.87.113.93,就能连接到美国联合航空公司的网站。1998年底,一个新的IP标准IPv6出台,但它尚未广泛实现。IPv6最重要的变化是将IP地址从32位扩展为128位。这个变化是非常必要的,因为剩下的尚未启用的IP地址数量正在快速减少。这个新标准IPv6规范所在的位置为ftp:/ftp.isi.edu/in-notes/rfc2460.txt。1.1.4 域名由于我们很难直接处理和记住数字,因此Internet中的机器必须要有一个文本格式的名称。名称中首先是一个主机的名称,接下来是范围越来越大的机器集合的名称,称之
37、为域(domain)。一般可能有两个、三个甚至多个域名。第一个域名紧靠主机名称的右侧,表明主机是这个域的一部分。第二个域名给出了第一个域所在的域。最后的域名表示主机所属的组织类型,这是站点名称中最大的域。对于美国的组织来说,edu表示教育机构,com表示公司,gov表示美国政府机构,org表示其他类型的组织。对于其他国家,最大的域一般是国家的缩写 例如,瑞典(Sweden)的缩写为se,哈萨克斯坦(Kazakhstan)的缩写为kz。请分析下面这个简单的地址示例:其中,movies指的是主机名称,comedy是movies所在的本地域,而它又是marxbros域的一部分,同样,marxbros
38、域是com域的一部分。主机名称和所有的域名合称为完全限定域名。由于IP地址是Internet内部使用的地址,因此,由浏览器用户为消息指定的目的地的完全限定域名必须在通过Internet将消息传递给目的地之前转换为一个IP地址。此转换操作由一个名为“域名服务器”的软件系统来完成,该域名服务器实现了域名系统(Domain Name System,DNS)。域名服务器是为Internet上的一组机器服务,并由负责这些机器所连接的Internet部分的组织机构来运转。所有来自浏览器的文档请求都被发送到最近的域名服务器。该域名服务器将尝试是否能够将完全限定域名转换为IP地址,如果可以,则进行转换。否则,
39、该服务器将这个完全限定域名发送给另外的域名服务器以实现转换操作。与IP地址一样,完全限定域名也必须是唯一的。图1-1演示了浏览器请求的一个完全限定域名在发送到一个适当的Web服务器之前是如何转换为IP地址的。图1-1 域名转换确定某个Web站点IP地址的一种方式是在完全限定域名之前使用telnet命令。参见1.7.1节。到20世纪80年代中期,已经出现了很多种基于TCP/IP运行的协议,以支持基于Internet的各种不同应用。其中最常见的是telnet,它使得Internet上某台计算机的用户可以登录并使用Internet上的另一台计算机;文件传输协议(File Transfer Proto
40、col,FTP)用于Internet上各个计算机之间的文件传输;Usenet用于实现电子公告板;mailto允许Internet上某台计算机的用户将消息发送给Internet上其他计算机的用户。这些不同的协议有着各自不同的用户接口,并且只能用于实现本身的设计目标,用户只有学习所有这些不同的用户接口才能够体验Internet的优势。这就限制了Internet的发展。但不久后,一个更好的方法出现了,那就是万维网。1.2 万维网本节将简单介绍万维网的演变。1.2.1 起源1989年,CERN(Conseil Europen pour la Recherche Nuclaire或European Or
41、ganization for Particle Physics的简称,欧洲粒子物理研究所)中由Tim Berners-Lee领导的小组提交了一个针对Internet的新协议和一个使用该协议的文档系统3 虽然Berners-Lee获得的学位(来自牛津)是物理学,但他在CERN的第一份工作却是一个软件咨询工程师。Berners-Lee在伦敦出生并长大。该小组将这个新系统命名为World Wide Web,它的目的在于使全球的科学家能够利用Internet交换自己的工作文档。这个新系统被设计为允许Internet上任意一个用户都可以从许多文档服务计算机的数据库中搜索和获取文档。到1990年末,个新系
42、统的基本框架已经在CERN中的一台NeXT计算机中开发出来并实现了。1991年,该系统移植到了其他计算机平台并正式发布。该系统的文档使用超文本的形式,超文本是一组包含了嵌入式链接的文本,这些文本可以链接到其他文档的文本,并支持非连续显示文本格式的材料。超文本的概念出现得更早一些,在20世纪80年代中期,它就已经在Xerox公司的NoteCards和Apple公司的HyperCard中使用了。从现在开始,本书将World Wide Web简称为Web。Web中的信息单元有几个不同的名称,其中,最常用的是页面(Page)、文档(Document)和资源(Resource)。这三个名称中最常用的是文档,虽然它看起来好像只能描述文本。页面的应用范围也比较广泛,但经常会引起误解,因为Web信息单元通常会涵盖构成印刷媒体的多种页面类型。此处将这些单元称为资源是比较合适的,因为这可以涵盖可能包含的非文本信息。虽然本书有的地方或多或少地将文档和页面互换使用,但在绝大部分情况下,应该优先使用文档这一名称。有时候文档只表示文本,通常包含一些指向其他文档的嵌