本书是讲述Java技术的权威著作,全面介绍了Java 2 SDK 1.4的各种功能,内容涉及Java 2高级编程主题的方方面面,如分布式对象编程、企业级Java应用、Java集成技术、Java媒体技术、设计Java类的方式等。全书贯穿了一个用Java 编写的实际应用,可供读者理解Java的各种概念和编程方法,并且所有源代码可以从网上下载。本书适合有一定Java语言基础的编程人员使用。
前言\r\n关于作者\r\n\r\n第一部分 分布式对象编程\r\n\r\n第1章 计算机互连编程原理 \r\n\r\n1.1 计算机连接简史 \r\n1.2 TCP/IP和Java \r\n1.2.1 TCP/IP工作原理 \r\n1.2.2 应用层 \r\n1.2.3 传输层 \r\n1.2.4 网络层 \r\n1.2.5 网络访问层 \r\n1.3 理解现代互连技术 \r\n1.3.1 Java数据库连接性(JDBC) \r\n1.3.2 TCP/IP \r\n1.3.3 servlet\r\n1.3.4 远程方法调用(RMI) \r\n1.3.5 Java命名和目录接口(JNDI) \r\n1.3.6 JavaMail \r\n1.3.7 Java消息服务(JMS) \r\n1.3.8 Enterprise JavaBean(EJB) \r\n1.3.9 消息驱动的bean(MDB) \r\n1.3.10 XML \r\n1.3.11 Web服务 \r\n1.4 旅行票据应用程序的设计 \r\n1.5 小结 \r\n\r\n第2章 使用RMI创建应用程序 \r\n\r\n2.1 理解RMI \r\n2.1.1 RMI特性 \r\n2.1.2 RMI与CORBA的比较 \r\n2.1.3 RMI的内部机理 \r\n2.1.4 支持程序 \r\n2.1.5 创建RMI应用程序 \r\n2.1.6 运行示例程序 \r\n2.2 将应用程序转换为RMI \r\n2.3 创建CruiseList应用程序的RMI版本 \r\n2.4 小结 \r\n\r\n第3章 使用JAXP创建应用程序 \r\n\r\n3.1 理解XML \r\n3.2 XML相关工具 \r\n3.3 创建XML文档 \r\n3.4 创建文档类型定义(DTD) \r\n3.5 使用Simple API for XML(SAX)进行分析 \r\n3.6 使用文档对象模型(DOM)进行分析 \r\n3.7 CruiseList应用程序的XML版本 \r\n3.8 小结 \r\n\r\n第4章 使用JSP和servlet进行应用程序开发 \r\n\r\n4.1 HTTP基础 \r\n4.2 第一个JSP页面 \r\n4.3 JSP标记类型\r\n4.3.1 指令\r\n4.3.2 声明\r\n4.3.3 表达式\r\n4.3.4 JSP小脚本\r\n4.4 使用JSP处理表单 \r\n4.5 第一个servlet \r\n4.6 何时使用JSP,何时使用servlet \r\n4.7 综合使用JSP和servlet \r\n4.8 小结 \r\n\r\n第二部分 企业级Java\r\n\r\n第5章 Enterprise JavaBean(EJB) \r\n\r\n5.1 理解EJB方式 \r\n5.1.1 EJB的长处\r\n5.1.2 EJB的弱点\r\n5.1.3 编写简单的EJB \r\n5.2 EJB内部原理\r\n5.2.1 EJB体系结构\r\n5.2.2 实例缓存\r\n5.2.3 部署说明文件概述\r\n5.2.4 EJB的类型\r\n5.3 使用EJB开发旅行订票应用程序\r\n5.4 开发无状态会话bean\r\n5.4.1 使用无状态会话bean进行实例缓存\r\n5.4.2 无状态会话bean的状态图\r\n5.4.3 无状态bean中的回调方法\r\n5.4.4 为旅行订票应用程序编写无状态bean\r\n5.4.5 无状态会话bean中的create方法\r\n5.5 开发有状态会话bean\r\n5.5.1 有状态会话bean的状态图\r\n5.5.2 SessionSynchronization接口\r\n5.5.3 有状态bean中的回调方法\r\n5.6 开发实体bean\r\n5.6.1 实体bean中的持久化模型\r\n5.6.2 实体bean的状态图\r\n5.6.3 实体bean中的回调方法\r\n5.6.4 为旅行订票应用程序编写实体bean\r\n5.6.5 实体bean中的create方法\r\n5.6.6 EJB查询语言\r\n5.6.7 find方法\r\n5.6.8 ejbSelect方法\r\n5.6.9 ejbHome方法\r\n5.6.10 CMP字段\r\n5.6.11 CMR字段\r\n5.6.12 主键\r\n5.7 建立并且运行旅行订票应用程序 \r\n5.8 EJB容器服务\r\n5.8.1 EJB中的声明式安全\r\n5.8.2 EJB中的声明式事务\r\n5.8.3 EJB环境\r\n5.9 小结\r\n\r\n第6章 消息驱动的bean(MDB) \r\n\r\n6.1 理解消息驱动的bean(MDB) \r\n6.2 开发和部署MDB\r\n6.2.1 编写MDB Java文件\r\n6.2.2 手工创建部署说明文件\r\n6.2.3 部署消息驱动的bean \r\n6.2.4 编写简单的MDB \r\n6.3 MDB的工作原理 \r\n6.4 点对点模型 \r\n6.5 创建基于GUI的应用程序 \r\n6.6 在MDB中处理错误 \r\n6.7 小结 \r\n\r\n第7章 Java消息服务(JMS) \r\n\r\n7.1 理解JMS\r\n7.2 使用JMS建立旅行票据系统\r\n7.2.1 用户界面编程 \r\n7.2.2 使用JMS建立票据代理应用程序 \r\n7.2.3 集成测试 \r\n7.3 发布/预订模型 \r\n7.4 小结 \r\n\r\n第8章 选择正确技术的方法\r\n\r\n8.1 选择技术的挑战\r\n8.2 衡量软件特征\r\n8.2.1 成本\r\n8.2.2 风险\r\n8.2.3 可维护性\r\n8.2.4 可靠性\r\n8.2.5 可伸缩性\r\n8.2.6 互操作性\r\n8.2.7 简单性\r\n8.2.8 可扩展性\r\n8.2.9 可检验性\r\n8.2.10 人员的情况\r\n8.2.11 学习的难度\r\n8.3 评估分布式技术\r\n8.3.1 Java和Java数据库连接性(JDBC)\r\n8.3.2 TCP/IP编程(套接字) \r\n8.3.3 servlet \r\n8.3.4 远程方法调用(RMI)\r\n8.3.5 Java命名和目录接口(JNDI)\r\n8.3.6 JavaMail\r\n8.3.7 Java消息服务(JMS)\r\n8.3.8 消息驱动bean(MDB) \r\n8.3.9 Enterprise JavaBean(EJB) \r\n8.3.10 Web服务\r\n8.4 对比Java技术与CORBA\r\n8.5 小结 \r\n\r\n第三部分 Java集成技术\r\n\r\n第9章 Web服务 \r\n\r\n9.1 理解Web服务方式\r\n9.1.1 什么是Web服务\r\n9.1.2 Web服务的长处 \r\n9.1.3 Web服务的弱点 \r\n9.1.4 创建一个简单的Web服务 \r\n9.2 理解SOAP \r\n9.3 创建一个付款Web服务 \r\n9.3.1 SOAP错误消息 \r\n9.3.2 SOAP数据类型 \r\n9.4 理解WSDL \r\n9.5 理解UDDI\r\n9.5.1 UDDI数据结构\r\n9.5.2 UDDI API \r\n9.6 与.NET进行集成 \r\n9.7 小结 \r\n\r\n第10章 JDBC和数据库\r\n\r\n10.1 为什么需要JDBC\r\n10.2 JDBC的工作原理 \r\n10.3 批处理 \r\n10.4 JDBC与WebLogic Server \r\n10.5 JDBC事务管理 \r\n10.6 JDBC 3.0中的改进 \r\n10.7 小结 \r\n\r\n第11章 Java命名和目录接口(JNDI) \r\n\r\n11.1 为什么需要命名服务API\r\n11.2 理解JNDI\r\n11.3 命名服务的工作原理 \r\n11.4 寻找JNDI提供者\r\n11.4.1 默认寻找\r\n11.4.2 在命令行上传递属性\r\n11.4.3 创建JNDI属性文件\r\n11.4.4 传递属性对象\r\n11.4.5 创建Hashtable \r\n11.5 JNDI与WebLogic Server \r\n11.5.1 绑定、取消绑定和重新绑定 \r\n11.5.2 复杂对象 \r\n11.6 使用JNDI时的注意事项\r\n11.7 小结\r\n\r\n第12章 使用Java处理语音\r\n\r\n12.1 理解Java Speech\r\n12.2 创建和分配语音引擎 \r\n12.2.1 引擎状态 \r\n12.2.2 分配线程 \r\n12.3 语音合成 \r\n12.4 语音识别 \r\n12.5 小结 \r\n\r\n第13章 JavaMail\r\n\r\n13.1 理解JavaMail\r\n13.1.1 Session类\r\n13.1.2 Message类\r\n13.2 JavaMail的工作原理\r\n13.3 创建简单的SMTP应用程序 \r\n13.4 创建基于JavaMail的CruiseList应用程序 \r\n13.5 获取特定的电子邮件消息 \r\n13.6 编写事件驱动的电子邮件应用程序 \r\n13.7 小结\r\n\r\n第14章 串行端口通信\r\n\r\n14.1 理解RS-232标准\r\n14.1.1 RS-232硬件 \r\n14.1.2 通信软件 \r\n14.2 Java Communications API \r\n14.3 通过串行端口发送数据 \r\n14.4 小结 \r\n\r\n第四部分 Java媒体技术\r\n\r\n第15章 使用Java 2D进行绘制\r\n\r\n15.1 理解Java 2D\r\n15.2 在屏幕上绘制文本 \r\n15.3 绘制图形 \r\n15.4 操作图像 \r\n15.5 混合使用文本、图形和图像 \r\n15.6 小结 \r\n\r\n第16章 Java 3D图形\r\n\r\n16.1 理解三维(3D)编程\r\n16.2 Java 3D API中的主要对象 \r\n16.3 在Java 3D应用程序中添加运动 \r\n16.4 在Java 3D程序中添加光线 \r\n16.5 在Java 3D中添加纹理映射 \r\n16.6 小结 \r\n\r\n第17章 Java媒体框架(JMF)和Java Advanced Imaging(JAI)API\r\n\r\n17.1 理解基于时间的媒体\r\n17.2 使用JMF对基于时间的媒体进行解码 \r\n17.2.1 添加控制面板 \r\n17.2.2 JMF中的其他功能\r\n17.3 使用Advanced Imaging API进行程序设计\r\n17.4 小结 \r\n\r\n第18章 使用Java处理声音\r\n\r\n18.1 取样声音的原理\r\n18.2 MIDI声音的原理 \r\n18.3 Java Sound API \r\n18.4 使用Java播放声音 \r\n18.5 使用Java捕捉声音 \r\n18.6 小结 \r\n\r\n第五部分 设计Java类的最佳方式\r\n\r\n第19章 JavaBean和Java事件模型 \r\n\r\n19.1 理解JavaBean\r\n19.2 使用Java事件模型进行程序设计\r\n19.3 开发简单的JavaBean\r\n19.4 方法、事件和属性\r\n19.4.1 方法\r\n19.4.2 事件\r\n19.4.3 绑定属性和受限属性\r\n19.5 小结\r\n\r\n第20章 体系结构模型和框架\r\n\r\n20.1 为什么需要框架\r\n20.2 什么是框架 \r\n20.3 MVC模式概述\r\n20.4 Jakarta Struts框架中的MVC实现 \r\n20.4.1 在Struts中创建控制器 \r\n20.4.2 在Struts中创建视图 \r\n20.4.3 在Struts中创建模型\r\n20.4.4 运行登录应用程序\r\n20.5 小结 \r\n\r\n第21章 Java设计模式\r\n\r\n21.1 为什么需要模式\r\n21.2 Java模式\r\n21.2.1 单实例\r\n21.2.2 枚举 \r\n21.2.3 工厂 \r\n21.2.4 观察者 \r\n21.2.5 代理 \r\n21.2.6 外观 \r\n21.3 EJB设计模式\r\n21.3.1 业务委托\r\n21.3.2 命令\r\n21.4 小结 \r\n\r\n第22章 异常和调试\r\n\r\n22.1 异常处理的重要性\r\n22.2 理解Java异常策略\r\n22.3 在Java程序中捕获异常\r\n22.4 常见的异常处理方式 \r\n22.5 处理异常的正确方式 \r\n22.6 转换异常 \r\n22.7 传递异常而不损失信息 \r\n22.8 JDK 1.4中的异常传递 \r\n22.9 小结 \r\n\r\n第23章 Java安全\r\n\r\n23.1 Java安全概述\r\n23.1.1 应用程序安全综述\r\n23.1.2 安全威胁\r\n23.1.3 Java中的安全机制\r\n23.1.4 Java Authentication and Authorization Service综述\r\n23.1.5 Java Cryptography Extension综述\r\n23.2 Java沙箱模型\r\n23.2.1 Java沙箱体系结构\r\n23.2.2 使用Java权限 \r\n23.2.3 为Java沙箱编写自己的权限 \r\n23.3 Java安全套接字\r\n23.3.1 SSL综述\r\n23.3.2 加密综述\r\n23.3.3 使用JSSE的客户/服务器\r\n23.4 小结\r\n\r\n第24章 Java多线程应用程序\r\n\r\n24.1 线程概述\r\n24.1.1 线程的生存周期 \r\n24.1.2 创建线程 \r\n24.2 控制线程\r\n24.2.1 启动线程\r\n24.2.2 使线程睡眠 \r\n24.2.3 中断线程 \r\n24.2.4 停止线程\r\n24.3 创建线程安全的应用程序\r\n24.3.1 多线程应用程序中最常见的问题\r\n24.3.2 临界区 \r\n24.3.3 让线程等待 \r\n24.3.4 结合线程\r\n24.4 线程管理\r\n24.4.1 线程组\r\n24.4.2 线程的优先级\r\n24.5 小结\r\n\r\n第25章 Java国际化 \r\n\r\n25.1 国际化的基本原理 \r\n25.2 为文本使用资源束 \r\n25.3 使用ResourceBundle类存储对象 \r\n25.4 国际化日期和时间 \r\n25.5 国际化数值和货币值 \r\n25.6 小结 \r\n\r\n第26章 持久化和克隆\r\n\r\n26.1 对象串行化\r\n26.1.1 自动串行化 \r\n26.1.2 transient关键字 \r\n26.1.3 带版本的串行化 \r\n26.1.4 定制的串行化 \r\n26.1.5 串行化内部原理 \r\n26.2 对象外表化 \r\n26.3 克隆 \r\n26.3.1 创建深度副本 \r\n26.3.2 使用串行化进行克隆 \r\n26.3.3 AutoCloner与性能\r\n26.4 安全与串行化\r\n26.5 小结\r\n\r\n第27章 多态性和继承\r\n\r\n27.1 多态性和继承的重要性\r\n27.2 多态性的内部原理 \r\n27.3 多态性编程 \r\n27.4 继承、构成或强力 \r\n27.5 继承和多态性的缺点 \r\n27.6 具体或抽象基类 \r\n27.7 类型安全的向下类型转换与继承 \r\n27.7.1 instanceof解决方案\r\n27.7.2 Object.getClass( ) 解决方案\r\n27.7.3 Class.forName( ) 解决方案 \r\n27.8 用运行时类型识别进行多态性编程 \r\n27.9 用反射进行多态性编程 \r\n27.10 继承与句柄 \r\n27.11 小结 \r\n\r\n第28章 代码的组织和部署\r\n\r\n28.1 理解包\r\n28.2 JAR文件 \r\n28.2.1 内容清单文件\r\n28.2.2 运行JAR文件中的代码\r\n28.2.3 扩展 \r\n28.3 Java API Documentation Generator \r\n28.4 小结 \r\n\r\n第六部分 附录\r\n\r\n附录A 本书使用的实用程序源代码清单 \r\n附录B 下载和安装WebLogic Server
我们写作本书的目的是讲述Java程序员真正需要掌握的技能。程序员很少碰到只涉及Java语言本身的工程。现代工程往往涉及对核心语言的扩展,比如JDBC、RMI、J2EE、JavaBean和串行端口通信。程序员通常要用不同的扩展开发不同的工程。
我们先浏览了书店,发现有大量的入门书籍和许多针对专门主题的高深书籍,缺少中等程度的书,也就是用朴实无华的语言解释高级主题的书,这就是我们要提供的。本书有以下特点:
·本书是由程序员用朴实无华的语言写成的。我们对读者的惟一要求是了解Java。例如,讨论Java Sound的一章假设你了解Java,但是不要求你了解Java Sound API。这样就很容易展开讨论。
·每章包含你可以使用的代码。本书中的所有代码都可以复制进你的工程。本书很少使用无法运行的“代码片段”来进行解释。你可以复制或输入本书中的例子、运行它们并可修改它们以适合你的特定需要。
·本书给出了每个例子的输出。如果例子的结果很难显示,我们会添加println()调用,这样你就能够确定例子是否成功运行了。
·你将节省时间。你可以参加一个课程或者在Internet上冲浪数小时寻找符合需要的资料,但是本书能够更快地提供信息。
·本书比一套单一主题的书便宜得多。一本只讨论本书主题之一的书价格上往往就和本书相当了。收集20或30本这样的书可需要不少钱。在学习了本书中的一章之后,你可能想买一本关于此主题的专著。但是,你很可能发现你学到的东西已经足以帮助你理解在Internet上找到的资料了。
·本书在28章中讨论了28个不同的主题。这意味着你可以在一本书中找到广泛的Java主题。
·本书是以参考形式编写的,每章都可以独立阅读。我们尝试在多章中使用类似的例子,但是即使你最先阅读其中的任何一章,你也能够理解其中的说明。
本书适合的读者
本书是为中级Java程序员所写的,所以假设你已经了解Java的基本知识,而且正在寻找比语法更高级的知识。我们不解释与书中主题无关的代码特性。
如果一个程序员具有5年以上的经验(其中至少包含2年使用Java的经历),那么他应该能够毫无问题地理解本书中的解释和例子。经验较少的程序员也能从本书受益,但是当他们无法理解例子时应该查阅初级资料。
阅读方式
本书涉及的范围很广泛,扫一眼本书的目录你就会发现本书讨论了许多主题。因此,讨论每个主题的篇幅就比较有限了。所以,每一章的目标是帮助你开始研究每个主题。
本书讨论的主题都是本着“使Java程序员的职业技能提高一个层次”的目的而选择的。如果你了解Java,就能够理解本书中的所有例子。如果你分析这些例子、修改它们并且观察发生的现象,你就会发现你能够在会议和谈话中提供关于这些主题的出色建议。本书中的每一章都先提供几页介绍和背景知识,然后是几个使用此技术的例子以及对输出的说明。
没有什么可以替代对例子进行研究。在参加需要你提出建议的会议之前,你应该拿起这本书,花两小时研究几个例子。这样,当你提出一个技术方案时,你的建议更容易被采纳。如果说一张图抵得上千言万语,一个例子的价值则更大。
大多数程序员在换工作时会带着他们最喜欢的Java入门书和一本高级Java编程书籍。我们希望本书能成为你的第三本案头书。
本书的组织结构
本书分为六个部分:
·第一部分-分布式对象编程
·第二部分-企业级Java
·第三部分-Java集成技术
·第四部分-Java媒体技术
·第五部分-设计Java类的最佳方式
·附录
每个部分的内容都在使你成为更好、更受尊敬的程序员方面扮演重要角色。
第一部分-分布式对象编程
我们的许多工程要求跨越计算机之间的边界。此部分各章解释了应该怎么做。
第1章“计算机互连编程原理”讨论将两台计算机连接在一起的问题。它概述了可以用于实现此目标的技术以及一些历史资料,以便帮助你理解这些技术的起源。它还解释了Transmission Control Protocol/Internet Protocol(传输控制协议/网络互连协议,TCP/IP)是如何工作的。这很重要,因为所有其他技术都是在TCP/IP之上建立的。
第2章“使用RMI创建应用程序”讲解如何使用RMI。它的重要性在于许多分布式技术是在RMI之上建立的。
第3章“使用JAXP创建应用程序”解释了Java如何处理XML。本书描述的许多技术将XML文件作为数据传递。
第4章“使用JSP和servlet进行应用程序开发”讲解如何使用JavaServer Pages和servlet创建系统。对于许多应用程序,servlet提供了简单而且高效的方案。
第二部分-企业级Java
如果你需要可伸缩性,就需要使用Enterprise Java。此部分各章讲解J2EE套件中的先进技术并且帮助你决定其中哪种技术最适合你的需要。
第5章“Enterprise JavaBean(EJB)”讨论当今最热门的技术,EJB。它提供了引导你入门的例子,并且讨论了会话bean和实体bean。
第6章“消息驱动的bean(MDB)”讨论一种崭新的EJB,消息驱动的bean。这种bean的可伸缩性很像EJB,但是通信方式很像消息队列。
第7章“Java消息服务(JMS)”讨论JMS这种成熟的技术,它为某类企业系统提供了合适的方案。许多JMS应用程序已经被用于在不同类型的编程环境之间进行通信。
第8章“选择正确技术的方法”对比了各种可用技术并且指导你做出明智的选择,包含评估一种技术是否符合你的需要的标准。
第三部分-Java集成技术
Java是一种强大的“粘合”技术。此部分各章讲解程序员可以使用的各种“胶水”。
第9章“Web服务”解释如何使用这种新技术创建通过XML文件进行通信的应用程序。
第10章“JDBC和数据库”讲解如何在Java程序中与数据库进行交互。它还讲解了如何进行批量更新。
第11章“Java命名和目录接口(JNDI)”解释了Java程序设计中最神秘的一个方面。它揭示了幕后的情况,展示了命名服务的实际工作方式。
第12章“使用Java处理语音”用例子解释了如何在程序中进行语音合成和识别。随着便携式设备的普及,这种能力变得越来越重要了。
第13章“JavaMail”讲解如何使用JavaMail协议创建不必面向电子邮件的异步系统。
第14章“串行端口通信”讲解如何使用Java通过计算机上的串行端口和Java Communications Standard Extension与设备进行通信。
第四部分-Java媒体技术
Java是一种很适合处理媒体的平台。此部分各章讲解Java Media包中的功能。
第15章“使用Java 2D进行绘制”向你介绍这个非常重要的API并且提供使用它的例子。这些例子还演示了如何实现2D动画。
第16章“Java 3D图形”讲解如何在3D空间中创建物体。同时还讲解如何使物体运动和加上光线。
第17章“Java媒体框架(JMF)和Java Advanced Imaging(JAI)API”讲解如何使用Java播放视频。它还讲解如何使用Java进行图像操作。
第18章“使用Java处理声音”讲解如何在Java程序中捕捉和播放高质量的声音。声音可以采用取样或乐器数字接口(Musical Instrument Digital Interface,MIDI)文件的形式。
第五部分-设计Java类的最佳方式
资深开发人员需要理解某些概念。此部分各章集中讨论这些在程序设计团体中还没有被广泛理解的概念。
第19章“JavaBean和Java事件模型”讲解如何创建JavaBean。它还详细解释了在Java类之间如何传递事件。
第20章“体系结构模型和框架”解释如何为你的应用程序创建框架。它还讨论了一些商业框架以及使它们获得成功的原因。
第21章“Java设计模式”讲解如何使用设计模式改进你的系统,使它们更容易维护。对许多较高级设计的讨论要求你理解这些模式。
第22章“异常和调试”讲解如何使用一种全面的方式处理异常。它描述了常见的问题。
第23章“Java安全”讲解如何避免系统中的信息被盗和被破坏。
第24章“Java多线程应用程序”讲解如何创建并行运行的应用程序。许多Java多媒体程序设计都广泛地使用了线程。
第25章“Java国际化”讲解如何创建可以支持多种自然语言的应用程序。它还说明了如何提供变化的图形。
第26章“持久化和克隆”讨论了与串行化相关的问题。这很重要,因为大多数企业技术依赖于串行化对象。
第27章“多态性和继承”解释了Java的继承机制是如何工作的。这对于理解标准扩展是很重要的。
第28章“代码的组织和部署”提供了JAR文件、包和Javadoc的语法。
附录
附录A包含本书的多章中使用的代码。附录B解释如何得到WebLogic Server,这是本书中多次使用的基于J2EE的应用服务器。
本书中使用的约定
本书中使用了以下的排版约定:
·在显示输入和输出行时,常常使用粗体字型表示用户的输入。
·如果代码行太长,在书中无法放在一行内,就使用一个特殊图标(澹H绻憧吹酱胄星懊嬗绣图标,就要记住它是上一行的一部分。
本书还使用注意、警告和提示。这些特殊部分与一般文字分离,它们提供了相关问题的附加信息。
注意 注意用于指出你可能需要这些附加信息来理解文中讨论的概念。因为这些信息的重要性,它们应该特殊对待。
警告 警告用于提醒你注意与文中解释的主题相关的潜在问题。
提示 提示用于给出一般很难得的额外信息。这种信息常常是作者从工作经历中总结出来的。
网站
可以在Sams出版社的网站(http://www.samspublishing.com/)上找到本书各章中描述的代码文件。在Search框中输入不加连字符的本书的ISBN号(067232394x)并且点击Search。当本书的标题出现时点击它,你就会进入一个可以下载所有代码的页面。
联系方式
作为作者,我们欢迎我们的读者提出意见和建议。如果你想称赞、批评或纠正本书的内容,或者对我们以后的书提出建议,那么请与我们联系。可以通过电子邮件地址stevepotts@mindspring.com与Stephen Potts联系。可以通过电子邮件地址pestrikov@yahoo.com与Alex Pestrikov联系。