首页>参考读物>计算机科学与技术>软件与程序设计

EJB 2.0企业级应用程序开发
作者 : (美)Chuck Cavaness Brian Keeton
译者 : 智慧东方工作室
出版日期 : 2002-03-01
ISBN : 7-111-09910-9
定价 : 65.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 496
开本 : 16开
原书名 : SE Using Enterprise JavaBeans 2.0
原出版社:
属性分类: 店面
包含CD :
绝版 : 已绝版
图书简介

EJB是用于服务器端组件体系结构的一个规范。本书主要内容包括:构建EJB类及其接口的机制,EJB设计和性能的策略,构建Web层,EJB的高级概念等。附录包括了EJB 2.0的摘要及其新特征。 本书内容翔实、深入浅出,提供了详细的讨论和实例,对于懂Java语言的EJB初学者是一本有益的指导书。本书所附光盘包括:WebLogic Server 6.1的试用版、WebGain's VisualCafe 4.5的试用版、WebGain's TopLink 3.5.1的试用版,以及本书中使用到的实例。

图书前言

欢迎使用Enterprise JavaBean(EJB) 2.0!作为Java 2 Enterprise Edition(J2EE)的一部分,EJB体系结构已经成为被接受的标准,可用于分布式的、关键任务的商业应用程序的开发。EJB规范将J2EE应用程序服务器转变成一个基础,用于构建安全的、事务的、可伸缩的以及可移植的应用程序。它的成功范例正在不断增多。如果你在开发大型商业系统并且从未使用过EJB体系结构,现在就请加入这个行列吧。如果你已经使用过EJB,EJB2.0规范提供给你更多的方法来提高生产率和组件可移植性。 什么是EJB?EJB是用于服务器端组件体系结构的一个规范。不要与常规的JavaBean混淆。EJB是行业强化组件,它封装了可重用的业务逻辑以及对外部资源的访问,比如一个企业的关系型数据库。EJB的首要目的是使得开发者专注于业务逻辑,而不必担心他们的应用程序所需的事务、安全性以及持久性等底层细节。这些要求是按这样的一种方法处理的,该方法使你能创建跨应用程序服务器的可移植组件—这样也就达到了该体系结构的另一个目的。无论怎样,一个组件的价值通常是以它的重用性来衡量的。EJB采用一个说明方法来部署应用程序,它支持组件的扩展自定义,而又不需要修改代码。 EJB规范首先由Sun Microsystems这一家公司引入,但通过Java公用进程(Java Community Process,JCP),它的当前形式现在已经成熟了。得益于领先的应用程序服务器和软件厂商的参与,EJB 2.0在体系结构上又继续取得成功。 本书面向的读者 本书主要面向的是懂Java语言但对EJB陌生的编程人员。EJB是一个复杂的主题,但是本书主要介绍基础技术,为你深入研究EJB提供了一个起点。当你有了基础时,在进入更高级的主题前我们将引入更详细的讨论和实例,使你能掌握作为一个EJB开发者所需的技能。 对于在EJB方面没有经验的编程人员,这本书应该很适合。如果你已经知道了EJB,就可能认识到EJB 2.0规范在体系结构的几个关键领域引入了重大变化(如果想了解一个概要,请查看附录B)。对于一些熟悉EJB的读者,本书将教授如何利用新的内容。它也将为你提供几个已被证实可行的EJB设计实践,它们正在行业范围内逐步成型。如果你已经使用过EJB 1.1并正考虑转向EJB 2.0规范,那么本书为你指出了一些在改变体系结构之前必须考虑的重要问题。如果你已经决定现在继续使用EJB 1.1,只希望它能赶上2.0规范的速度,本书也能提供指导。 本书是如何组织的 本书共分五部分,介绍EJB的概念以及设计和实现自己企业bean的进程。继续阅读本书将看到本书还组织了相关的主题来建立你的EJB编程知识。 第一部分讲授了构建EJB类及其接口的机制。该部分开始是一个基于组件开发的概述,并用详细的实例介绍了每个企业bean的类型,它告诉你在开始构建和部署你自己的EJB时需要知道的内容。为了确保你理解EJB直接依靠的J2EE其他技术,这些章节分别提供Java命名和目录接口(JNDI)和Java消息服务(JMS)更深的内容。这一部分还定义了在EJB应用程序中事务的作用,并介绍了异常处理和安全性管理。 第二部分超出了构建EJB的基础,介绍了一组设计和性能的策略,可应用于你的企业级开发计划。尽管EJB是一种相对较新的技术,但已经出现了一些标准的实践,作为一个设计者,必须意识到这一点。这部分还包括了在对你的应用程序进行负载测试时可以采用的几种方法的一个讨论。 第三部分超越了你在一本EJB书中所期望看到的内容。这里包括的章节有几种模式,你可以将它们应用在构建基于Servlet和JSP的表示层,它可以与使用EJB的应用层进行交互。 第四部分使你理解经验丰富的EJB开发者所关注的问题。这里你将得到一个用EJB 2.0引入的新要求的有关信息。它使得EJB能够与在另一个厂商的容器里运行的CORBA对象或EJB进行通信。另外,对于你的应用程序,还介绍了一些用于构建一个基础服务层的推荐实践。对于在第二部分中的构建性能的有关章节,你还将学习有关EJB组件和服务的集群内容。如果你是这种类型的人—当别人告诉你不能做某事的时候你总想知道为什么,那么你就会对第四部分的最后一章特别感兴趣。该章特别涉及了你在EJB容器内不能假定怎么做的事及其原因。 第五部分提供了一些快速参考材料,包括了EJB 2.0的摘要以及自EJB 1.1的变化的一个说明。 在本书中使用的约定 本书在格式上和印刷上使用以下特殊段落,更便于读者阅读。 注意  当你在本书中看到一个注意,它指明了附加的信息,它能帮助你更好地理解一个主题或避免与此主题相近的问题出现。 提示  介绍了经验丰富的开发者应用的技巧。可简化一个任务或产生一个更好的设计。提示的目的是帮助你应用标准的实践,来完成健壮的(robust)、可维护的应用程序。 警告  提醒你注意危险的过程(例如,潜在地危及一个系统安全的操作)。 参见  提供相关内容的介绍。 本书的许多章包括了一个“疑难解答”小节,关于某个主题你可能会遇到一些常见问题,该小节提供了相应的解决方案。

