JBoss是优秀的J2EE服务器产品,以其开放源代码的性质和出色的特性,成为最受Java开发者欢迎的J2EE服务器产品。本书分为3大部分,共9章,内容基于JBoss的EJB与Web Services开发展开,包括JBoss概览、开发工具、实体Bean的开发、会话Bean的开发、消息队列的开发、XML模式、理解Web Services、基于SOAP的Web Services开发和JBoss.net。
本书供Java程序员、专业的软件开发人员阅读,丰富的代码例程为广大程序员提供了实战指南。
第1部分 J80SS基础
第1章 JBOSS概览 3
1.1 ⅡBOSS简介 3
1.1.1 JBoss的历史 3
1.1.2 JBoss组织 3
1.1.3 JBoss与J2EE 4
1,1.4 JBoss与WebServices 4
1.1.5 JBoss的未来 5
1.2 熟悉ⅡBoss 5
1.2.1 启动JBOss 6
1.2.2 JBoss的目录结构 11
1.2.3 JBoss的Web服务器 12
1.2.4 JBoss的热部署 13
1.3 JBOSS的实现 14
1.3.1 JMX技术 14
1.3.2 JBoss的JMX微处理器 16
1.3.3 JBoss的插件结构 26
1.4 JBOSS的扩展 27
1.4.1 开发自定义MBean插件 27
1.4.2 打包.sar文件 28
1.4.3 JBoss对MBean的分布式支持 29
1,5 XMessenger消息系统 30
1.5.1 关于XMessenger 30
1.5.2 XMessenger的结构 31
1.6 小结 32
1.7 资源 32
第2章 开发工具 33
2.1 EcUpse开发工具 33
2.1.1 Eclipse的安装 33
2.1.2 Eclipse工作台 35
2.1.3 使用Eclipse工具 41
2.2 Ant开发工具 56
2.2.1 Ant简介 57
2.2.2 Ant中的基本概念 58
2.2.3 编写第一个build文件 63
2.2.4 在Eclipse中使用Ant 64
2.3 XDOclet开发工具 。 65
2.3.1 XDoclet简介 65
2.3.2 XDoclet的组成· 66
2.3.3 XDoclet的标记 66
2.3.4 利用XDoclet开发Web程序 68
2.4 JBoss集成开发环境 71
2.4.1 JBossIDE的安装 ” — 71
2.4.2利用JBossIDE控制JBoss 76
2.4.3 利用JBossIDE开发JBoss程序 79
2.5 小结 90
2.6 资源 90
第2部分 EjB的开发
第3章 实体Bean的开发 93
3.1 实体Bean介绍 93
3.1.1 EJB容器 93
3.1.2 实体Bean的生命周期 94
3.1.3 本地接口与远程接口 厂 95
3.1.4 主接口与对象接口 95
3.1.5 实体Bean的类型 96
3。2 开发CMP类型实体Bean 97
’ 3.2.1 实现实体Bean 97
3.2.2描述实体Bean 100
3.2.3部署实体Bean 104
3.2.4 实体Bean的远程调用 105
3.2.5 实体Bean的本地接口 106
3.2.6 实体Bean的Web客户端——Servlet客户端 108
3.2.7 利用JBossIDE开发CMP类型实体Bean 109
3.2.8 EJB的描述 114
3.2.9 JBoss查询语言 123
3.2.10 CMP在JBoss中的描述 126
3.3 实体Bean数据的传递 132
3.3.1 通过值对象传递数据 132
3.3.2 通过XML传递数据 134
3.4 实体Bean的关系 135
3.5 使用MySQL数据库 141
3.5.1 安装MySQL数据库 141
3.5.2 JBoss数据库配置 144
3.6 开发BMP类型实体Bean 146
3.6.1 BMP简介 146
3.6.2 BMP程序实例 147
3.6.3 利用JBossIDE开发BMP 151
3.7 XMessenger组件 157
3.8 小结 157
3.9 资源 157
第4章 会话Bean的开发 158
4.1 会话Bean简介 巧8
4.2 无状态会话Bean 158
4.2.1 会话Bean的远程接口 159
4.2.2 会话Bean的主接口 159
4.2.3 会话Bean的实现类 159
4.2.4 会话Bean的配置文件 160
4.2.5 会话Bean的客户端 162
4.2.6 无状态会话Bean在容器中的状态 163
4.3 有状态会话Bean 163
4.3.1 有状态会话Bean的使用 164
4.3.2 有状态会话Bean在容器中的状态 164
4.4 会话Bean与事务 165
4.4.1,事务简介 165
4.4.2 事务处理的API 166
4.4.3 容器管理事务 167
4.4.4 Bean管理事务 171
4.5 利用JBossIDE开发会话Bean 173
4.6 会话Bean与实体Bean的协作 177
4.7 使用JBOSS邮件服务 180
4.8 小结 182
4.9 资源 182
第5章 消息队列的开发 183
5.1 理解消息队列 183
5.1.1 点对点消息 184
5.1.2 主题消息 185
5.2 JMS消息中的基本概念 185
5.2.1 目的地(Destination) 185
5.2.2 会话(Session) 185
5.2.3 连接(Connection) 186
5.2.4 消息(Message) 186
5.2.5 消息生产者(MessageProducer) 187
5.2.6 消息消费者(MessageConsumer) 187
5.3 编程模式 187
5.4 在JBOSS中建立消息队列 190
5.4.1 部署一个点对点队列 190
5.4.2 部署一个主题队列 191
5.5 简单编程举例 192
5.5.1 点对点消息示例 192
5.5.2 主题消息示例 195
5.6 消息数据 200
5.6.1 消息头(Headers) 201
5.6.2 消息属性(Properties) 203
5.7 消息的应用实例 .; 209
5.7.1 同步的点对点消息 209
5.7.2 持久性的主题消息 210
5.8 调用层 215
5.8.1 RMI调用层 215
5.8.2 OIL调用层 215
5.8.3 UIL调用层 216
5.8.4 JVM调用层 216
5.8.5 HTTP调用层 217
5.9 使用JBoss的HTTP消息通道 217
5.10 JBOSSMQ的配置和管理 218
5.10.1 持久性管理者(PersistenceManager) 218
5.10.2 目的地管理者(DestinationManager) 219
5.10.3 状态管理者(StateManager) 220
5.11 JBOSSMQ的独立使用 222
5.11.1 JBossMQ的目录结构 223
5.11.2 在JBossMQ中部署消息队列 224
5.12 消息驱动Bean的开发 225
5.12.1 监控JBoss内存用量的消息驱动Bean 225
5.12.2 利用JBossIDE开发消息驱动Bean 229
5.13 实现XMessenger的即时通信 235
5.13.1 设计目标 235
5.13.2 用户管理 236
5.13.3 消息传输 239
5.13.4 消息存储 240
5.13.5 用户界面 241
5.13.6 部署J2EE应用程序 242
5.14 小结 244
5.15 资源 244
第3部分 WebServiceS的开发
第6章 XML模式 247
6.1 XMLSchema标准简介 247
6.2 Schema的基本概念 248
6.2.1 命名空间问题 248
6.2.2 一个Schema文档的组成 249
6.3 Schema的组成部分 249
6.3.1 文档元素 249
6.3.2 文档属性 250
6.3.3 简单类型 251
6.3.4 复杂类型 257
6.3.5 注释 259
6.3.6文档模型组 260
6.3.7 文档属性组 261
6.4 Schema的实例 261
6.4.1 编写Schema 261
6.4.2 Schema验证API 263
6.5 XML数据绑定 264
6.6 小结 266
6.7 资源 266
第7章 理解WebServiCeS 267
7.1 面向服务的软件架构(SOA) 267
7.1.1 为什么需要面向服务的软件 267
7.1.2 面向服务中的基本概念 269
7.1.3 Web系统和WebServices是面向服务的实例 269
7.2 WondWideWeb的架构 270
7.3 WebServices架构(WSA) 271
7.3.1 WebServices架构概述 271
7.3.2 WebServices架构中的角色 271
7.3.3 WebServices协议栈的组成 271
7.3.4 重要的结构模型 272
7.3.5 支持WebServices的技术体系 277
7.4 小结 ; 278
7.5 资源 278
第8章 基于SOAP的WebServiCes开发 279
8.1 SOAP的发展过程 279
8.1.1 XML-RPC标准的产生 279
8.1.2 W3C制定的SOAP标准 280
8.2 XML-RPC技术 280
8.2.1 XML-RPC技术标准介绍 280
8.2.2 ApacheXML-RPC实现工具 284
8.2.3 XML-RPC的局限性 294
8.3 使用Axis项目 294
8.3.1 Axis简介 294
8.3.2 开发简单的WebSewices 300
8.3.3 Axis中的WSDL技术 308
8.3.4 在Axis中使用SOAP附件 326
8.4 Axis项目的实现 330
8.4.1 Axis的实现方式 330
8.4.2 Axis的结构实现 334
8.4.3 Axis的安全组件 338
8.4.4 编写自定义Handler来扩展Axis 339
8.5 WSIP技术 342
8.5.1 WSIF简介 343
8.5.2 使用WSIF的调用方式 343
8.6 集成Axis的项目 349
8.6.1 Axis与JBOss.net 349
8.6.2 Axis与GlobusTookit3.0 349
8.7 小结 349
8.8 资源 厂 350
第9章 JBoss.net 351
9.1 JBoss.net介绍 351
9.1.1 JBoss的.net计划 351
9.1.2 JBoss.net当前版本的特性 352
9.1.3 熟悉JBoss.net 353
9.2 JBoss.net与Axis 354
9.2.1 JBoss.net集成Axis的方式 354
9.2.2 JBoss.net对Axis的扩充 355
9.3 从Java类创建WebServices 357
9.3.1 服务类的实现 357
9.3.2 编写部署文件 357
9.3.3 建立WSR压缩包 358
9.3.4 开发服务的客户端 360
9.4 为WebServices添加认证和授权过程 361
9.4.1 JBoss.net中的认证和授权组件 361
9.4.2 带有认证和授权功能的WebServices 366
9.5 基于JMXMBearl的WebServices 369
9.5.1 实现MBean组件 369
9.5.2配置和部署MBean组件 370
9.5.3 描述和部署基于MBean的WebServices 370
9.5.4 SOAP对比RMI的优势 371
9.6 利用EJB开发WebServices 371
9.6.1 开发基于会话Bean的WebServices- 372
9.6.2 在实现WebServices的会话Bean中使用值对象 373
9.6.3 在WebServices中利用实体Bean' 376
9.7 将远程的服务应用到JBoss.net中 379
9.8 利用XDOClet开发WebServices 380
9.8.1 利用XDoclet将会话Bean开发为WebServices' 381
9.8.2 利用XDoclet将JMXMBean开发为WebServices 383
9.9 为XMessenger开发WebServices接口 385
9.10 JBOSS中的UDDI技术 386
9.10.1 UDDI简介 386
9.10.2 UDDl4J工具 389
9.10.3 利用JBoss建立自己的UDDI中心 391
9.11 小结 396
9.12 资源 396
附录A EClipSe常用插件 397
附录B Ant常用任务 401
附录C XDOCIet常用标记 405
自从计算机被引用到商务之中以后,企业计算一直被作为信息计算的皇冠,其重要性是显而易见的。例如每次你在银行存取款,或在商场购物的时候,都存在若干台运行着企业软件的服务器在某个数据中心为你工作。当这些企业软件正常运行的时候,人们通常不会感觉到它们的存在,而一旦它们停止了工作,就会造成灾难性的后果。其中一个很不幸的例子发生在美国的丹佛国际机场,由于机场的行李处理系统在开发过程中不能排除故障,使机场被迫延迟开放了9个月,而机场本身的硬件建设早就完成,这造成了每天110万美元的损失。
这个例子不仅折射出了企业计算的重要性,而且也反映了开发具有稳定可靠的企业应用软件的难度。企业计算的困难是可以理解的,首先,任何企业应用软件必须保证可靠性、安全性和可扩展性,还要易于升级和维护,这每一个独立的需求都对企业计算的建立和部署提出了挑战;其次,大多数的企业应用是复杂的,而且还存在着跨平台、跨公司边界和区域文化的情况。这就引发了一系列的现实问题,例如,如何管理一个大型的软件项目,使其可以及时地发布、合理地规划呢?如何设计一个应用程序的架构,使其可以由一组普通开发者有效地实现呢?如何在跨公司,甚至是跨国家的情况下,解决分歧呢?这些问题已经被研究了多年,但是成果有限。最后,商业环境是动态的,在每个发展阶段中都是变化的,企业希望新的特性可以被不断添加,而且花费是可以接受的。随着新特性的增加,企业应用软件的复杂程度以指数级的速度扩大,新增特性变得越来越困难,最后导致维护这个系统的代价比新建一个系统还大。以上所列举出的问题还仅是企业计算所面临挑战的一部分。
毫无疑问,我们需要借助软件框架,而不是从头做起,这样起码还可以减少一些问题,达到开发者可以控制的程度,J2EE就是可供选择的商业框架之一。在J2EE之前曾出现过许多尝试,其中以CORBA最为著名,这些框架大多是基于分布式对象的,包括J2EE在内。这个想法很简单,既然我们能成功地设计一个“面向对象”技术的单机工作程序,为什么就不能设计一个在分布式环境下的程序呢?解决的方式似乎很简单,就是把远程对象等同于本地对象,如果真那么简单的话,设计框架的工作就已经完成了。然而遗憾的是,远程对象毕竟不是本地对象,将它们等同起来是非常错误的。因此,J2EE与CORBA相比,抛除Sun的市场努力,最成功的因素在于Sun所一贯倡导的容器技术。以Java为例,使Java应用程序可以运行于不同平台之上的主要原因是Java虚拟机为Java对象所提供的支撑环境隐藏了平台之间的不同之处。一个很简单的概念,事实上导致了一个重要的结果,对于开发者来说,第一次可以在开发应用程序时不必在意操作系统和硬件结构。J2EE进一步发展了这个概念,创造了Web容器和EJB容器。正如Java虚拟机使开发者从内存分配的问题中解脱出来一样,J2EE容器使开发者又一次从处理协同、事务、安全、部署和其他相对较难且枯燥的任务中解脱出来,使开发者尽可能把他们的精力花在应用软件上,而且其他的许多任务也可以由不具备这些编程技巧的专业人员来完成。
J2EE的成功是显著的,曾经一度出现了70多个实现J2EE的产品。两年前,一个拥有J2EE技巧的开发者就能够申请到高级管理人员所梦想的收入。随着J2EE技术的成熟,J2EE的市场已经十分稳固了,然而J2EE依旧是构建企业计算的最重要的技术。.NET实际上是微软对J2EE的模仿,这本身是对J2EE最大的恭维。
JBoss是实现:J2EE产品中的后起之秀, 目前以惊人的速度占领了J2EE的市场,事实上,它是三个最具生命力的J2EE实现产品之一。JBoss的成功在很大程度上应该归功于它优秀的架构设计(而不是因为免费),它使用了一个Java管理扩展技术(简称JMX)作为基础的精巧设计,使JBoss包含一个十分微小的内核,在内核的基础上利用JBoss实现的JMX技术进行扩展,这种结构的好处是将JBoss的各个组件变成“服务”,具体通过JMX技术管理的MBean来实现。“服务”之间是松散耦合的关系,以插件的形式部署,甚至还可以在运行时更改,从而使基于JBoss的开发和部署成为十分敏捷的过程。
本书是JBoss和:EJB开发技术的实践指南,书中提供了大量示例,使一个普通的Java开发者不仅可以擅长EJB的开发,而且能够理解和掌握JBoss。
何 浩 博士
软件架构设计师
(作者译)
随着政府和企业各种功能性需求的增加,信息系统的软件规模越来越大,需要花费的资源也越来越多,某些大型的软件项目甚至有几百名开发人员参与,花费几年的时间来完成。这种情况促成了应用服务器软件的发展。应用服务器为建立大型系统提供了基础的技术支持,包括对数据管理、网络通信、安全认证等各种基础技术的实现。应用服务器使新的软件项目可以建立在一些成熟的核心技术成果之上,减轻了新项目开发的负担,缩短了开发周期,还提高了项目实施的可靠性。本书所讲述的JBoss是目前最成功的应用服务器产品之一。
目前的应用服务器软件以符合J2EE开放标准的软件和微软公司的.NET产品为主,JBoss是其中符合J2EE标准的开放源代码的应用服务器软件,与J2EE服务器的商业产品相比,JBoss没有海量的资源投入,没有长期传统项目管理的经验积累,没有漫长的开发周期,却能达到理想的境界,因此,获得了巨大成功。特别是在2002年Java世界的评选中,JBoss击败了BEA和IBM,赢得了“最好的Java应用服务器”大奖。这个仅仅由30个人组成的开发团体所取得的成功,给我们带来了重要的启示。
如何开发较大规模的软件产品,例如JBoss这样的应用服务器软件,关键在于软件架构的设计。当建筑的工艺技巧提高到一定水平之后,建筑物的价值直接依赖于建筑物的设计。当具备同样的电子器件制造水平的时候,芯片的优劣也直接由设计的过程所决定。目前软件的开发技术已经得到了很大的发展,对于软件的开发人员来说,熟练地运用高级语言的开发技巧并不是一件难事,在这种情况下,软件的品质主要依赖于软件的架构设计,依赖于开发人员的“软投入”而不是单纯依靠资源的“硬投入”。随着软件规模的增大,这一点尤为突出。
优秀的软件架构在确保软件系统的安全性、稳定性,尤其是可扩展性方面表现出超然的水准。由于应用服务器软件的开发者和使用者都会不断地开发新的程序单元,并将它们部署到应用服务器的运行环境之中,所以应用服务器是在维护可扩展性的基础上保证系统的安全性和稳定性。JBoss的架构设计利用了Java的管理扩展框架,通过一个可以动态管理组件的微小内核程序,使每一个JBoss的模块都可以在保证系统的安全性和稳定性的条件下被加载到JBoss之中,扩展JBoss的功能。JBoss在架构上借鉴了硬件设计的即插即用机制,借助微小内核的作用,将所有的服务组件都实现为动态管理的JMXMBean组件,无形中建立了一个将各个服务组件联系起来的“软总线”,由于所有的组件都可以动态地“热插拔”,这不仅为开发者带来了便利,同时为增强系统的安全性、稳定性和可扩展性奠定了坚实的基础。
优秀软件架构的设计来源于先进的设计思想。架构的设计虽然没有一定的规律,但是先进的架构模式都体现着先进的设计思想。JBoss项目初期就采用了瑞典人RickardOberg基于动态代理和解释模式思想对EJB容器进行的全新设计,成功之后,JBoss仍在不懈地发展和实现着他的思想。目前处于开发过程中的JBoss4.0项目正在尝试着新的编程思想,产品中包含着JBoss组织对AOP设计思想的研究成果,新的设计思想使JBoss的版本更新不仅仅针对Bug的修正和新功能的增加,而且还会不断地创新设计思想,改进软件架构的过程,在这个过程中不断产生新的思想,这些新思想又不断被开发软件产品的实践过程所检验,在实践检验的过程中又不断地激发出新的思想。正是这个由创新思想推动的开发过程保证了JBoss的品质不断得到提升。在JBoss软件中,创新而独特的设计思想随处可见,例如拦截器在事务处理过程中的作用,服务式的组件管理方式,有效的缓存设计等。难怪JBoss的创始人MarcFleury会称JBoss为艺术级别的EJB实现产品。
从JBoss这样成功的项目中得到的另一个重要的启示是软件标准的作用。目前,软件业的国际标准已经完全不同于机械工业标准中对于某些参数的规定,而是发展为对于设计思想的完善。W3C,OASIS等一些著名的国际标准化组织中集合了许多来自于世界各地的软件架构设计师,共同制定出规范的国际标准文档,从这些标准中可以直接汲取先进的设计思想,例如JBoss所利用的EJB标准,其标准内容中的CMP类型实体Bean、会话Bean、事务处理等很多内容都为开发者建立应用系统进行了设计和分工,使相对独立的EJB组件在EJB容器中以松散的方式协同工作,并且可以随意地添加和升级。这些EJB标准的特点在JBoss中被十分清晰地表现出来,而且JBoss还在不断地跟进标准的最新版本,这也是JBoss取得成功的原因之,。另一方面,标准的实现产品也向使用者解释着标准的内容,不同的开发商通过不同的软件架构来实现同一个标准,达到的效果也不同,JBoss利用自己独特的架构设计实现了EJB标准,向使用者最好地展示了EJB的魅力。
总之,JBoss项目展示了一种创造成功软件的方法:通过对设计思想的创新,建立先进的软件架构,逐步实现软件的各个模块,把创新的设计融入到实现的产品之中。要运用这种方法,重要的是对技术要有深刻洞察力和敏锐的判断力。JBoss的成功同时也证明了通过技术创新可以战胜国外的软件巨人,实现核心自主技术的产品。
参与本书写作的还有:魏荣凯、张敬华、刘晓光、张玉芝和魏复华。在此,要感谢吉林大学的鞠九滨教授、徐高潮教授在学习上的指导,感谢中国科学院陈德泉教授长期以来的指点和帮助,感谢何浩博士两年来的言传身教。
限于作者水平,书中定有许多不当之处,敬请读者不吝赐教。