作者简介

(美)Chuck Cavaness Brian Keeton:暂无简介

译者简介

智慧东方工作室:暂无简介

图书目录

第一部分  开发EJB 第1章  企业级应用程序导论 1 1.1  EJB体系结构 1 1.2  基于组件的分布式计算 3 1.2.1  软件组件的快速复习 3 1.2.2  将组件集合到体系结构中 4 1.3  N层体系结构 5 1.3.1  两层组件体系结构 5 1.3.2  N层组件体系结构 6 1.4  为什么使用EJB 6 1.4.1  “编写一次,多处运行”原则 7 1.4.2  规范与实现分隔 7 1.4.3  提供互用性 7 1.4.4  开发者可以专注于商业逻辑 8 1.4.5  与CORBA/IIOP协议兼容 8 第2章  一个拍卖网站的实例 9 2.1  拍卖实例概述 9 2.2  英式拍卖的概述 9 2.3  选择要实现的用例 11 2.3.1  创建拍卖 14 2.3.2  取消拍卖 14 2.3.3  指定买受人 14 2.3.4  结束拍卖 14 2.3.5  查看拍卖 14 2.3.6  查看应价历史 14 2.3.7  浏览拍卖 14 2.3.8  查看拍卖细节 15 2.3.9  应价拍卖 15 2.3.10  查看账簿历史 15 2.4  定义对象模型 15 2.4.1  标识商业对象 15 2.4.2  标识应用程序控制者 17 第3章  EJB概念 20 3.1  提早掌握概念 20 3.2  什么是Enterprise Bean 20 3.2.1  实体bean 21 3.2.2  会话bean 21 3.2.3  消息驱动bean 22 3.3  EJB角色及其责任 22 3.3.1  bean提供者 23 3.3.2  应用程序集中者 24 3.3.3  EJB部署者 25 3.3.4  EJB服务器提供者 25 3.3.5  EJB容器提供者 26 3.3.6  系统管理员 27 3.4  本地EJB客户机与远程EJB客户机的对比 27 3.4.1  本地EJB客户机 27 3.4.2  远程EJB客户机 27 3.5  使用RMI与EJB通信 28 3.5.1  什么是根和干 28 3.5.2  在IIOP上使用RMI 34 3.6  通过EJB的组件接口来访问EJB 36 3.7  使用Home接口定位企业bean 38 3.8  决定是否使用一个本地或远程客户机 40 3.8.1  本地模型通常可提供更好的性能 40 3.8.2  本地模型的访问粒度最细 41 3.8.3  远程模型提供更好的位置透明度 41 3.8.4  远程客户机必须处理远程异常 41 3.9  EJB的创建和删除 41 3.10  钝化和活化 42 3.11  对象池 44 3.12  句柄 45 3.13  EJB服务器和容器的实现 46 第4章  Java的命名和目录接口 48 4.1  为什么应用程序需要命名服务     和目录服务 48 4.1.1  命名服务 48 4.1.2  目录服务 50 4.2  JNDI体系结构概述 50 4.3  选择和配置JNDI提供者 52 4.4  JNDI环境属性 53 4.4.1  java.naming.factory.initial 55 4.4.2  java.naming.provider.url 56 4.5  设置JNDI环境属性 56 4.5.1  用散列表设置环境属性 56 4.5.2  使用系统属性 56 4.5.3  使用资源文件 57 4.5.4  用于查找资源文件的搜索算法 59 4.6  Context和InitialContext对象 59 4.7  获得Context对象的环境 63 4.8  使用lookup方法定位JNDI资源 65 4.9  定位EJB对象 66 4.10  访问EJB的环境 67 4.11  通过InitialContext建立安全性 68 4.12  JNDI和群集 69 4.13  疑难解答 70 第5章  实体bean 71 5.1  什么是实体bean 71 5.1.1  商业逻辑 72 5.1.2  粗粒度对象 72 5.1.3  表达从属对象 73 5.1.4  标识拍卖实体对象 74 5.1.5  bean提供者责任 75 5.2  声明组件接口 76 5.2.1  实体bean的客户机视图 76 5.2.2  显露商业方法 77 5.2.3  命名约定 78 5.2.4  拍卖组件接口 79 5.3  定义主键类 91 5.3.1  使用单一字段键 91 5.3.2  使用多字段键 92 5.3.3  在部署时指定主键 93 5.4  声明Home接口 94 5.4.1  创建实体bean 94 5.4.2  查找实体bean 95 5.4.3  删除实体bean 96 5.4.4  声明Home接口商业方法 96 5.4.5  EnglishAuctionHome接口 96 5.5  实现实体bean 97 5.5.1  EntityBean接口 98 5.5.2  EntityContext接口 98 5.5.3  商业方法 99 5.5.4  Home方法 100 5.5.5  回调方法和实体bean的生命周期 100 5.5.6  访问环境 102 5.6  继承和实体bean 103 5.7  实体bean有用吗 105 第6章  bean管理的持久性 107 6.1  选择自己管理持久性 107 6.2  JDBC入门 108 6.2.1  Connection接口 108 6.2.2  PreparedStatement接口 109 6.2.3  ResultSet接口 110 6.2.4  SQLException类 110 6.3  配置数据源 110 6.3.1  定义连接池 111 6.3.2  定义资源管理者连接工厂的引用 112 6.3.3  从EJB内获得连接 113 6.3.4  拍卖模式 114 6.4  创建实体bean 116 6.5  载入和存储实体 121 6.5.1  实现ejbLoad 121 6.5.2  实现ejbStore 123 6.6  访问其他实体bean 128 6.7  实现Finder方法 130 6.8  删除实体 132 6.9  使用BMP部署实体bean 134 6.10  疑难解答 141 第7章  容器管理的持久性 143 7.1  构建可移植的实体bean 143 7.1.1  CMP和从属对象 143 7.1.2  将拍卖的实例转移到CMP 144 7.2  声明CMP实体bean 145 7.2.1  定义CMP字段 146 7.2.2  定义CMR字段 148 7.2.3  从属的值类 149 7.3  实现容器回调方法 150 7.3.1  指派EntityContext 150 7.3.2  创建和删除 151 7.3.3  主键的产生 152 7.3.4  载入和存储 152 7.3.5  钝化和活化 153 7.3.6  实现Home方法 153 7.3.7  声明Select方法 153 7.4  使用CMP部署实体bean 154 7.4.1  抽象持久性模式 154 7.4.2  实现Finder和Select方法 158 7.4.3  将抽象持久性模式映射到数据库 159 7.4.4  CMP bean的容器实现 163 7.4.5  测试拍卖实例 167 7.5  管理关系 167 7.6  使用EJB 1.1 CMP 168 7.7  疑难解答 169 第8章  EJB查询语言 171 8.1  什么是EJB查询语言 171 8.2  定义FROM从句 172 8.2.1  标识变量 172 8.2.2  路径表达式 174 8.3  定义WHERE从句 174 8.3.1  输入参数 175 8.3.2  表达式和运算符 175 8.4  定义SELECT从句 178 8.5  使用内建函数 179 8.5.1  字符串函数 179 8.5.2  运算函数 180 8.6  BNF记号法中的EJB  QL语法 180 8.7  疑难解答 183 第9章  会话bean 184 9.1  什么是会话bean 184 9.2  无状态会话bean与状态会话bean      之间的不同 185 9.2.1  标识拍卖的会话bean 186 9.2.2  bean提供者责任 187 9.3  声明组件接口 187 9.3.1  比较对象标识 188 9.3.2  拍卖组件接口 189 9.4  声明Home接口 194 9.4.1  创建会话bean 195 9.4.2  删除会话bean 195 9.4.3  AuctionCheckoutHome接口 196 9.5  实现会话bean 196 9.5.1  SessionBean接口 197 9.5.2  SessionContext接口 197 9.5.3  会话bean的生命周期 198 9.5.4  维持对话状态 201 9.5.5  访问环境 202 9.5.6  访问其他EJB 202 9.6  部署会话bean 204 9.7  重入问题 209 9.8  疑难解答 209 第10章  Java消息服务 211 10.1  消息传递简介 211 10.1.1  什么是面向消息的中间件 211 10.1.2  Java消息服务作为面向消息的        中间件 212 10.1.3  各种JMS实现的不同 212 10.2  JMS体系结构的组件 213 10.2.1  消息生产者 213 10.2.2  消息使用者 214 10.2.3  JMS消息 214 10.2.4  被管理的JMS对象 214 10.2.5  命名服务 214 10.3  两个JMS消息的模型 214 10.3.1  点对点 214 10.3.2  发布/订阅 215 10.4  JMS的接口 215 10.4.1  ConnectionFactory 216 10.4.2  Connection 216 10.4.3  Session 216 10.4.4  Destination 217 10.4.5  MessageProducer和Message_        Consumer 218 10.4.6  Message 218 10.5  JMS消息的详细描述 219 10.5.1  消息标题 219 10.5.2  消息属性 221 10.5.3  消息主体 221 10.6  消息的选择和过滤 222 10.6.1  设置标题和属性字段 222 10.6.2  指定消息选择器的查询字符串 222 10.7  使用JMS点对点模型 223 10.7.1  创建JMS管理对象 224 10.7.2  接收来自队列的消息 224 10.7.3  将消息发送到队列 235 10.7.4  运行队列的实例 240 10.8  使用JMS发布/订阅模型 240 10.8.1  创建JMS管理对象 241 10.8.2  将订阅者添加到主题 241 10.8.3  将消息发送到主题 248 10.8.4  运行主题的实例 252 10.8.5  耐久性订阅 253 10.9  同步传递消息与异步传递消息的对比 254 10.10  消息的持久性 255 10.11  随同JMS使用事务 255 10.12  随同EJB使用JMS 255 10.13  疑难解答 256 第11章  消息驱动bean 257 11.1  什么是消息驱动bean 257 11.1.1  消息驱动bean是匿名的 257 11.1.2  消息驱动bean是无状态的 258 11.2  消息驱动bean和容器 258 11.3  随同EJB使用消息驱动bean 258 11.4  随同消息驱动bean使用JMS队      列或主题 259 11.5  创建消息驱动bean 259 11.5.1  MessageDrivenBean接口 259 11.5.2  JMS  MessageListener接口 260 11.5.3  创建消息驱动bean类 261 11.6  部署消息驱动bean 265 11.7  将消息发送到消息驱动bean 267 11.8  确认来自消息驱动bean的消息 267 11.9  随同消息驱动bean使用事务 267 11.10  疑难解答 267 第12章  事务 269 12.1  理解事务 269 12.2  事务的特性 270 12.2.1  原子性 270 12.2.2  一致性 270 12.2.3  隔离性 271 12.2.4  耐久性 271 12.3  用Java事务API编程 272 12.3.1  对象事务服务 272 12.3.2  Java事务API 274 12.3.3  JTA和Java事务服务 278 12.4  使用容器管理的事务 278 12.4.1  指派事务属性 279 12.4.2  不要忘记阅读文档 284 12.4.3  事务同步 285 12.5  使用bean管理的事务 286 12.5.1  UserTransaction接口 287 12.5.2  管理事务 289 12.5.3  针对状态会话bean的bean管理        的划分 289 12.6  使用客户机划分的事务 289 12.7  隔离对资源的访问 290 12.7.1  选择隔离级别 290 12.7.2  性能影响 291 12.7.3  程序化地改变隔离级别 291 12.8  疑难解答 292 第13章  异常处理 294 13.1  EJB异常处理 294 13.2  应用程序异常 294 13.2.1  标准的EJB应用程序异常 296 13.2.2  扩展应用程序异常 298 13.3  系统异常 300 13.3.1  标准的EJB系统异常 301 13.3.2  抛出系统异常 302 13.3.3  抛出来自消息驱动bean的异常 304 13.4  异常与事务 304 13.4.1  在事务期间抛出应用程序异常 304 13.4.2  在事务期间抛出系统异常 307 13.5  包装异常 309 13.6  疑难解答 309 第14章  安全性设计和管理 311 14.1  应用程序安全的重要性 311 14.2  理解应用程序的安全性要求 311 14.2.1  物理上的分隔层 312 14.2.2  基于用户名/密码的用户级访问 313 14.2.3  所使用的不同厂商产品 313 14.2.4  所使用的敏感和非敏感数据 313 14.3  安全性的基本概念 313 14.3.1  身份验证和授权 314 14.3.2  数据的完整性 314 14.3.3  机密性和数据保密 314 14.3.4  认可 315 14.3.5  主体和用户 315 14.3.6  主题 315 14.3.7  证书 315 14.3.8  组和角色 315 14.3.9  访问控制列表和权限 316 14.3.10  安全性区域 316 14.4  Java安全性基础 316 14.4.1  Java ClassLoader 318 14.4.2  权限类 318 14.4.3  Java SecurityManager 318 14.4.4  AccessController类 318 14.4.5  AccessControlContext类 319 14.4.6  特许代码 319 14.5  随同EJB和J2EE使用安全性 320 14.5.1  使用纲领安全性 321 14.5.2  使用说明安全性 323 14.5.3  在部署描述符中指定标识 326 14.5.4  将部署角色映射到物理环境 326 14.6  拟订拍卖安全性 327 14.6.1  创建拍卖安全性区域的模式 328 14.6.2  设计安全性区域的访问 330 14.6.3  在Web层中使用安全属性 331 14.6.4  传播主体 335 14.7  Java身份验证和授权服务 335 14.7.1  身份验证 335 14.7.2  授权 336 14.7.3  JAAS核心类 336 第15章  部署 340 15.1  部署描述符和EJB角色 340 15.2  bean提供者的责任 341 15.2.1  全体文件结构 341 15.2.2  enterprise-beans元素 342 15.2.3  relationships元素 348 15.2.4  assembly-descriptor和ejb-client-jar        元素 350 15.3  应用程序集中者的责任 350 15.3.1  assembly-descriptor元素 350 15.3.2  修改enterprise-beans条目 354 15.4  部署者的责任 355 15.5  包装EJB 356 15.6  疑难解答 356 第二部分  设计与性能 第16章  EJB设计的范式和策略 359 16.1  什么是范式 359 16.2  EJB策略 360 16.3  设计EJB类和接口 360 16.3.1  设计粗粒度企业bean 360 16.3.2  使用商业方法接口 361 16.3.3  使用回调方法的抽象超类 365 16.3.4  使用容器管理的事务 367 16.4  管理客户机访问 367 16.4.1  会话bean外观 367 16.4.2  将视图对象返回客户机 368 16.4.3  引用客户机中的Home和组件接口 370 16.5  在EJB中实现一个孤子 371 16.6  疑难解答 372 第17章  性能 373 17.1  性能在设计中的作用 373 17.2  最小化远程调用 374 17.3  优化实体bean的持久性 376 17.3.1  选择CMP实现 376 17.3.2  必要时仅执行ejbStore 377 17.3.3  为BMP从属对象使用Lazy Loading 378 17.3.4  使用只读实体bean 380 17.4  构建拾取列表 381 17.5  管理事务 383 17.5.1  事务划分 383 17.5.2  隔离级 384 17.6  疑难解答 384 第18章  应用程序的性能和负载测试 385 18.1  为什么进行应用程序的负载测试 385 18.2  bean的性能测试 386 18.3  bean的负载测试 388 18.4  使用ECperf  1.0 392 18.5  疑难解答 392 第三部分  构建Web层 第19章  为EJB构建表示层 395 19.1  表示层的不同类型 395 19.2  使用外观范式来隐藏EJB 396 19.3  随同EJB使用Servlet和JSP 401 19.4  使用JSP标记库 406 19.5  使用Strut开放源码Framework 406 19.6  在Web服务器或状态会话bean中      高速缓存 406 第四部分  高级概念 第20章  分布性和EJB互用性 409 20.1  互用性概述 409 20.2  可移植性与互用性的对比 409 20.3  EJB 2.0互用性的目的 409 20.4  CORBA与EJB的关系 410 20.5  远程调用互用性 411 20.5.1  GIOP和IIOP协议 411 20.5.2  IIOP之上的RMI 411 20.5.3  使用双向GIOP 412 20.5.4  远程接口和CORBA IDL 412 20.5.5  根和客户机视图类 412 20.6  事务互用性 413 20.6.1  CORBA的对象事务服务 413 20.6.2  对于不支持事务互用性的        容器的要求 413 20.7  命名互用性 413 20.8  安全互用性 414 20.8.1  容器之间的安全互用性 414 20.8.2  使用IIOP传播主体和授权数据 414 第21章  水平服务 415 21.1  什么是水平服务 415 21.2  由EJB提供的水平服务 418 21.3  传统购买与构建分析的对比 418 21.4  拍卖实例中的水平服务 419 21.4.1  拍卖的记录服务 419 21.4.2  拍卖的电子邮件支持服务 420 21.5  构建拍卖的记录服务 420 21.5.1  开发记录结构 421 21.5.2  创建记录API 422 21.5.3  创建记录SPI 428 21.5.4  构建两个记录服务实现 430 21.5.5  可用的商业记录服务 440 21.6  Java 1.4记录API 440 21.7  构建电子邮件水平服务 441 21.7.1  构建电子邮件水平服务 441 21.7.2  构建电子邮件API 442 21.7.3  构建电子邮件服务的消息         驱动bean 447 21.7.4  配置电子邮件所需的属性 450 21.8  疑难解答 452 第22章  EJB群集概念 454 22.1  太多不一定是件好事 454 22.2  什么是群集 454 22.2.1  可伸缩性 455 22.2.2  高可用性 455 22.3  在Web层中群集 456 22.4  在EJB层中群集 457 22.4.1  群集命名服务 457 22.4.2  群集无状态会话bean 458 22.4.3  群集实体bean 458 22.4.4  群集状态会话bean 458 22.4.5  群集JMS 458 22.4.6  群集JDBC连接 459 22.5  单VM结构与多VM结构的对比 459 第23章  EJB 2.0编程限制 460 23.1  限制的目的 460 23.2  EJB 2.0的限制 460 23.2.1  不能使用读/写静态字段 460 23.2.2  使用线程和同步 461 23.2.3  java.io包的使用限制 462 23.2.4  套接字的使用限制 463 23.2.5  Reflection API的使用限制 463 23.2.6  类装载器和安全管理器的使用        限制 463 23.2.7  AWT输入/输出的使用限制 463 23.2.8  本地库的使用限制 464 23.2.9  this引用的使用限制 464 23.3  小结 464 第五部分  附   录 附录A  EJB 2.0 API 465 附录B  自EJB 1.1的变化 480 附录C  光盘中的内容 483

教学资源推荐
作者: 周纯杰 何顶新 周凯波 彭刚 张惕远 编著
作者: (美)Y.Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
作者: 刁成嘉 刁 奕
参考读物推荐
作者: 张良均 谭立云 刘名军 江建明 著
作者: Richard Anderson Chris Blexrud
作者: [美]约书亚·伍德(Joshua Wood),[美]布赖恩·坦努斯(Brian Tannous) 著