`
yangzhiyong77
  • 浏览: 946462 次
文章分类
社区版块
存档分类
最新评论

精通SOA:基于服务总线的Struts+EJB+WebService整合应用开发(网上书店系统 - SOA实施)

 
阅读更多

目前全球最大的软件服务商IBM在实施SOA方面一直处于领先地位,因此通过介绍如何用IBM的服务总线产品来构建SOA架构更能使开发人员把握SOA的精髓。

服务总线是实现SOA架构最核心的部分,它将对系统内部或者外部的各种服务进行集成和管理。目前IBM基于企业服务总线的产品有Websphere 6.0上自带的SIBusService Integration Bus,由于它已经和Websphere集成在一起,从而使它可以应用Websphere所带有的各种资源。从对这个产品的实施中,我们可以观察到它实施服务总线(ESB架构的技术思路主要是通过消息引擎来驱动的。SIBusBEAAqulogic服务总线多了一个消息层,也就是读者将要在下面章节中看到的目标(Destination),SIBus是通过消息队列Queue或者Topic等来实现的这是服务总线中最核心的部分,笔者十分看好其技术前景。本章将通过一个网上书店的实例详细介绍如何基于IBM Websphere SIBus服务总线来构建SOA架构体系的整合应用,包括下面几个方面的内容。

l 基于企业服务总线SIBus构建SOA架构的基本原理。

l 创建网上书店系统的DB2数据库。

l 创建网上书店系统的组件架构。

l 创建网上书店的实际业务流程和实现步骤。

l Websphere RAD创建网上书店的业务模型服务组件,包括Session BeanCMPWeb Service

l 详细介绍构建基于SIBus服务总线的SOA架构的服务集成系统的步骤。

l 介绍如何实现服务总线和Struts用户界面的集成。

8.1 基于企业服务总线SIBus构建SOA架构的基本原理

以服务为导向的SOA架构体系是通过业务来驱动的,它通过业务来驱动服务,再通过服务来驱动技术。所以本节首先介绍网上书店系统的业务需求;接下来介绍网上书店系统的SOA实施,主要是如何划分服务接口,以形成一个松散耦合的服务系统;进一步介绍本章基于企业服务总线SIBus实现SOA的架构体系。

8.1.1 网上书店系统业务需求

网上书店系统的业务需求如下。

有一家大型的图书公司希望进一步拓宽市场渠道,计划创建一个自己的网上书店。这个网上书店主要包括下面几个子系统功能,下面从大的方面来介绍一下此网上书店系统应有的功能。

l 注册系统:用于用户注册和保存用户信息。

l 登录系统:用于用户登录校验。

l 用户查询系统:用来查询系统里有多少用户。

l 账户管理系统:用于管理用户资金账户,以便实现网上交易。

l 图书管理系统:用来管理系统中的图书,主要是往系统里加入新书。

l 图书查询系统:提供界面以便用户查询系统中的图书。

l 购物车:创建用户购书订单,实现实时网上交易。

上面只是这家图书公司对网上书店的功能需求,这家公司的其他业务考量如下。

公司下面有3个独立的部门:图书管理部门客户管理部门销售部门。每个部门都有自己一套独立的IT系统,提供自己独立的服务。

从成本和时间的角度出发,这家公司希望能重用3个部门的业务服务系统,将它们整合起来,快速创建一个网上书店。

1、由于内部工作业务的关系,每个部门的服务器的地址可能会经常发生改变

2、另外也由于内部业务工作的需要,每个部门服务接口方法的名字可能会发生变化以客户身份校验为例,checkUser可能会变为checkLogin等。处于业务工作的需要,

3、这3个部门要隐藏自己的服务器的地址和传输协议,不希望被外部用户直接访问到。

最后所开发成功的网上书店系统如图8-1所示。

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1158" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image091.jpg" style='width:4in; height:240.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.jpg" o:title="image091" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image091.jpg

8-1 网上书店系统主页

8.1.2 网上书店系统SOA实施

SOA实施规划是最关键的。SOA的出发点完全不同于现有的建模和组件的出发点。现有的软件实施也是实际项目中的真实情况:软件的设计和开发人员在拿到业务需求后,马上就会想到是不是需要用到StrutsMVC架构,是用EJB还是用Hibernate,要不要用Web Service,使用什么样的应用服务器和数据库的服务器等。然后开始建模,并用程序设计语言和业务分析人员进行沟通,最后将业务需求分散为很多业务小点,一个个塞到各个软件模块之中。这样使得业务处于一个从属于技术和模块之下的地位,业务和技术紧紧地捆绑在一起。

笔者在做项目的过程中,深深体会到各个企业其实非常不希望自己的业务和技术紧密地捆绑在一起,它们非常担心它们所选中和应用的技术一旦被淘汰了,它们的业务服务也会跟着被淘汰

SOA实施是以业务服务为导向的,业务服务独立于技术之上,技术处于从属的地位,一旦某种技术过时了,企业的业务服务可以很快切换到其他新的技术。

下面是SOA实施的过程。

1)根据前述的SOA的第一个标准,结合图书公司的现状,将网上书店的业务分散为3个松散耦合的子服务系统,每个子服务系统中的服务可以是相关的,但是每个子服务系统之间完全是松散耦合的。实际上是3个服务接口:图书管理服务接口、客户管理服务接口和订单服务接口

2)从现有的3个部门的IT服务中整理和归纳出相应的服务接口方法,根据前述的SOA的第二个标准,这些服务接口的方法是粗粒度的,最接近实际业务服务本身。如图8-2所示为服务接口方法划分。

<!--[if gte vml 1]><v:shape id="图片_x0020_2" o:spid="_x0000_i1157" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image092.gif" style='width:296.25pt; height:70.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gif" o:title="image092" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image092.gif

<!--[if gte vml 1]><v:shape id="图片_x0020_3" o:spid="_x0000_i1156" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image093.gif" style='width:294pt; height:68.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image003.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image003.gif" o:title="image093" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image093.gif

<!--[if gte vml 1]><v:shape id="图片_x0020_4" o:spid="_x0000_i1155" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image094.gif" style='width:193.5pt; height:60pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gif" o:title="image094" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image094.gif

8-2 根据SOA的要点划分服务接口

上面已经完成了本章8.1.1节所述的SOA的两个要点,剩下的要点3就需要服务总线来完成了。

8.1.3 基于企业服务总线SIBus的网上书店SOA架构

在完成上面的SOA实施的两步后,包括一系列的数据库开发、EJB开发后(后面章节将详细介绍),3个服务接口将会产生3个独立的服务接口,独立运行。具体来说,这里将产生3个独立的Web Service服务接口然后将3个服务接口加入SIBus服务总线通过服务总线将3个服务接口进行整合所有的网上书店业务请求都通过Struts Web应用发给服务总线服务总线根据不同请求,进行相应的转换;再判断不同的请求类型,路由给不同的服务接口。

这里的3个服务的具体实现、位置和传输协议对调用者来说都是透明的,因为前台Web应用只和SIBus服务总线打交道,把所有的业务请求都发给服务总线SIBus,完全不知道这3个具体服务的存在。此外SIBus还提供了消息中介的功能,如有需要,可以对输入参数、传输协议和返回结果根据业务需要进行相应的修改。这样就实现了前述的SOA要点3

此外SIBus可以对所提供的服务进行监控和监听并能以入站服务的方式将所提供的服务以标准的Web Service发布给外部并提供相应的WSDL文件。图8-3是本章实例所实现的基于企业服务总线SIBus的网上书店SOA架构。在这个架构中,服务总线上的端点监听器将负责接收所有的客户端的请求消息,它实际上是对应的入站服务。由于事先在创建入站服务时已经创建了它在接收请求消息时所要转向的目标,所以请求消息将会转给目标,目标在收到请求消息后通过事先创建的默认转发路由路径转给出站服务,出站服务将请求消息转给外部服务提供者,这里的外部服务接口分别为图书管理服务接口、用户管理服务接口和订单管理服务接口。具体的实现步骤后面将会详细介绍。

<!--[if gte vml 1]><v:shape id="图片_x0020_5" o:spid="_x0000_i1154" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image095.gif" style='width:292.5pt; height:186.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image005.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image005.gif" o:title="image095" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image095.gif

8-3 本章实例所实现的SOA服务总线架构图

以上已经完成了网上书店系统的SOA实施和架构,下面的章节将详细介绍具体的实现过程。

8.2 创建网上书店系统的DB2数据库

数据库是网上书店系统的底层,用来持久保存网上书店系统的所有相关业务数据,这里首先予以介绍。

8.2.1 创建数据库的脚本

下面是在DB2创建数据库表结构的详细脚本,参见如下代码。

-- 1. 创建表bk_sequence_num,用来保存其他表的最大主键值

create table bk_sequence_num (

index_num int not null default 0, --主键,必填,默认值为0

max_user_id int not null default 0, --最大用户序号,必填,默认值为0

max_book_id int not null default 0, --最大图书序号,必填,默认值为0

max_account_id int not null default 0, --最大用户账户序号,必填,

默认值为0

max_order_id int not null default 0, --最大购书序号,必填,默认值为0

--定义index_num为主键

constraint pk_sequence_num primary key (index_num)

);

-- 2. 初始化表bk_sequence_num

insert into bk_sequence_num values(0,0,0,0,0); --将所有的初始序号都定为0

-- 3. 创建表book,用来保存图书的信息

create table book (

book_id int not null default 0, -- 图书号,必填,默认值为0

book_name varchar(50) not null, -- 图书名,必填

book_content varchar(750) not null, --图书内容,必填

author varchar(20), --笔者

press varchar(50), --出版社

publishing_date date, --出版日期

ISBN varchar(20), --书号

unit_price decimal(10,2) not null, --单价

discount decimal(10,2) not null, -- 折扣

constraint pk_book primary key (book_id) -- 定义book_id为主键

);

-- 4. 创建表order,用来保存用户每次购买的总的信息,如总价等

create table order (

order_id int not null default 0, --购书号,必填,默认值为0

userid int not null, --用户号,必填

total_price decimal(10,2), --总价

tax decimal(10,2), --

order_time timestamp, --购买时间

constraint pk_order primary key (order_id), --定义order_id为主键

-- 定义userid为外键

constraint fk_order foreign key (userid) references user (userid)

)

-- 5. 创建表order,用来保存用户每次购书的购书明细,每一种书的购买情况

create table order_item (

order_item_num int not null, -- 购书明细号,必填

order_id int not null, -- 购书号,必填

book_id int not null, -- 图书号,必填

quantity int not null, -- 对应于一种书的数量,必填

discount decimal(10,2), --对应于一种书的折扣

--定义order_idorder_item_num为主键,此表有多个主键

constraint pk_order_item primary key (order_id,order_item_num),

constraint fk_order1 foreign key (order_id) references

order(order_id), --定义外键

--定义外键

constraint fk_order2 foreign key (book_id) references book(book_id)

)

-- 6. 创建表user,用来保存用户的相关信息

create table user (

userid int not null, --用户号,必填

login_name varchar(20) not null, --用户登录名,必填

name varchar(50) not null, --用户姓名,必填

password varchar(20), --用户登录密码

phone varchar(20), --用户的电话号码

email varchar(20), --用户email

createTime TIMESTAMP default current timestamp,-- 用户的创建时间

constraint pk_user primary key (userid), -- 定义userid为主键

);

-- 7. 创建表account,用来保存用户账户的相关信息

create table account (

accountid int not null, -- 账户号

userid int not null, -- 用户号

registrationFee decimal(10,2) not null,-- 注册费、资金结余

--定义accountiduserid为主键,此表有多个主键

constraint pk_account primary key (accountid,userid),

--定义外键

constraint fk_account foreign key (userid) references user (userid)

);

8.2.2 数据库的ERWin数据库图

ERWin是实际项目中最常用的数据库表结构关系的设计工具,下面介绍基于ERWin的数据库图,它包括物理(Physical)图,即实际的数据库图;逻辑(Logical)图,即逻辑的易懂的视图。

1.物理(Physical)图

本章的数据库的ERWin物理图如图8-4所示,它是数据库的真实反映。

<!--[if gte vml 1]><v:shape id="图片_x0020_6" o:spid="_x0000_i1153" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image096.jpg" style='width:366pt; height:252pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.jpg" o:title="image096" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image096.jpg

8-4 数据库的ERWin物理图

2.逻辑(Logical)图

本章的数据库ERWin的逻辑图如图8-5所示,它可以让开发者更好地理解业务,和真实的数据库表是一一对应的关系。

<!--[if gte vml 1]><v:shape id="图片_x0020_7" o:spid="_x0000_i1152" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image097.jpg" style='width:352.5pt; height:243pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image007.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image007.jpg" o:title="image097" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image097.jpg

8-5 数据库ERWin的逻辑图

8.2.3 DB2上创建数据库表

本章所创建的数据库表如图8-6到图8-10所示。

1USER——记录用户详细信息

<!--[if gte vml 1]><v:shape id="图片_x0020_8" o:spid="_x0000_i1151" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image098.jpg" style='width:342.75pt; height:156pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.jpg" o:title="image098" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image098.jpg

8-6 DB2USER

2ACCOUNT——记录用户资金账户信息

<!--[if gte vml 1]><v:shape id="图片_x0020_9" o:spid="_x0000_i1150" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image099.jpg" style='width:309pt; height:138pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image009.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image009.jpg" o:title="image099" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image099.jpg

8-7 DB2ACCOUNT

3BOOK——记录图书的详细信息

<!--[if gte vml 1]><v:shape id="图片_x0020_10" o:spid="_x0000_i1149" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image100.jpg" style='width:294pt; height:171.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.jpg" o:title="image100" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image100.jpg

8-8 DB2BOOK

4ORDER——记录用户每次购买的总的信息

<!--[if gte vml 1]><v:shape id="图片_x0020_11" o:spid="_x0000_i1148" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image101.jpg" style='width:289.5pt; height:124.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image011.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image011.jpg" o:title="image101" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image101.jpg

8-9 DB2ORDER

5ORDER_ITEM——记录用户每次购买的详细信息

<!--[if gte vml 1]><v:shape id="图片_x0020_12" o:spid="_x0000_i1147" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image102.jpg" style='width:309.75pt; height:120pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image012.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image012.jpg" o:title="image102" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image102.jpg

8-10 DB2ORDER_ITEM

网上书店系统 - SOA实施(一)

2008-05-05 13:54

8.3 网上书店组件设计架构

上述的SOA架构是从一个宏观的架构进行设计,具体实现时,还需要基于SOA架构进行具体的模块和组件架构设计,SOA是从业务功能来划分的。这里进一步介绍模块组件设计架构,以便读者对本章的网上书店系统有一个全面的了解。

1.组件图

Rational Rose是实际项目中最常用的设计工具。图8-11是基于Rational Rose的组件图,它反应整个应用所使用的技术。

<!--[if gte vml 1]><v:shape id="图片_x0020_25" o:spid="_x0000_i1146" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image103.gif" style='width:129.75pt;height:264.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image013.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image013.gif" o:title="image103" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image103.gif

8-11 网上书店的组件图

l JSP组件:负责页面显示。

l Struts Action Bean:控制器部分,负责页面层和逻辑层的结合,以及页面转换。

l ClientManagerImp:负责调用后台服务的组件。

l SOA Service Integration BusSOA服务总线。

l Web ServiceWeb服务组件。

l Session Bean:负责业务逻辑。

l Entity Bean CMP:负责数据库层的操作。

2Class类图

8-12是基于Rational Rose所设计的网上书店系统的总的类图。

<!--[if gte vml 1]><v:shape id="图片_x0020_26" o:spid="_x0000_i1145" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image104.jpg" style='width:350.25pt;height:420.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image014.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image014.jpg" o:title="image104" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image104.jpg

8-12 网上书店的类图

8.4 网上书店的业务和时序图

为了让读者尽快掌握创建SOA应用的方法和步骤,下面详细介绍各个服务接口是如何实现的,包括介绍业务需求、时序图和实现步骤,使读者能尽快掌握精髓,运用到实际项目中去。

8.4.1 注册系统业务和时序图

用户需要通过注册系统来将他们的有关个人信息登记到网上书店系统中,这些个人信息是用户购书时需要的。下面将介绍具体的业务需求及实现步骤。

1.注册系统业务需求简介

做任何一个项目首先需要知道具体的业务,下面首先介绍注册系统总的业务需求。

1提供用户界面给用户,输入他们的Name(姓名)、Login Name(登录名)、Password(密码)、Phone(电话号码)、E-mailRegistration Fee(注册费)。

2提供用户界面的输入校验。

l 所有字段不能为空。

l 登录名和密码不能少于5个字符。

l 电话号码必须按888-888-8888的格式输入。

l E-mail必须按aaa@aaa.com的格式输入。

l 注册费必须输入数字。

3用户填完注册信息,单击【Save】按钮之后,所有的用户信息将会记录到数据库USER表和ACCOUNT表中。

4用户注册成功后系统将给出成功注册的信息

2.注册系统业务及实现

下面是本章所实现的业务详解。

1)用户输入个人信息后,系统进行页面校验。

这里通过StrutsValidator来实现页面校验,返回具体的错误信息让用户修正,如图8-13所示,在Web应用项目的WEB-INF/bkstore目录下面的bkstore- validation.xml文件中定义了对该页面的所有字段的校验规则。

页面显示层是通过Regis.jsp来实现的,业务逻辑是通过Action Bean- RegistrationAction调用模型层来实现的。

<!--[if gte vml 1]><v:shape id="图片_x0020_27" o:spid="_x0000_i1144" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image105.jpg" style='width:215.25pt;height:231.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image015.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image015.jpg" o:title="image105" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image105.jpg

8-13 注册页面校验错误

2)用户根据提示的错误信息输入正确的信息。

用户输入正确的信息,如图8-14所示,页面校验通过,Action Bean将会把用户所输入的保存在Form Bean中的用户个人信息取出,存入到UserAccountDTO对象中,进而调用BookStoreMgrImp对象中的saveUserInfo方法,以调用SOA的服务总线的入站服务方法,最后将用户个人信息存入到数据库。

<!--[if gte vml 1]><v:shape id="图片_x0020_28" o:spid="_x0000_i1143" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image106.jpg" style='width:201.75pt;height:215.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image016.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image016.jpg" o:title="image106" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image106.jpg

8-14 注册页面输入正确信息

3)用户注册成功后系统将给出成功注册的信息。

用户个人信息存入到数据库后,Action Form经过ActionMappingforward方法将页面消息输出到页面,在ActionMessages对象中定义一个注册成功的消息,如图8-15所示。真正的消息内容在资源文件中,而在ActionMessages对象中存入的是一个成功信息的关键词。

<!--[if gte vml 1]><v:shape id="图片_x0020_29" o:spid="_x0000_i1142" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image107.jpg" style='width:243.75pt;height:119.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image017.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image017.jpg" o:title="image107" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image107.jpg

8-15 注册页面成功

4)查看数据库USER表,如图8-16所示,检查用户的注册信息是否已经记录到数据库中。

<!--[if gte vml 1]><v:shape id="图片_x0020_30" o:spid="_x0000_i1141" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image108.jpg" style='width:315.75pt;height:75.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image018.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image018.jpg" o:title="image108" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image108.jpg

8-16 数据库USER

5)查看数据库ACCOUNT表,如图8-17所示,检查用户的注册信息是否已经记录到数据库中。

<!--[if gte vml 1]><v:shape id="图片_x0020_31" o:spid="_x0000_i1140" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image109.jpg" style='width:227.25pt;height:72.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image019.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image019.jpg" o:title="image109" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image109.jpg

8-17 数据库ACCOUNT

3.实现注册系统时序图

8-18是实现业务的时序图,显示了实现上述业务逻辑时的类之间的调用顺序关系。

<!--[if gte vml 1]><v:shape id="图片_x0020_32" o:spid="_x0000_i1139" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image110.gif" style='width:387pt;height:146.25pt;visibility:visible' o:gfxdata="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 OiBNaWNyb3NvZnQgT2ZmaWNlACH5BAEAAAAALAoABADhAaQAhwAAAAAAAA0JBgIECAkEAgcJDA0L CAQCBgsLDAcJCAQAAAAABAkLCAACBg0HBAICAgkLDAQEAgQHDA0LCgIGCgAECAAAAgICAAQABAsG AgQECAkEAAsGBAQHCgsJDAcCAA0HBgsGBgQHCAcHBgIABAQGCgIAAAkEBAsHBAICBgsLCgcEBgQE BgkHDAkGBgkGBAACAgQEBA0JCgkHBAAEBAkGAgIAAgcEAAcCAgIGCAsLCAcCBAkJBgcJCgsHCgQC BAcGAgIGBgQEAAAAIgAARAArIgArZgBVRABVZgBViCsAACsAIisARCsrACsrIisrZitVRCtViCuA ZiuAiCuAqlUAAFUAIlUARFUrRFUrZlVVAFVVIlVVRFWAZlWAqlWqiFWqqlWqzJkAM4ArAIArIoAr RIBVAIBVIoBVZoCAIoCARICAqoDUiIDUqoDUzKpVAKpVIqpVRKqAIqqqRKrUZqr/iKr/qqr/zNSA ItSARNSqRNTUZtTUiNTUzNT/iNT/qtT/zP+qRP+qiP/UZv/Uqv//iP//qv//zP///wECAwECAwEC AwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwEC AwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwEC AwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwEC AwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwEC AwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwEC AwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwECAwEC AwECAwECAwj/AAEIHEgQgBgxBRMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIENmPCiQpMiTKFOq XMmypcuXMGOuRDiQpsybOHPq3MmzJ8+DQIMKHUq0aNGFNmt2NMq0qdOkBZ9KnUpVKtKqWLM6vaq1 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 "> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image020.png" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image020.png" o:title="" /> <o:lock v:ext="edit" aspectratio="f" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image110.gif

8-18 注册系统时序图

4.注册系统具体实现步骤

下面是实现如图8-18所示的时序图的具体步骤。

1)用户单击“URL Regis.do”链接时,StrutsActionServlet通过config.xml的配置将会指向Regis.jsp的页面。

2)用户填写完注册信息后单击【Submit】按钮时,Struts会通过config.xml的配置调用RegistrationAction类的execute()方法,并将用户的信息存到UserAccountDTO类中。

3RegistrationAction类的execute()方法调用BookStoreMgrImp类的saveUserInfo()方法。

4BookStoreMgrImp类的saveUserInfo()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses的入站服务

5Service Integration Buses的入站服务调用相应的Web Service

6Web Service调用Session BeanBKStoreMgrsaveUserInfo()

7Session Bean调用Entity Bean CMPUserCMP)。

8.4.2 登录系统业务和时序图

本系统是通过登录系统来实现安全管理的,有些页面(如购物车)只有用户登录后才能进入。下面将介绍具体的业务需求及实现步骤。

1.登录系统业务需求简介

下面是登录系统业务需求简介。

1)创建用户的登录界面。

2)对用户的用户名和密码进行校验。

3)如用户登录失败,则需要输出错误信息。

4)如用户登录成功,则输出成功信息,并保留用户Session,因而用户登录其他页面(如Shopping Cart购物车)时不需要再次登录。

2.登录系统业务及实现

下面是本章所实现的登录系统业务详解及实现。

1)进入登录界面。

页面显示层是通过Login.jsp来实现的,如图8-19所示,业务逻辑是通过Action Bean- LoginAction调用模型层来实现的。

<!--[if gte vml 1]><v:shape id="图片_x0020_33" o:spid="_x0000_i1138" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image111.jpg" style='width:226.5pt;height:152.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image022.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image022.jpg" o:title="image111" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image111.jpg

8-19 “登录界面

2)用户输入一个系统没有注册的用户名时,系统会提示相应的错误。

程序回到后台数据库通过CMP来查询是否在数据库中有该用户名,通过findByLoginName的方法来查询。如果通过findByLoginName查不到任何记录,表示没有该loginName,服务器端会将该错误作为异常抛出到Action BeanAction Bean截获该异常后,取出异常信息。该异常信息只是错误信息的关键词,程序将会从字样资源文件中取出该错误信息,输出到前台页面,如图8-20所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_34" o:spid="_x0000_i1137" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image112.jpg" style='width:231.75pt;height:153pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image023.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image023.jpg" o:title="image112" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image112.jpg

8-20 输入未注册用户名

如果输入一个系统中没有的用户名时,将会出现如图8-21所示的错误。

<!--[if gte vml 1]><v:shape id="图片_x0020_35" o:spid="_x0000_i1136" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image113.jpg" style='width:244.5pt;height:123pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image024.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image024.jpg" o:title="image113" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image113.jpg

8-21 用户名不对或未注册造成的错误登录界面

3)用户输入的用户名和密码不匹配时会输出错误信息。

程序回到后台数据库通过CMP来查询是否在数据库中有该用户名和密码,通过findByLoginName的方法并以loginName作为参数来查询。找出一个记录,从该记录中取出对应的密码,如果和输入的密码不一致,如图8-22所示,则服务器端抛出用户输入的用户名和密码不匹配的异常,Action Bean截获该异常后,输出到前台页面。

<!--[if gte vml 1]><v:shape id="图片_x0020_36" o:spid="_x0000_i1135" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image114.jpg" style='width:230.25pt;height:152.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image025.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image025.jpg" o:title="image114" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image114.jpg

8-22 输入用户名与密码不匹配

因为输入的用户名存在,但是密码不正确,所以页面输出下列错误,如图8-23所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_37" o:spid="_x0000_i1134" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image115.jpg" style='width:252pt;height:124.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image026.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image026.jpg" o:title="image115" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image115.jpg

8-23 用户名和密码不一致的错误信息界面

4)用户输入正确的用户名和密码。

程序回到后台数据库通过CMP来查询是否在数据库中有该用户名和密码,通过findByLoginName的方法并以loginName作为参数来查询。找出一个记录,从该记录中取出对应的密码,如果和输入的密码一致,则服务器端返回true到前端,Action Bean接到返回值后,通过资源文件输出校验正确的信息到前台页面,如图8-24所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_38" o:spid="_x0000_i1133" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image116.jpg" style='width:270pt;height:132pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image027.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image027.jpg" o:title="image116" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image116.jpg

8-24 成功登录界面

3.登录系统时序图

8-25是实现上面业务的时序图,显示了实现业务逻辑时的类之间的调用顺序关系。

<!--[if gte vml 1]><v:shape id="图片_x0020_39" o:spid="_x0000_i1132" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image117.gif" style='width:550.5pt;height:362.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image028.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image028.gif" o:title="image117" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image117.gif

8-25 登录系统时序图

4.登录系统具体实现步骤

下面是实现上述时序图的具体步骤。

1)用户单击URL Login.do链接时,StrutsActionServlet通过config.xml的配置指向Login.jsp的页面。

2)用户填完登录信息后单击【Submit】按钮时,Struts会通过config.xml的配置调用LoginAction类的execute()方法。

3 LoginAction类的execute()方法调用BookStoreMgrImp类的checkUserLogin()的方法。

4BookStoreMgrImp类的saveUserInfo()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses的入站服务。

5Service Integration Buses的入站服务调用相应的Web Service

6Web Service调用Session BeanBKStoreMgr)的checkUserLogin ()

7Session Bean调用Entity Bean CMPUserCMP)。

8.4.3 用户查询系统业务和时序图

用户查询系统将显示网上书店的所有用户及其相关信息。

1.用户查询系统的业务需求

业务需求是显示所有已经注册的用户信息。

页面显示层是通过UserList.jsp来实现的,业务逻辑是通过Action Bean- UserListAction调用模型层来实现的。

单击用户查询链接时,所有注册的用户信息会显示,如图8-26所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_40" o:spid="_x0000_i1131" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image118.jpg" style='width:279.75pt;height:181.5pt;visibility:visible' o:gfxdata="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 ALABAABUVQAAAAA= "> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image030.png" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image030.png" o:title="" /> <o:lock v:ext="edit" aspectratio="f" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image118.jpg

8-26 “用户查询界面

2.用户查询系统时序图

8-27是实现上面业务的时序图,显示了实现业务逻辑的类之间的调用顺序关系。

<!--[if gte vml 1]><v:shape id="图片_x0020_41" o:spid="_x0000_i1130" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image119.gif" style='width:285pt;height:201.75pt;visibility:visible' o:gfxdata="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 fErXC47XaB3QoO7jTY7lRw7lwYDi5FLiKG7rup7iu27itj7Yod6TAZ7ltG7qIZmR1YznV06xxs7a VW7nOlzbm73ax/7s1k7tT57kRU7Bo77/07JN6Zld6N/t5dge7tde7cNe2bS+7dwu64feCJZWeLt9 02mN1VUptPTq7tmey3P2fMY9a22e3HEO53JO7+IN4bCO7tGN6IxgabkH1kHdx5DO6fXO7lze7Wf+ CA4PahCP3pQM6Z5Oy/hZgeAu6vpO6pBgac+HrGK96WXN4HmNy7kb7Oae7kaJEPF+fgiu6uoH863e 1BbfYON+rrWugb3uNCdO4t6A60bv4RcO3cIO7ZM96yO6sChs5s6e8N8uj80e9JmK8aFd4FFf6AIG 9bGu52Gv9ecenmTf5UTv9XAfsmgv7TRP8mqf9eN78t6+9nx/mGVu6PsuCLAG1IGrmHEP//cOK2fR OGdszn4Cv9yP9YbOLfJ3r/Bjb/dG/u6IMPjUW7h+TtUUT/lSb/Z43/f8OrWcjwig9ejaHfJAX/mX 34HJTvXfBryRDFr7zemQ5fr//OBXD/iWj/kMbS+bb/td9laRleB13fPrFvNS7vuke4ezb8Fd31LA Lvwlz4HTT5rgyn+/f+8G7M7Vz2bf/5vbj/JOA6yj//dl//dD/51tP6jrD/tpfvj2L6vKHsOmH/ts X/enr/eAACA4SFhoeFgYgLjI2OjIqPgoOUkJWXmJiRiZydm52Qma2fX31xV6ipqqusra6voKW/kZ SzhaSjs5i3upu3va60sJHCwbOgxra6tKvHi8rOmM2gx9KD39bM2ZjL3N3e397VvNqt0tbm0ODoB+ nt64Tu1Mzv2+TF/eDo9/rb/Y5a/ML6DAgQRh2TMG7mC4goYUBnNYD6EziKsoxrI4kSDGXRsZevwI MuS9jN86tjK5cCBKgxIjlhS4ElfMih5niryJM6dOTDaZJYQpsme0mi2JCRUGNOTRoiqZ7nwKNSrU pYl+BqRKsylDiFgHdXWXFORXnkQrBQIAO1BLAQItABQABgAIAAAAIQAmAzrEEQEAAFACAAATAAAA AAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAK0wP/HBAAAA MgEAAAsAAAAAAAAAAAAAAAAAQgEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAPNdH25wAwAA 0QgAAB8AAAAAAAAAAAAAAAAALAIAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwEC LQAUAAYACAAAACEATJsnodIAAACrAQAAKgAAAAAAAAAAAAAAAADZBQAAY2xpcGJvYXJkL2RyYXdp bmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhAOFRNx/PBgAA5hsAABoA AAAAAAAAAAAAAAAA8wYAAGNsaXBib2FyZC90aGVtZS90aGVtZTEueG1sUEsBAi0ACgAAAAAAAAAh AJxx201sGAAAbBgAABoAAAAAAAAAAAAAAAAA+g0AAGNsaXBib2FyZC9tZWRpYS9pbWFnZTEuZ2lm UEsFBgAAAAAGAAYArwEAAJ4mAAAAAA== "> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image032.png" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image032.png" o:title="" /> <o:lock v:ext="edit" aspectratio="f" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image119.gif

8-27 用户查询系统时序图

3.用户查询系统的具体实现步骤

下面是实现上述时序图的具体步骤。

1)用户单击“URL UserListdo”链接时,Struts会通过config.xml的配置调用UserListAction类的execute()方法。

2UserListAction类的execute()方法调用BookStoreMgrImp类的getUserList()的方法。

3BookStoreMgrImp类的getUserList()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses的入站服务。

4Service Integration Buses的入站服务调用相应的Web Service

5Web Service调用Session BeanBKStoreMgr)的getUserList ()

6Session Bean调用Entity Bean CMPUserCMP)。

7)将UserList的信息返回到UserList.jsp

8.4.4 用户账户管理系统业务和时序图

用户选中某些书,想进一步购买时,其账户中必须有足够的资金,本系统主要功能是管理用户账户资金。

1.用户账户管理系统需求和实现

用户账户管理系统需求如下。

l 显示用户账户中的存款余额。

l 用户账户可以增加新的资金。

页面显示层是通过BookMgr.jsp来实现的,业务逻辑是通过Action Bean- AccountMgrAction调用模型层来实现的。下面介绍具体的需求和实现。

1)登录之后再单击账户管理链接,显示用户账户中的存款余额。

具体的实现是在Action Bean中,通过Session的信息得到用户名,然后调用用户名参数和getUserInfo的方法,得到用户的个人信息(包括资金信息),显示在AccountMgr.jsp中,如图8-28所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_42" o:spid="_x0000_i1129" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image120.jpg" style='width:278.25pt;height:197.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image034.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image034.jpg" o:title="image120" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image120.jpg

8-28 “账户管理界面

2)在用户账户中注入新的资金。

如果用户注入新的资金,如图8-29所示,单击【Submit】按钮后,新的资金会存到Form Bean中传到Action BeanAction Bean会从Form Bean中通过accountMgrForm.getString("newAmount")方法取出界面填入的资金值,存到UserAccountDTO对象中,调用updateAccountBalance的方法将用户新的资金更新到后台数据库。

<!--[if gte vml 1]><v:shape id="图片_x0020_43" o:spid="_x0000_i1128" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image121.jpg" style='width:255.75pt;height:183pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image035.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image035.jpg" o:title="image121" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image121.jpg

8-29 在账户里注入新资金

上面的更新数据库资金成功后,如图8-30所示,服务器端将不会报出一个异常到客户端。Action Bean将创建一个资金更新成功的信息到ActionMessages对象中,输出到前端JSP页面。

<!--[if gte vml 1]><v:shape id="图片_x0020_44" o:spid="_x0000_i1127" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image122.jpg" style='width:278.25pt;height:137.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image036.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image036.jpg" o:title="image122" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image122.jpg

8-30 成功更新账户

3)显示新的用户账户中的存款余额

单击账户管理链接,显示用户账户中的存款余额,如图8-31所示,整个调用方法同步骤(1)。

<!--[if gte vml 1]><v:shape id="图片_x0020_45" o:spid="_x0000_i1126" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image123.jpg" style='width:279.75pt;height:198pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image037.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image037.jpg" o:title="image123" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image123.jpg

8-31 显示新的用户账户中的存款余额

2.用户账户管理系统时序图

8-32是实现上面业务的时序图,显示了实现业务逻辑时的类之间的调用顺序关系。

<!--[if gte vml 1]><v:shape id="图片_x0020_46" o:spid="_x0000_i1125" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image124.gif" style='width:299.25pt;height:197.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image038.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image038.gif" o:title="image124" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image124.gif

8-32 账户管理系统时序图

3.用户账户管理系统的具体实现步骤

下面是实现上述时序图的具体步骤。

1 用户单击“Account Manager”链接时,StrutsActionServlet通过config.xml的配置指向AccoutMgr.jsp页面。

2)用户填完新的资金后单击【Submit】按钮时,Struts会通过config.xml的配置调用AccountMgrAction类的execute()方法。

3AccountMgrAction类的execute()调用BookStoreMgrImp类的updateAccount- Balance()方法。

4 BookStoreMgrImp类的updateAccountBalance()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses入站服务。

5Service Integration Buses的入站服务调用相应的Web Service

6Web Service调用Session BeanBKStoreMgr)的updateAccountBalance ()

7Session Bean调用Entity Bean CMPAccountCMP)将新的资金存入数据库。

8.4.5 图书管理系统业务和时序图

网上书店数据库中的图书信息是管理人员通过图书管理系统加入的。下面将介绍具体的业务需求及实现步骤。

1.图书管理系统业务需求及实现

业务需求是提供用户界面让系统管理员将新的图书加入到数据库中,详细内容如下。

页面显示层是通过BookMgr.jsp来实现的,业务逻辑是通过Action Bean- BookMgrAction调用模型层来实现的。

1)进入图书管理界面,如图8-33所示,加入新的图书的所有信息。

<!--[if gte vml 1]><v:shape id="图片_x0020_47" o:spid="_x0000_i1124" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image125.jpg" style='width:268.5pt;height:226.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image039.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image039.jpg" o:title="image125" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image125.jpg

8-33 “图书管理界面

在图8-33中,用户输入图书有关的信息,单击【保存】按钮时,这些图书信息将会保存到Form Bean,并被Actionservlet送到Action BeanAction Bean将会把存在Form Bean中的图书信息取出,存入BookDTO对象中,调用BookStoreMgrImp对象中的createBook方法,进而调用SOA的服务总线的入站服务方法,最后将图书信息存入数据库。

2)新的图书加入后,系统返回成功加入的信息。

图书信息存入数据库后,Action BeanActionMessages对象中定义一个图书成功加入的消息,Action Form经过ActionMappingforward方法将消息输出到新的转向页面,如图8-34所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_48" o:spid="_x0000_i1123" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image126.jpg" style='width:274.5pt;height:133.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image040.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image040.jpg" o:title="image126" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image126.jpg

8-34 新书成功加入系统

3)查看数据库表BOOK,如图8-35所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_49" o:spid="_x0000_i1122" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image127.jpg" style='width:376.5pt;height:66.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image041.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image041.jpg" o:title="image127" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image127.jpg

8-35 数据库表BOOK

2.图书管理系统时序图

8-36是实现上面业务的时序图,显示了实现业务逻辑时的类之间的调用顺序关系。

<!--[if gte vml 1]><v:shape id="图片_x0020_50" o:spid="_x0000_i1121" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image128.gif" style='width:359.25pt;height:243pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image042.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image042.gif" o:title="image128" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image128.gif

8-36 图书管理系统时序图

3.图书管理系统具体实现步骤

下面是实现图8-36所示时序图的具体步骤。

1)用户单击“BookMgr.do”链接时,StrutsActionServlet通过config.xml的配置指向BookMgr.jsp的页面。

2)输入图书信息后单击【Submit】按钮时,Struts会通过config.xml配置调用BookMgrAction类的execute()方法,并将用户的信息存到BookDTO类中。

3RegistrationAction类的execute()方法调用BookStoreMgrImp类的create- Book()的方法。

4BookStoreMgrImp类的createBook()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses的入站服务。

5Service Integration Buses的入站服务调用相应的Web Service

6Web Service调用Session BeanBKStoreMgr)的createBook()

7Session Bean调用Entity Bean CMPBookCMP)。

8.4.6 图书查询系统业务和时序图

用户购买图书时,首先需要知道网上书店有哪些图书,下面将介绍具体的业务需求及实现步骤。

页面显示层是通过BookList.jsp来实现的,业务逻辑是通过Action Bean- BookListAction调用模型层来实现的。

1.图书查询系统业务需求

本系统的业务需求如下。

l 显示所有图书的信息。

l 用户单击某一图书的链接时,可以直接加入到购物车(Shopping Cart)。

单击图书查询链接,所有图书信息会显示出来,如图8-37所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_51" o:spid="_x0000_i1120" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image129.jpg" style='width:326.25pt;height:192pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image043.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image043.jpg" o:title="image129" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image129.jpg

8-37 “图书查询界面

2.图书查询系统时序图

8-38是实现上面业务的时序图,显示了实现业务逻辑时的类之间的调用顺序关系。

3.图书查询系统的具体实现步骤

下面是实现图8-38所示时序图的具体步骤。

1)用户单击“BookList.do”链接时,Struts会通过config.xml配置调用BookListAction类的execute()方法。

2 BookListAction类的execute()方法调用BookStoreMgrImp类的getBookList()的方法。

3BookStoreMgrImp类的getUserList ()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses的入站服务。

4Service Integration Buses的入站服务调用相应的Web Service

5Web Service调用Session BeanBKStoreMgr)的getBookList ()

6Session Bean调用Entity Bean CMPBookCMP)。

7)将BookList的信息返回到BookList.jsp

<!--[if gte vml 1]><v:shape id="图片_x0020_52" o:spid="_x0000_i1119" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image130.gif" style='width:328.5pt;height:222pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image044.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image044.gif" o:title="image130" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image130.gif

8-38 图书查询系统时序图

8.4.7 购物车业务和时序图

当用户选中某些书时,需要通过购物车来购买,下面将介绍具体的业务需求及实现步骤。购物车系统是网上书店系统最复杂的一块,它本质上是实现了图书系统、用户系统和订单系统的集成。

1.购物车的业务需求及实现

购物车系统是网上书店最复杂的一个系统,其业务需求主要包括以下几个方面。

l 用户可以将自己要买的图书加入购物车。

l 用户可以将自己不想买的图书从购物车中删除。

l 用户可以修改自己所要买的图书的数量。

l 系统可以判断用户的账户中是否有足够的资金买购物车中的书。

l 购买成功后,系统将用户的购买信息存入数据库。

1)用户从BookList中单击某一本书名的链接,如图8-39所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_53" o:spid="_x0000_i1118" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image131.jpg" style='width:264.75pt;height:170.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image045.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image045.jpg" o:title="image131" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image131.jpg

8-39 选择图书

2)系统显示选中书的详细内容,如果用户想买,则可单击【加入购物车】按钮。

单击书名的链接时,将指向viewBook.do,这样将调用ViewBookAction,同时把该图书的ID号也包含在请求中;ViewBookAction根据request.getParameter的方法得到该书的ID号,并将它作为参数来调用BookStoreMgrImpgetBook方法,得到该图书的所有信息,显示在下页,如图8-40所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_54" o:spid="_x0000_i1117" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image132.jpg" style='width:3in;height:185.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image046.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image046.jpg" o:title="image132" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image132.jpg

8-40 将选中图书加入购物车

3)系统显示被选书已经加入购物车。

如果用户单击图8-40中的【加入购物车】按钮,页面将会继续提交到ViewBookActionViewBookAction将会根据request.getParameter("addShopCart")来确认这个请求是否真正来自加入购物车如果是,将相关的图书信息从Form Bean中取出,存到一个ShoppingCartDTO实例中,因为一个用户可能会买很多书,一个ShoppingCartDTO代表所购买的一种书,将它加入到一个List中保存起来。值得说明的是,在购物车提交之前,所有购书的信息都是存在内存List中的。如果没有加入的错误信息,则通过Action BeansaveMessages方法,将成功的信息加入到ActionMessages对象之中,再通过ActionMapping对象的findForward方法将成功信息显示到加入购物车的成功信息页面上,如图8-41所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_55" o:spid="_x0000_i1116" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image133.jpg" style='width:258.75pt;height:125.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image047.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image047.jpg" o:title="image133" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image133.jpg

8-41 图书成功加入购物车

4)用户可以直接从图书查询页将自己想买的书加入购物车,如图8-42所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_56" o:spid="_x0000_i1115" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image134.jpg" style='width:259.5pt;height:165pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image048.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image048.jpg" o:title="image134" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image134.jpg

8-42 直接从图书查询页将选中图书加入购物车

直接单击加入购物车链接,会调用BookListAction。它首先检查是否含有一个actionaddShopCart的请求,如果有,将从bookListForm中得到有关书的序号、书名、价格和折扣的信息,存到ShoppingCartDTO中,再存到前述的专门存购物车信息的缓存List之中。值得说明的是,在这个阶段,所有存到购物车之中的信息都还没有存到后台数据库,所以还可以非常方便地进行增加、删除和修改操作。

5)用户单击购物车链接,进入购物车界面,如图8-43所示。

通过前面的操作,用户可以将他想买的书加入到购物车。在购物车界面,用户可以删除不想买的书,修改所要购买的书的数量;也可以看到每本书的单价、折扣和购买数量,以及购买全部图书的总价。

页面显示层是通过ShoppingCart.jsp来实现的,业务逻辑是通过Action Bean- ShoppingCartAction调用模型层来实现的。

<!--[if gte vml 1]><v:shape id="图片_x0020_57" o:spid="_x0000_i1114" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image135.jpg" style='width:267pt;height:219pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image049.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image049.jpg" o:title="image135" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image135.jpg

8-43 进入购物车界面

6)删除不想买的书。

如果用户想删除不想买的图书,需要选中每种书前面的复选框checkbox,然后单击【删除】按钮,如图8-44所示,这个删除请求和所要删除的图书序号将会通过StrutsActionServlet送到ShoppingCartAction;在ShoppingCartActionexecute方法中,将会检查是否有删除请求,如果有,则通过请求中该图书的序列号,从缓存的List中找到含有该图书序号bookIDShoppingCartDTO,从List中删除该ShoppingCartDTO,选中图书将会从购物车中消失,如图8-45所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_58" o:spid="_x0000_i1113" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image136.jpg" style='width:261.75pt;height:215.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image050.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image050.jpg" o:title="image136" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image136.jpg

8-44 删除所选图书

<!--[if gte vml 1]><v:shape id="图片_x0020_59" o:spid="_x0000_i1112" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image137.jpg" style='width:250.5pt;height:203.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image051.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image051.jpg" o:title="image137" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image137.jpg

8-45 所删除图书从购物车消失

7)修改所要买的书的数量。

如果需要修改所买书的数量,则选中要修改数量的书,然后单击【修改数量】按钮。提交请求后,对应于每本书的数量将会在请求消息中存在,并通过ActionServlet转交给ShoppingCartAction;在ShoppingCartActionexecute方法中,它将会检查是否有修改数量的请求,如果有这样的请求,则取出请求中的图书数量,取出缓存List中的ShoppingCartDTO对象,修改其中的数量,如图8-46所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_60" o:spid="_x0000_i1111" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image138.jpg" style='width:265.5pt;height:217.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image052.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image052.jpg" o:title="image138" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image138.jpg

8-46 修改购物车中所买图书的数量

8)提交购物车。

一旦确定了所要购买的图书和数量,单击【Submit】按钮提交购物车,如图8-47所示。该请求会提交到ShoppingCartAction,它将在execute方法中检查是否有submit的请求,如果有这样的请求,它将首先从Session中取出用户的信息;接着产生一个OrderDTO的实例,将用户号、购买时间、税和总价存入到OrderDTO的实例中,然后调用BookStoreMgrImpcreateOrder方法,将总的购书信息存入到数据库,并返回一个购书号。接着创建一个OrderItemDTO的数组,将每本书的书号、明细号、数量、折扣等信息存在OrderItemDTO中,调用BookStoreMgrImpcreateOrder方法,将购书明细存入数据库。

<!--[if gte vml 1]><v:shape id="图片_x0020_61" o:spid="_x0000_i1110" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image139.jpg" style='width:246.75pt;height:202.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image053.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image053.jpg" o:title="image139" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image139.jpg

8-47 提交购物车

9)显示用户账户里的资金不足。

提交购物车时,程序将会在服务器端检查用户的账户资金是否大于购书总价,如果账户资金小于购书总价,服务器端将会抛出账户资金不够的异常,StrutsAction Bean截获到异常后,将错误信息显示到页面上。

因为本例账户资金为300.00元,而图书的总价为358.00元,所以显示账户资金不足,如图8-48所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_62" o:spid="_x0000_i1109" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image140.jpg" style='width:223.5pt;height:122.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image054.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image054.jpg" o:title="image140" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image140.jpg

8-48 显示账户资金不足

10)根据用户账户中的资金修改购买数量,如图8-49所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_63" o:spid="_x0000_i1108" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image141.jpg" style='width:262.5pt;height:3in;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image055.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image055.jpg" o:title="image141" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image141.jpg

8-49 根据账户资金修改购买数量

11)修改数量后重新提交,显示购买成功,如图8-50所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_64" o:spid="_x0000_i1107" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image142.jpg" style='width:254.25pt;height:123.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image056.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image056.jpg" o:title="image142" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image142.jpg

8-50 购买成功

成功提交后,需要检查购书信息是否存到了数据库。

12ORDER表记录了总的购书信息,如图8-51所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_65" o:spid="_x0000_i1106" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image143.jpg" style='width:300.75pt;height:77.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image057.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image057.jpg" o:title="image143" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image143.jpg

8-51 ORDER

13ORDER-ITEM表记录了详细的购书信息,如图8-52所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_66" o:spid="_x0000_i1105" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image144.jpg" style='width:269.25pt;height:93.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image058.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image058.jpg" o:title="image144" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image144.jpg

8-52 ORDER-ITEM

2.购物车系统时序图

8-53是实现上面业务的时序图,显示了实现业务逻辑时的类之间的调用顺序关系。

<!--[if gte vml 1]><v:shape id="图片_x0020_67" o:spid="_x0000_i1104" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image145.gif" style='width:370.5pt;height:196.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image059.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image059.gif" o:title="image145" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image145.gif

8-53 购物车系统时序图

3.购物车系统具体实现步骤

下面是实现图8-53所示时序图的具体步骤。

1)用户单击“shoppingCart.do”链接时,StrutsActionServlet通过config.xml配置将会指向ShoppingCart.jsp的页面。

2)用户单击【Submit】按钮时,Struts会通过config.xml配置调用Shopping- CartAction类的execute()方法,并将购物车信息存到OrderDTOOrderItemDTO类中。

3RegistrationAction类的execute()方法调用BookStoreMgrImp类的create- Order()的方法和createOrderItem()的方法。

4BookStoreMgrImp类的saveUserInfo()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses的入站服务。

5Service Integration Buses的入站服务调用相应的Web Service

6Web Service调用Session Bean(BKStoreMgr)createOrder ()create- OrderItem()的方法。

7Session Bean调用Entity Bean CMP(OrderCMPOrderItemCMP)将总的购书信息和详细的购书信息记录到数据库中。

8.5 Websphere RAD上创建Entity Bean CMP

Session BeanWeb Service

在创建了数据库和完成所有的设计工作之后,就可以用本书第7章所讲述的方法在Websphere RAD上创建相应的Entity Bean CMPSession Bean,然后将Session Bean发布成相应的Web Service了。下面是RAD的创建结果。

RAD所创建的网上书店的Session BeanCMP如图8-54所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_68" o:spid="_x0000_i1103" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image146.jpg" style='width:175.5pt;height:249pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image060.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image060.jpg" o:title="image146" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image146.jpg

8-54 RAD所创建的网上书店的Session BeanCMP

8.5.1 RAD上创建Entity Bean CMP

RAD上创建的所有的Entity Bean CMP如图8-55所示。本例有6个数据库表,每个CMP对应相应的数据库表如下。

l AccountCMP对应于数据库表ACCOUNT

l BkSequenceNumCMP对应于数据库表BK-SEQUENCE-NUM

l BookCMP对应于数据库表BOOK

l OrderCMP对应于数据库表ORDER

l OrderItemCMP对应于数据库表ORDER_ITEM

l UserCMP对应于数据库表USER

<!--[if gte vml 1]><v:shape id="图片_x0020_113" o:spid="_x0000_i1102" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image148.jpg" style='width:206.25pt;height:107.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image061.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image061.jpg" o:title="image148" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image148.jpg

8-55 RAD上创建的Entity Bean CMP

下面是各个Entity Bean CMP

1AccountCMP:负责对ACCOUNT数据库表的selectinsertupdatedelete,如图8-56所示。

l CMP实现类:AccountCMPBean

l CMP主键类:AccountCMPKey

l CMP本地接口:AccountCMPLocal

l CMP本地Home接口:AccountCMPLocalHome

<!--[if gte vml 1]><v:shape id="图片_x0020_114" o:spid="_x0000_i1101" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image149.jpg" style='width:326.25pt;height:150.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image062.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image062.jpg" o:title="image149" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image149.jpg

8-56 AccountCMP

2BkSequenceNumCMP:负责对BK-SEQUENCE-NUM数据库表的selectinsertupdatedelete,如图8-57所示。

l CMP实现类:BkSequenceNumCMPBean

l CMP主键类:BkSequenceNumCMPKey

l CMP本地接口:BkSequenceNumCMPLocal

l CMP本地Home接口:BkSequenceNumCMPLocalHome

<!--[if gte vml 1]><v:shape id="图片_x0020_115" o:spid="_x0000_i1100" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image150.jpg" style='width:258pt;height:155.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image063.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image063.jpg" o:title="image150" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image150.jpg

8-57 BkSequenceNumCMP

3BookCMP:负责对BOOK数据库表的selectinsertupdatedelete,如图8-58所示。

l CMP实现类:BookCMPBean

l CMP主键类:BkSequenceNumCMPKey

l CMP本地接口:BkSequenceNumCMPLocal

l CMP本地Home接口:BkSequenceNumCMPLocalHome

<!--[if gte vml 1]><v:shape id="图片_x0020_116" o:spid="_x0000_i1099" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image151.jpg" style='width:264.75pt;height:233.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image064.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image064.jpg" o:title="image151" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image151.jpg

8-58 BookCMP

4OrderCMP:负责对ORDER数据库表的selectinsertupdatedelete,如图8-59所示。

l CMP实现类:OrderCMPBean

l CMP主键类:OrderCMPKey

l CMP本地接口:OrderCMPLocal

l CMP本地Home接口:OrderCMPLocalHome

<!--[if gte vml 1]><v:shape id="图片_x0020_117" o:spid="_x0000_i1098" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image152.jpg" style='width:256.5pt;height:155.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image065.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image065.jpg" o:title="image152" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image152.jpg

8-59 OrderCMP

5OrderItemCMP:负责对ORDER-ITEM数据库表的selectinsertupdatedelete,如图8-60所示。

l CMP实现类:OrderItemCMPBean

l CMP主键类:OrderItemCMPKey

l CMP本地接口:OrderItemCMPLocal

l CMP本地Home接口:OrderCMPLocalHome

<!--[if gte vml 1]><v:shape id="图片_x0020_118" o:spid="_x0000_i1097" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image153.jpg" style='width:267.75pt;height:155.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image066.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image066.jpg" o:title="image153" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image153.jpg

8-60 OrderItemCMP

6UserCMP:负责对USER数据库表的selectinsertupdatedelete,如图8-61所示。

l CMP实现类:UserCMPBean

l CMP主键类:UserCMPKey

l CMP本地接口:UserCMPLocal

l CMP本地Home接口:UserCMPLocalHome

<!--[if gte vml 1]><v:shape id="图片_x0020_119" o:spid="_x0000_i1096" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image154.jpg" style='width:271.5pt;height:3in;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image067.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image067.jpg" o:title="image154" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image154.jpg

8-61 UserCMP

8.5.2 RAD上创建Session Bean

Session Bean负责实际的业务需求,归根到底可以分为以下两大类。

1根据前端所传来的数据,调用相应的Entity Bean CMP,对相应的数据库的数据进行相应的insertupdatedelete操作。

2根据前端所传来的数据,调用相应的Entity Bean CMP,对相应的数据库的数据进行相应的select操作,形成相应的数据结果传到前端。

Session Bean形成相应的处理各种业务需求的接口供调用,如图8-62所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_120" o:spid="_x0000_i1095" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image155.jpg" style='width:183.75pt;height:201pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image068.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image068.jpg" o:title="image155" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image155.jpg

8-62 RAD所创建的Session Bean

在此将创建3Session Bean

1BookMgr,如图8-63所示。

l Session Bean远程实现类:BookMgrBean

l Session Bean远程接口类:BookMgr

l Session Bean的远程Home接口:BookMgrHome

2OrderMgr,如图8-64所示。

l Session Bean远程实现类:OrderMgrBean

l Session Bean远程接口类:OrderMgr

l Session Bean的远程Home接口:OrderMgrHome

<!--[if gte vml 1]><v:shape id="图片_x0020_121" o:spid="_x0000_i1094" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image156.jpg" style='width:101.25pt;height:78pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image069.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image069.jpg" o:title="image156" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image156.jpg<!--[if gte vml 1]><v:shape id="图片_x0020_122" o:spid="_x0000_i1093" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image157.jpg" style='width:108.75pt;height:75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image070.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image070.jpg" o:title="image157" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image157.jpg

8-63 Session Bean BookMgr 8-64 Session Bean OrderMgr

3UserAccountMgr,如图8-65所示。

l Session Bean远程实现类:UserAccountMgr Bean

l Session Bean远程接口类:UserAccountMgr

l Session Bean的远程Home接口:UserAccountMgrHome

<!--[if gte vml 1]><v:shape id="图片_x0020_123" o:spid="_x0000_i1092" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image158.jpg" style='width:130.5pt;height:91.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image071.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image071.jpg" o:title="image158" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image158.jpg

8-65 Session Bean UserAccountMgr

8.5.3 RAD上将Session Bean发布为Web Service

上面所创建的Session Bean的远端接口需要用RMI传输协议来调用。可以使用分布式系统的集成,也可以基于服务总线的应用协议转换功能来集成,本章基于标准化的考虑,将Session Bean发布为基于HTTP/SOAP传输协议的Web Service

将上面的Session Bean发布成相应的Web Service如图8-66所示,包括如下3Web Service

l BookMgrService

l OrderMgrService

l UserAccountMgrService

<!--[if gte vml 1]><v:shape id="图片_x0020_124" o:spid="_x0000_i1091" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image160.jpg" style='width:282.75pt;height:201.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image072.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image072.jpg" o:title="image160" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image160.jpg

8-66 Session Bean发布成Web Service

8.6 SIBus服务总线的基本原理

在介绍具体的如何实现SIBus服务总线之前,简单介绍一下服务总线的创建过程(后面会一步步详细介绍创建过程),然后再介绍其基本原理。

1、首先创建一个服务总线的名称,然后将应用服务器作总线成员加入到服务总线中来

2、接着创建端点监听器来接收外部的服务请求。

3、接下来为每个服务总线创建目标队列,以便端点监听器在收到服务请求后,将请求消息传到目标队列。

4、再创建出站服务,建立相应的出站服务器端口,接下来在目标队列中配置默认转发路由路径,以便目标队列在收到端点监听器的请求消息后,通过默认路径转给出站服务器端口。

5、最后为每一个服务创建相应的入站服务,并绑定相应的端点监听器和相应的目标队列,以便端点监听器在收到入站服务的外部请求消息后,将请求消息转发到相应的目标队列。进一步将入站服务发布成Web ServiceWSDL,以便外部调用。

下面进一步介绍服务总线工作的基本原理。

服务请求者在收到服务总线入站服务发布的WSDL文件后,将创建相应的SOAP请求信息给服务总线。因为创建每个服务的入站服务时,已经将每个入站服务与端点监听器及目标队列进行了关联,所以当服务请求者根据入站服务的WSDL发出服务请求时,这个服务请求就会发给相应的端点监听器,并有端点监听器将这个服务请求转给建立入站服务时所指定的目标队列。

以下代码是本章网上书店图书管理服务接口的入站服务的WSDL文件的service部分(将会在下面章节创建),当服务请求者根据这个地址向服务总线发出服务请求时,它自然会被对应图书管理入站服务的端点监听器收到,端点监听器会将这个服务转发给对应于图书管理入站服务的目标队列。

<wsdl:service name="BookMgrDestinationInboundService">

<wsdl:port name="SOAPHTTPChannel1InboundPort"

binding="sibusbinding:SOAPHTTPChannel1InboundPortBinding">

<wsdlSOAP:address

location="http://localhost:9080/wsgwSOAPhttp1/SOAPhttpengine

/BookStoreBus/BookMgrDestinationInboundService

/SOAPHTTPChannel1InboundPort"/>

</wsdl:port>

</wsdl:service>

目标队列将服务请求消息根据所创建的默认转发路由路径(创建为指向图书管理出站服务)转给图书管理的出站服务器端口,图书管理的出站服务器端口将服务请求转给外部的真正的图书管理服务提供者(这里服务总线可以根据业务需求进行相应的消息格式转换,甚至传输协议的转换)。

外部的服务管理提供者在实现服务请求后,会将服务响应消息返回给出站服务器端口,出站服务会返回给目标队列,端点监听器从目标队列得到响应消息后,将响应消息返回给服务请求者。

SIBus服务总线的工作原理如图8-67所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_125" o:spid="_x0000_i1090" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image161.gif" style='width:323.25pt;height:228pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image073.gif" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image073.gif" o:title="image161" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image161.gif

8-67 SIBus服务总线的工作原理

8.7 创建基于Websphere 6.0 SIBus服务总线的

SOA架构的服务集成系统

上一节介绍了SIBus的工作原理,前面章节已经在Websphere RAD上创建了Entity Bean CMPSession BeanWeb Service。网上书店系统的所有业务通过3Web Service组件(BookMgrServiceOrderMgrServiceUserAccountMgrService)来分别对外发布。下面将详细介绍如何通过基于SOA架构的Websphere 6.0 SIBus服务总线来将这3Web Service组件集成到服务总线上来。

8.7.1 创建SDO

SDO,其全称为Service Data Objects,中文为服务数据对象,是IBMBEA共同发布的一个基于Java平台的编程框架和API,目的在于使对数据的检查、读取和更新更加容易,前面提到ESB需要有消息格式转换的功能。SIBus上的所有消息格式都是基于SDO接口的,这样可以调用SDO的接口对消息格式实现转换,所有SDO的数据类型都存在SDO库中。

此外,SIBus会用SDO库存储WSDL的定义以支持进一步的Web 服务请求。

所以,需要先在Websphere自带的Cloudscape上创建SDO库。下面是创建SDO Repository的过程。

首先从Admin Console中找到相应的应用服务器的名称和节点,以便在下面的命令行中调用,下面是笔者的服务器的信息,如图8-68所示。

l 应用服务器的名称:server1

l 节点:liangahNode01

<!--[if gte vml 1]><v:shape id="图片_x0020_126" o:spid="_x0000_i1089" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image162.jpg" style='width:351pt;height:122.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image074.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image074.jpg" o:title="image162" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image162.jpg

8-68 应用程序服务器

在下列命令窗口中,读者需要将路径改为自己所安装的RAD的目录(如笔者将RAD安装在E:/rad/),然后执行相关命令。

注意:E:/rad/runtimes/base_v6/bin路径是笔者安装的RAD所带的Websphere 6.0bin路径,读者需要根据自己安装的RAD目录确定相应的bin路径;如果读者直接安装Websphere 6.0(不通过RAD),也可以直接找到相应的Websphere 6.0“bin”路径。

在目录E:/rad/runtimes/base_v6/bin中运行下面的命令,如图8-69所示。

wsadmin -f installSdoRepository.jacl -createDb liangahNode01 server1

<!--[if gte vml 1]><v:shape id="图片_x0020_127" o:spid="_x0000_i1088" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image163.jpg" style='width:349.5pt;height:45.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image075.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image075.jpg" o:title="image163" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image163.jpg

8-69 运行创建SDO Repository命令

通过上面的liangahNode01server1,读者要根据图8-68来查找自己的应用服务器的名称和节点,SDO库创建成功后,读者可以在Console中看到成功信息,如图8-70所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_128" o:spid="_x0000_i1087" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image164.jpg" style='width:233.25pt;height:151.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image076.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image076.jpg" o:title="image164" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image164.jpg

8-70 SDO库安装完成

Admin Console中的企业应用程序下面可以看到多了一个相应的“SDO Repository”运行程序如图8-71所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_129" o:spid="_x0000_i1086" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image165.jpg" style='width:237pt;height:168.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image077.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image077.jpg" o:title="image165" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image165.jpg

8-71 Repository运行程序

8.7.2 创建SIBus Web服务资源适配器

资源适配器,英文为Resource Adapter,是J2EE Connector ArchitectureJCA)所定义的一个组件,其目的在于使得J2EE的各种应用程序通过资源适配器的标准接口,对各种资源进行调用,类似大家熟悉的通过JDBC的标准接口来调用数据库的资源。这里安装Web服务资源适配器,以便服务总线能够调用Web服务,其创建过程如图8-72所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_147" o:spid="_x0000_i1085" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image166.jpg" style='width:333pt;height:120.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image078.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image078.jpg" o:title="image166" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image166.jpg

8-72 资源适配器成功启动界面

在目录E:/rad/runtimes/base_v6/bin运行下面的命令。

wsadmin -f ../util/sibwsInstall.jacl INSTALL_RA -installRoot

"E:/rad/runtimes/base_v6" -nodeName liangahNode01

8.7.3 安装和配置端点监听器

创建端点监听器以便服务总线接收Web服务的请求,所有外部或者内部送给服务总线的请求都需要端点监听器来接收。

安装端点监听器之前,首先需要安装sibws,它是服务总线启动Web Service所需要的,过程如下。

1.安装sibws运行程序

运行命令“wsadmin -f ../util/sibwsInstall.jacl INSTALL”,如图8-73所示。在目录E:/rad/runtimes/base_v6/bin下运行如下的命令。

wsadmin -f ../util/sibwsInstall.jacl INSTALL -installRoot

"E:/rad/runtimes/base_v6" -serverName server1 -nodeName liangahNode01

<!--[if gte vml 1]><v:shape id="图片_x0020_148" o:spid="_x0000_i1084" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image167.jpg" style='width:238.5pt;height:183pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image079.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image079.jpg" o:title="image167" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image167.jpg

8-73 安装sibws运行程序

安装完毕sibws,启动sibws,可以看到sibws.liangahNode01.server1运行在企业应用程序中,如图8-74所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_149" o:spid="_x0000_i1083" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image168.jpg" style='width:267pt;height:198pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image080.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image080.jpg" o:title="image168" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image168.jpg

8-74 启动sibws界面

2.安装支持HTTP协议的端点监听器应用程序

要使用支持HTTP协议的端点监听器,还需要安装两个应用程序,如图8-75所示。

运行命令“wsadmin -f ../util/sibwsInstall.jacl INSTALL_HTTP”,在目录E:/rad/ runtimes/base_v6/bin下运行如下命令。

wsadmin -f ../util/sibwsInstall.jacl INSTALL_HTTP -installRoot

"E:/rad/runtimes/base_v6" -serverName server1 -nodeName liangahNode01

<!--[if gte vml 1]><v:shape id="图片_x0020_150" o:spid="_x0000_i1082" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image169.jpg" style='width:259.5pt;height:201pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image081.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image081.jpg" o:title="image169" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image169.jpg

8-75 安装支持HTTP协议的端点监听器应用程序

安装完毕sibwshttp1,启动sibwshttp1,可以看到sibwshttp1.liangahNode01.server1运行在企业应用程序中,如图8-76所示。

安装完毕sibwshttp2,启动sibwshttp2,可以看到sibwshttp2.liangahNode01.server1运行在企业应用程序中,如图8-76所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_151" o:spid="_x0000_i1081" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image170.jpg" style='width:243pt;height:201.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image082.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image082.jpg" o:title="image170" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image170.jpg

8-76 安装启动应用程序

3.创建端点监听器

安装完成基于HTTP协议的端点监听器应用程序后,这里就可以进一步创建端点监听器了,其创建过程如下。

1)在Admin Console中的左边列表中选择服务器”→“应用服务器选项,打开应用程序服务器对话框,如图8-77所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_152" o:spid="_x0000_i1080" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image171.jpg" style='width:296.25pt;height:105.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image083.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image083.jpg" o:title="image171" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image171.jpg

8-77 打开应用程序服务器对话框

选择应用程序服务器对话框的名称目录下面的“server1”选项,打开“server1”的属性对话框,如图8-78所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_153" o:spid="_x0000_i1079" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image172.jpg" style='width:330pt;height:185.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image084.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image084.jpg" o:title="image172" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image172.jpg

8-78 打开“server1”的属性对话框

2)创建端点监听器Endpoint Listeners

选取其他属性下面的“Endpoint Listeners”选项,进入“Endpoint Listeners”的新建对话框,如图8-79所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_154" o:spid="_x0000_i1078" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image173.jpg" style='width:276pt;height:138pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image085.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image085.jpg" o:title="image173" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image173.jpg

8-79 “Endpoint Listeners”新建对话框

单击【新建】按钮,弹出“Endpoint Listeners”创建对话框,如图8-80所示,输入下面信息。

l 名称:SOAPHTTPChannel1

l URL根:http://localhost:9080/wsgwSOAPhttp1/

l WDSL服务HTTP URL 根:http://localhost:9080/wsgwSOAPhttp1/

<!--[if gte vml 1]><v:shape id="图片_x0020_155" o:spid="_x0000_i1077" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image174.jpg" style='width:252pt;height:217.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image086.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image086.jpg" o:title="image174" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image174.jpg

8-80 创建端点监听器Endpoint Listeners

配置完后,单击【应用】按钮,可以看到配置的Endpoint Listeners如图8-81所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_156" o:spid="_x0000_i1076" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image175.jpg" style='width:255pt;height:135pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image087.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image087.jpg" o:title="image175" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image175.jpg

8-81 所创建的端点监听器Endpoint Listeners

8.7.4 创建服务总线

服务总线是一组相连的服务器和集群,创建服务总线就是先命名一个服务总线的名称,有了这个名称后,服务器将以总线成员的身份加入到此服务总线,服务器上的应用程序通过与该服务器相关联的消息传递引擎连接到服务总线上来。服务总线支持基于消息和棉线服务体系的应用程序。下面是创建服务总线的过程。

选择左边列表的服务集成”→“总线选项,弹出新建总线对话框,如图8-82所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_157" o:spid="_x0000_i1075" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image176.jpg" style='width:320.25pt;height:150.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image088.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image088.jpg" o:title="image176" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image176.jpg

8-82 新建总线对话框

单击【新建】按钮,进入服务总线的创建对话框,如图8-83所示,在名称文本框中输入所创建的服务总线名称“BookStoreBus”

<!--[if gte vml 1]><v:shape id="图片_x0020_158" o:spid="_x0000_i1074" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image177.jpg" style='width:207.75pt;height:181.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image089.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image089.jpg" o:title="image177" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image177.jpg

<!--[if gte vml 1]><v:shape id="图片_x0020_159" o:spid="_x0000_i1073" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image178.jpg" style='width:207pt;height:120pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image090.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image090.jpg" o:title="image178" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image178.jpg

8-83 服务总线创建对话框

单击【应用】按钮,完成服务总线的创建,如图8-84所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_160" o:spid="_x0000_i1072" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image179.jpg" style='width:284.25pt;height:147.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image091.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image091.jpg" o:title="image179" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image179.jpg

8-84 所创建的服务总线

8.7.5 创建总线成员

创建总线成员的目的是将应用服务器和节点加入到相应的服务总线,以便将服务器所提供的各种服务和服务总线建立联系,其创建过程如下。

选择图8-84名称目录下的“BookStoreBus”选项,打开总线对话框,如图8-85所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_161" o:spid="_x0000_i1071" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image180.jpg" style='width:279pt;height:195.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image092.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image092.jpg" o:title="image180" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image180.jpg

8-85 创建总线成员

在对话框中选取目录其他属性下面的总线成员选项弹出总线成员的添加对话框,如图8-86所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_162" o:spid="_x0000_i1070" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image181.jpg" style='width:249pt;height:123pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image093.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image093.jpg" o:title="image181" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image181.jpg

8-86 进入总线成员的添加对话框

单击【添加】按钮,弹出选择服务器或集群对话框。在服务器下拉列表中选择应用服务器,如图8-87所示,这里实际上就是本地的应用服务器Websphere 6.1所对应的节点名称和服务器名称。

<!--[if gte vml 1]><v:shape id="图片_x0020_163" o:spid="_x0000_i1069" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image182.jpg" style='width:210pt;height:201.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image094.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image094.jpg" o:title="image182" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image182.jpg

8-87 选择服务器或集群

单击【下一步】按钮弹出确认新总线成员的添加对话框,如图8-88所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_164" o:spid="_x0000_i1068" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image183.jpg" style='width:200.25pt;height:123.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image095.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image095.jpg" o:title="image183" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image183.jpg

8-88 确认新总线成员的添加

单击【完成】按钮,完成总线成员的添加工作,如图8-89所示,将显示所添加的节点和服务器。

<!--[if gte vml 1]><v:shape id="图片_x0020_165" o:spid="_x0000_i1067" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image184.jpg" style='width:210pt;height:107.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image096.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image096.jpg" o:title="image184" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image184.jpg

8-89 所添加的总线成员

8.7.6 创建总线目标

创建总线目标的目的在于创造一个虚拟的信息交换的场所,是一个消息接收地,可以是队列(queue主题空间(topic等,本章将采用队列。当端点监听器收到服务请求消息后,会根据入站服务的设定,将服务请求转发到总线目标来总线目标会根据默认转发路由路径将服务请求转给出站服务器端口。出站服务器端口会进一步将请求消息转给外部服务提供者得到返回消息。总线目标在收到出站服务器端口的返回消息后,会转给端点监听器。

本章的网上书店系统有3Web Service的服务接口。

1BookMgrService

2OrderMgrService

3UserAccountMgrService

本章将分别对上面3个服务接口创建总线目标,下面是创建对应BookMgr总线目标的过程。

打开服务总线“BookStoreBus”对话框,如图8-90所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_166" o:spid="_x0000_i1066" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image185.jpg" style='width:215.25pt;height:156pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image097.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image097.jpg" o:title="image185" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image185.jpg

8-90 服务总线对话框

在服务总线对话框中选取其他属性目录下面的目标选项,弹出目标新建对话框,如图8-91所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_167" o:spid="_x0000_i1065" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image186.jpg" style='width:234pt;height:138.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image098.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image098.jpg" o:title="image186" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image186.jpg

8-91 新建目标

单击【新建】按钮,弹出目标类型创建对话框,如图8-92所示,选择队列选项。

<!--[if gte vml 1]><v:shape id="图片_x0020_168" o:spid="_x0000_i1064" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image187.jpg" style='width:306pt;height:135.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image099.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image099.jpg" o:title="image187" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image187.jpg

8-92 目标类型创建对话框

单击【下一步】按钮,弹出设置队列属性对话框,如图8-93所示,在文本框标识中输入目标的名称“BookMgrDestination”

<!--[if gte vml 1]><v:shape id="图片_x0020_169" o:spid="_x0000_i1063" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image188.jpg" style='width:222pt;height:140.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image100.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image100.jpg" o:title="image188" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image188.jpg

8-93 设置队列属性

单击【下一步】按钮,弹出将队列指定给总线成员对话框,如图8-94所示,在总线成员下拉列表中选择相应的服务器。

<!--[if gte vml 1]><v:shape id="图片_x0020_170" o:spid="_x0000_i1062" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image189.jpg" style='width:255.75pt;height:123.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image101.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image101.jpg" o:title="image189" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image189.jpg

8-94 将队列指定给总线成员

单击【下一步】按钮,弹出确认队列创建对话框,如图8-95所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_171" o:spid="_x0000_i1061" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image190.jpg" style='width:235.5pt;height:167.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image102.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image102.jpg" o:title="image190" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image190.jpg

8-95 确认队列创建

单击【完成】按钮,完成目标的创建,如图8-96所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_172" o:spid="_x0000_i1060" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image191.jpg" style='width:239.25pt;height:153.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image103.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image103.jpg" o:title="image191" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image191.jpg

8-96 所创建的目标

上面完成了对应于BookMgr服务的总线目标“BookMgrDestination”的创建,同样的方法可建立对应于OrderMgrUserAccountMgr的总线目标OrderMgrDestinationUserAccountMgrDestionation,如图8-97所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_173" o:spid="_x0000_i1059" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image192.jpg" style='width:252.75pt;height:186pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image104.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image104.jpg" o:title="image192" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image192.jpg

8-97 对每个服务创建总线目标

这些总线目标的名字可以随便起,在后面建立入站服务时要被选择到。

8.7.7 创建出站服务

如前所述,总线目标在收到服务请求后,会将请求消息送到出站服务器端口上出站服务器端口会进一步将请求消息转给外部服务提供者出站服务器端口在得到响应消息后,会返回给总线目标。下面是创建出站服务的过程。

创建出站服务前,首先要找到外部服务提供者的Web Service组件的WSDL的路径地址,如图8-98所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_174" o:spid="_x0000_i1058" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image193.jpg" style='width:178.5pt;height:153pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image105.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image105.jpg" o:title="image193" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image193.jpg

8-98 创建出站服务

BookMgr.wsdl中找到相应的wsdlSOAP:address,见下面的黑体部分。

<wsdl:service name="BookMgrService">

<wsdl:port binding="impl:BookMgrSOAPBinding" name="BookMgr">

<wsdlSOAP:address location=

"http://localhost:9080/routerProject/services/BookMgr"/>

</wsdl:port>

</wsdl:service>

在浏览器链接中输入http://localhost:9080/routerProject/services/BookMgr?wsdl,也就是在从WSDL文件中所得到的地址(Web服务地址)后面加上?wsdl,以便查出WSDL文件的地址,如图8-99所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_175" o:spid="_x0000_i1057" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image194.jpg" style='width:325.5pt;height:75.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image106.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image106.jpg" o:title="image194" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image194.jpg

<!--[if gte vml 1]><v:shape id="图片_x0020_176" o:spid="_x0000_i1056" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image195.jpg" style='width:327pt;height:195.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image107.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image107.jpg" o:title="image195" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image195.jpg

8-99 通过URL得到WSDL的地址

这样可以得到BookMgr.wsdl的路径如下。

http://localhost:9080/routerProject/services/BookMgr/wsdl/BookMgr.wsdl

同样的方法可以得到OrderMgr.wsdlUserAccountMgr.wsdl的路径如下。

http://localhost:9080/routerProject/services/OrderMgr/wsdl/OrderMgr.wsdl

http://localhost:9080/routerProject/services/UserAccountMgr/wsdl/UserAccountMgr.wsdl

有了上面的WSDL文件的路径,就可以创建相应的出站服务了,下面是创建BookMgr的出站服务过程。

打开服务总线“BookStoreBus”对话框,如图8-100所示。

选择其他属性目录下面的出站服务菜单,弹出出站服务新建对话框,如图8-101所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_177" o:spid="_x0000_i1055" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image196.jpg" style='width:241.5pt;height:168.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image108.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image108.jpg" o:title="image196" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image196.jpg

8-100 创建BookMgr出站服务

<!--[if gte vml 1]><v:shape id="图片_x0020_178" o:spid="_x0000_i1054" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image197.jpg" style='width:243pt;height:122.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image109.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image109.jpg" o:title="image197" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image197.jpg

8-101 新建出站服务

单击【新建】按钮,弹出找目标服务WSDL”对话框,在“WSDL位置文本框中输入所得到的WSDL路径,在“WSDL 位置类型目录下面选取“URL”选项,这里是直接通过WSDL中所提供的URI地址来查找服务的,如图8-102所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_179" o:spid="_x0000_i1053" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image198.jpg" style='width:221.25pt;height:168.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image110.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image110.jpg" o:title="image198" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image198.jpg

8-102 查找目标服务WSDL

单击【下一步】按钮,在弹出的对话框中的服务下拉列表中选择相应的服务接口一个WSDL文件中可能含有多个服务接口,选择一个要加入服务总线的服务接口,如图8-103所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_180" o:spid="_x0000_i1052" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image199.jpg" style='width:249.75pt;height:200.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image111.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image111.jpg" o:title="image199" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image199.jpg

8-103 选择服务

单击【下一步】按钮,弹出选择端口对话框,如图8-104所示,选取默认设置。

<!--[if gte vml 1]><v:shape id="图片_x0020_181" o:spid="_x0000_i1051" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image200.jpg" style='width:314.25pt;height:170.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image112.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image112.jpg" o:title="image200" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image200.jpg

8-104 服务器端口

单击【下一步】按钮,在弹出的对话框中输入下面的属性值,如图8-105所示,以便以后在总线目标中创建默认转发路由路径时调用。

l 出站服务名称BookMgrOutboundService

l Service destinationBookMgrOutboundService

l Port destinationBookMgrOutboundPort

<!--[if gte vml 1]><v:shape id="图片_x0020_182" o:spid="_x0000_i1050" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image201.jpg" style='width:261pt;height:169.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image113.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image113.jpg" o:title="image201" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image201.jpg

8-105 出站服务和destination的名称

单击【下一步】按钮,在弹出的对话框的总线成员下拉列表中选择相应的服务器,如图8-106所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_183" o:spid="_x0000_i1049" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image202.jpg" style='width:312pt;height:171pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image114.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image114.jpg" o:title="image202" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image202.jpg

8-106 将端口指定给总线成员

单击【完成】按钮,所创建的出站服务如图8-107所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_184" o:spid="_x0000_i1048" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image203.jpg" style='width:291pt;height:123.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image115.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image115.jpg" o:title="image203" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image203.jpg

8-107 所创建的出站服务

上面是所创建的对应于BookMgr的出站服务BookMgrOutboundServer,同理可建立对应于OrderMgrUserAccountMgr的出站服务,如图8-108所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_185" o:spid="_x0000_i1047" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image204.jpg" style='width:300.75pt;height:156pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image116.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image116.jpg" o:title="image204" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image204.jpg

8-108 建立对应于OrderMgrUserAccountMgr的出站服务

8.7.8 创建默认转发路由路径

在总线目标中创建默认转发路径的目的在于当总线目标收到端点监听器传来的服务请求消息后,它将根据这里设置的默认转发路由路径将服务请求消息转到定义的出站服务器端口,出站服务器端口会进一步将请求消息转给外部服务提供者。下面是在BookMgrDestination中创建默认转发路由路径的过程。

打开目标对话框,如图8-109所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_186" o:spid="_x0000_i1046" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image205.jpg" style='width:261.75pt;height:198.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image117.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image117.jpg" o:title="image205" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image205.jpg

8-109 选择目标

选择目标“BookMgrDestination”选项,打开如图8-110所示对话框,在默认转发路由路径文本框中输入相应的出站服务的名称,如“BookStoreBus: BookMgrOutboundService”

<!--[if gte vml 1]><v:shape id="图片_x0020_187" o:spid="_x0000_i1045" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image206.jpg" style='width:222pt;height:202.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image118.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image118.jpg" o:title="image206" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image206.jpg

8-110 目标对话框

同理可在OrderMgrDestinationUserAccountMgrDestination中创建下面的默认转发路由路径。

l BookStoreBusOrderMgrOutboundService

l BookStoreBusUserAccountMgrOutboundService

8.7.9 创建入站服务

服务总线需要给它所提供的每个服务创建相应的入站服务,并同时与端点监听器总线目标相关联,以便以后服务调用者根据入站服务的WSDL文件服务总线发出SOAP请求消息时,能被该端点监听器收到,同时将请求消息转到这里定义的总线目标。下面是创建BookMgr入站服务的过程。

打开服务总线“BookStoreBus”对话框,如图8-111所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_188" o:spid="_x0000_i1044" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image207.jpg" style='width:237pt;height:138pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image119.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image119.jpg" o:title="image207" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image207.jpg

8-111 创建BookStoreBus入站服务

选择其他属性目录下面的入站服务选项弹出入站服务新建对话框,如图8-112所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_189" o:spid="_x0000_i1043" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image208.jpg" style='width:319.5pt;height:135.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image120.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image120.jpg" o:title="image208" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image208.jpg

8-112 选择入站服务

单击【新建】按钮,在弹出对话框的模板WSDL位置文本框中输入BookMgr服务的WSDL路径;在模板 WSDL 位置类型目录下面选取“URL”选项,这里是直接通过WSDL中所提供的URI地址来查找服务的;在“Service destination 下拉列表中选择对应于该入站服务的总线目标,如图8-113所示。BookMgrWSDL路径如下。

http://localhost:9080/routerProject/services/BookMgr/wsdl/BookMgr.wsdl //和前面的一样吗? 一样的!

<!--[if gte vml 1]><v:shape id="图片_x0020_190" o:spid="_x0000_i1042" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image209.jpg" style='width:324.75pt;height:211.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image121.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image121.jpg" o:title="image209" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image209.jpg

8-113 选择service destination和模板WSDL位置

单击【下一步】按钮,在弹出的对话框中的服务下拉列表中选择相应的服务接口。一个WSDL文件中可能含有多个服务接口,选择一个要加入服务总线的服务接口,如图8-114所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_191" o:spid="_x0000_i1041" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image210.jpg" style='width:285pt;height:151.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image122.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image122.jpg" o:title="image210" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image210.jpg

8-114 从模板WSDL选择服务

单击【下一步】按钮,弹出入站服务命名对话框,为入站服务起一个相应的名称,并选择端点监听器,如图8-115所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_192" o:spid="_x0000_i1040" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image211.jpg" style='width:280.5pt;height:154.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image123.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image123.jpg" o:title="image211" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image211.jpg

8-115 命名入站服务并选择endpoint listeners

单击【下一步】按钮,弹出入站服务发布对话框,如图8-116所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_193" o:spid="_x0000_i1039" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image212.jpg" style='width:279.75pt;height:150pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image124.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image124.jpg" o:title="image212" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image212.jpg

8-116 定义UDDI发布属性

单击【完成】按钮,则完成了BookMgr的入站服务的创建工作,如图8-117所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_194" o:spid="_x0000_i1038" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image213.jpg" style='width:4in;height:123.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image125.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image125.jpg" o:title="image213" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image213.jpg

8-117 完成BookMgr入站服务的创建

同样可根据OrderMgrUserAccountMgrWSDL路径创建相应的入站服务,如图8-118所示,它们的WSDL路径如下。

http://localhost:9080/routerProject/services/OrderMgr/wsdl/OrderMgr.wsdl

http://localhost:9080/routerProject/services/UserAccountMgr/wsdl/UserAccountMgr.wsdl

<!--[if gte vml 1]><v:shape id="图片_x0020_195" o:spid="_x0000_i1037" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image214.jpg" style='width:282pt;height:147.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image126.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image126.jpg" o:title="image214" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image214.jpg

8-118 根据OrderMgrUserAccountMgrWSDL路径创建相应的入站服务

8.7.10 发布入站服务

创建入站服务后,需要给外部请求者创建相应的入站服务的WSDL文件以便外部请求者能根据WSDL文件向服务总线发出相应的服务请求。发布入站服务包括下面两个步骤。

1)企业服务总线通过发布入站服务,创建相应的WSDL文件,给其他系统来调用。

进入服务总线页面,打开入站服务对话框,选择所要发布的入站服务的选项,打开相应的入站服务对话框,如图8-119所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_196" o:spid="_x0000_i1036" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image215.jpg" style='width:333pt;height:165.75pt;visibility:visible' o:gfxdata="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 "> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image127.png" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image127.png" o:title="" /> <o:lock v:ext="edit" aspectratio="f" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image215.jpg

8-119 发布入站服务

在对话框的其他属性目录下面,选择WSDL文件发布到ZIP文件选项,弹出发布WSDL文件对话框,如图8-120所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_197" o:spid="_x0000_i1035" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image216.jpg" style='width:245.25pt;height:105pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image129.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image129.jpg" o:title="image216" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image216.jpg

8-120 WSDL文件发布到ZIP文件

选中图8-120中的ZIP文件链接,则可将ZIP文件下载到本地目录,如图8-121所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_198" o:spid="_x0000_i1034" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image217.jpg" style='width:222.75pt;height:136.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image130.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image130.jpg" o:title="image217" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image217.jpg

8-121 ZIP文件下载到指定目录

每个入站服务可以得到4WSDL文件。

2)验证企业服务总线的服务是否正常工作。

打开BookStoreBus.BookMgrDestinationInboundServiceService.wsdl文件,参见如下代码。

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions targetNamespace="http://www.ibm.com/websphere/sib

/webservices/liangahNode01Cell/BookStoreBus/Service"

xmlns:sibusbinding="http://www.ibm.com/websphere/sib/webservices

/liangahNode01Cell/BookStoreBus/

BookMgrDestinationInboundService/Binding"

xmlns:impl=http://sessionbean.ejb.bkstore.com

xmlns:intf="http://sessionbean.ejb.bkstore.com"

xmlns:wsdlSOAP=http://schemas.xmlSOAP.org/wsdl/SOAP/

xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd"

xmlns:xsd=http://www.w3.org/2001/XMLSchema

xmlns:tns2="http://dto.service.model.bkstore.com"

xmlns:SOAP=http://schemas.xmlSOAP.org/wsdl/SOAP/

xmlns:wsdl="http://schemas.xmlSOAP.org/wsdl/">

<wsdl:import namespace="http://www.ibm.com/websphere/sib

/webservices/liangahNode01Cell/BookStoreBus/

BookMgrDestinationInboundService/Binding" location=

"BookStoreBus.BookMgrDestinationInboundServiceBindings.wsdl"/>

<wsdl:service name="BookMgrDestinationInboundService">

<wsdl:port name="SOAPHTTPChannel1InboundPort"

binding="sibusbinding:SOAPHTTPChannel1InboundPortBinding">

<!-- Web Service组件BookMgr在服务总线中进行入站服务的服务地址 -->

<wsdlSOAP:address location="http://localhost:9080/wsgwSOAPhttp1

/SOAPhttpengine/BookStoreBus/

BookMgrDestinationInboundService/SOAPHTTPChannel1InboundPort"/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

输入上面的入站服务的地址(在末尾加?wsdl):http://localhost:9080/ wsgwSOAPhttp1/SOAPhttpengine/BookStoreBus/BookMgrDestinationInboundService/SOAPHTTPChannel1InboundPort?wsdl,如图8-122所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_199" o:spid="_x0000_i1033" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image218.jpg" style='width:304.5pt;height:123.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image131.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image131.jpg" o:title="image218" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image218.jpg

8-122 输入入站服务地址

页面有输出,表示企业服务总线服务正常。

8.8 Eclipse3.1.2上创建相应的调用SOA Web

ServiceStruts客户端类

这里将在Eclipse3.1.2WebLogic 9.1Struts上来调用RAD Websphere 6.0所提供的SOA服务,实现跨不同服务器的基于SOA架构的整合应用。

8.8.1 复制入站服务的WSDL到相应的Eclipse目录下

如下为入站服务的3WSDL

l 后缀为ServiceService.wsdl

l 后缀为ServicePortTypes.wsdl

l 后缀为ServiceBindings.wsdl

具体说明分别如下。

Ø BookStoreBus.BookMgrDestinationInboundServiceService.wsdl

Ø BookStoreBus.BookMgrDestinationInboundServicePortTypes.wsdl

Ø BookStoreBus.BookMgrDestinationInboundServiceBindings.wsdl

Ø BookStoreBus.OrderMgrDestinationInboundServiceService.wsdl

Ø BookStoreBus.OrderMgrDestinationInboundServicePortTypes.wsdl

Ø BookStoreBus.OrderMgrDestinationInboundServiceBindings.wsdl

Ø BookStoreBus.UserAccountMgrDestinationInboundServiceService.wsdl

Ø BookStoreBus.UserAccountMgrDestinationInboundServicePortTypes.wsdl

Ø BookStoreBus.UserAccountMgrDestinationInboundServiceBindings.wsdl

将上述内容复制到相应的Eclipse目录下,如图8-123所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_253" o:spid="_x0000_i1032" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image219.jpg" style='width:216.75pt;height:153.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image132.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image132.jpg" o:title="image219" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image219.jpg

8-123 将入站服务的3WSDL复制到Eclipse目录下

8.8.2 创建相应的Ant Build脚本生成相应的Web Service客户端程序

将上面的9WSDL文件复制到相应的目录后,就可以创建build.xml,以及用Ant Build生成相应的Web Service客户端程序了。

1.创建相应的build.xml(可参见第5章)

build.xml中定义如下相应的输出路径。

<property name="axis.home" location="C:/axis-1_1"/>

<property name="options.output" location="./Web Service Client Source"/>

build.xml定义如下原始的WSDL文件和所在目录。

<!--下面定义对应于上面

<target name="all">

<antcall target="bindings1"/>

<antcall target="portTypes1"/>

<antcall target="service1"/>

……

</target>

<!--下面是以BookStoreBus.UserAccountMgrDestinationI

nboundServiceService.wsdl为例,定义其所在目录为./wsdl,即相应的输出

目标targetbindings1,其他的8WSDL文件都进行类似的定义

-->

<target name="bindings1">

<antcall target="-WSDL2Axis">

<param name="options.WSDL-URI"

location="./wsdl/BookStoreBus.UserAccountMgrDestinationInbound

ServiceService.wsdl"/>

</antcall>

</target>

2.在Eclipse中运行相应的Ant Build

用鼠标右键单击“build.xml”,在弹出的快捷菜单中选【Run AsAnt Build】命令,如图8-124所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_254" o:spid="_x0000_i1031" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image220.jpg" style='width:310.5pt;height:106.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image133.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image133.jpg" o:title="image220" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image220.jpg

8-124 选择【Ant Build

弹出“Ant Build”对话框,如图8-125所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_255" o:spid="_x0000_i1030" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image221.jpg" style='width:255.75pt;height:231pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image134.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image134.jpg" o:title="image221" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image221.jpg

8-125 “Ant Build”对话框

3Ant Build所生成的Web Service客户端程序

创建com.bkstore.ejb.sessionbean 包下面的客户端Java类,如图8-126所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_256" o:spid="_x0000_i1029" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image222.jpg" style='width:321.75pt;height:261.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image135.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image135.jpg" o:title="image222" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image222.jpg

8-126 创建com.bkstore.ejb.sessionbean目录下面的客户端Java

下面是所创建的exceptiondtoBindingBookStoreBus.Service包下的类,如图8-127所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_257" o:spid="_x0000_i1028" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image223.jpg" style='width:363pt;height:296.25pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image136.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image136.jpg" o:title="image223" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image223.jpg

8-127 创建的exceptiondtoBindingBookStoreBus.Service包下的类

上面所创建的类的内容类似于5.7节所介绍的WSDL所创建的Web Service的客户端Java类。

8.8.3 客户端和SOA Web Service的集成

本节将通过BookStoreMgrImp类(model class来调用相应的SOA Web Service,实现客户端和SOA Web Service的集成,如图8-128所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_258" o:spid="_x0000_i1027" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image224.jpg" style='width:218.25pt;height:279.75pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image137.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image137.jpg" o:title="image224" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image224.jpg

8-128 实现客户端和SOA Web Service的集成

客户端对SOAWeb Service的调用在BookStoreMgrImp.java中实现,参见如下代码,包括本章所实现的所有业务逻辑的接口调用。

package com.bkstore.model.service.imp;

……

public class BookStoreMgrImp implements BookStoreMgrIfc {

private BookMgr getBookMgr() throws ServiceException

{

BookMgrDestinationInboundServiceLocator bookMgrLocator = new

BookMgrDestinationInboundServiceLocator();

return bookMgrLocator.getSOAPHTTPChannel1InboundPort();

}

private OrderMgr getOrderMgr() throws ServiceException

{

OrderMgrDestinationInboundServiceLocator orderMgrLocator = new

OrderMgrDestinationInboundServiceLocator();

return orderMgrLocator.getSOAPHTTPChannel1InboundPort();

}

private UserAccountMgr getUserAccountMgr() throws ServiceException

{

UserAccountMgrDestinationInboundServiceLocator

userAccountMgrLocator=new

UserAccountMgrDestinationInboundServiceLocator();

return userAccountMgrLocator.getSOAPHTTPChannel1InboundPort();

}

public boolean checkUserLogin(String loginName, String password)

throws ServiceException,

RemoteException {

return getUserAccountMgr().checkUserLogin(loginName,password);

}

public void saveUserInfo(UserAccountDTO userAccountDTO) throws

ServiceException, RemoteException

{

getUserAccountMgr().saveUserInfo(userAccountDTO);

}

public List getUserList() throws ServiceException, RemoteException {

ArrayList list = new ArrayList();

ArrayOf_tns2_UserAccountDTO userAccountArrays =

getUserAccountMgr().getUserList();

UserAccountDTO[] userAccountDTOs =

userAccountArrays.getUserAccountDTO();

for (int i=0; i<userAccountDTOs.length; i++) {

list.add(userAccountDTOs[i]);

}

return list;

}

public void updateAccountBalance(UserAccountDTO userAccountDTO)

throws RemoteException, ServiceException

{

getUserAccountMgr().updateAccountBalance(userAccountDTO);

}

public UserAccountDTO getUserInfo(String loginName) throws

ServiceException, RemoteException {

return getUserAccountMgr().getUserInfo(loginName);

}

public void createBook(BookDTO bookDTO) throws RemoteException,

ServiceException {

getBookMgr().createBook(bookDTO);

}

public BookDTO getBook(int getBookBookID) throws RemoteException,

ServiceException {

return getBookMgr().getBook(getBookBookID);

}

public ArrayOf_tns2_BookDTO getBookList() throws RemoteException,

ServiceException {

return getBookMgr().getBookList();

}

public void createOrderItem(ArrayOf_tns2_OrderItemDTO

orderItemDTOs) throws RemoteException, ServiceException

{

getOrderMgr().createOrderItem(orderItemDTOs);

}

public int createOrder(OrderDTO orderDTO) throws RemoteException,

ApplicationException, ServiceException

{

return getOrderMgr().createOrder(orderDTO);

}

}

1getBookMgr:得到基于SOA 的关于图书管理BookMgr入站服务的Web Service组件。

l 得到基于SOA的关于图书管理BookMgr入站服务的Web Service的地址。

l 返回基于SOA的关于图书管理BookMgr入站服务的Web Service服务接口。

2getOrderMgr:得到基于SOA 的关于购物车OrderMgr入站服务的Web Service组件。

l 得到基于SOA的关于购物车OrderMgr入站服务的Web Service的地址。

l 返回基于SOA的关于购物车OrderMgr入站服务的Web Service服务接口。

3getUserAccountMgr:得到基于SOA 的关于用户账户管理UserAccountMgr入站服务的Web Service服务接口。

l 得到基于SOA的用户账户管理UserAccountMgr入站服务的Web Service的地址。

l 返回基于SOA的关于用户账户管理UserAccountMgr入站服务的Web Service服务接口。

4checkUserLogin:检查用户登录的用户名和密码是否正确。

调用SOAWeb Service接口checkUserLogin去检查用户名和密码是否正确。

5saveUserInfo:存储用户信息。

调用SOAWeb Service接口saveUserInfo存储用户信息。

6getUserList:得到所有用户信息。

l 创建一个ArrayList的实例。

l 调用SOAWeb Service接口getUserList得到所有用户的数组。

l 将所有用户的数组加入到ArrayList之中。

l 返回ArrayList

7updateAccountBalance:更新用户账户资金。

调用SOAWeb Service接口updateAccountBalance更新用户账户资金。

8getUserInfo:通过用户名得到用户信息。

调用SOAWeb Service接口getUserInfo通过用户名得到用户信息。

9createBook:创建和加入新的图书到图书管理系统。

调用SOAWeb Service接口createBook创建和加入新的图书到图书管理系统。

10getBook:通过系统的图书号查询一本书。

调用SOAWeb Service接口getBook通过系统的图书号查询一本书。

11getBookList:得到包含系统所有图书的一个数组。

调用SOAWeb Service接口getBookList得到包含系统所有图书的一个数组。

12createOrderItem:创建图书订单明细。

调用SOAWeb Service接口createOrderItem创建图书订单明细。

13createOrder:创建图书订单。

调用SOAWeb Service接口createOrder创建图书订单。

8.8.4 创建相应的Struts Action Bean

Struts Action Bean类将模型层和视图JSP关联起来,在Action Beanexecute方法中调用上面的BookStoreMgrImp的接口,如图8-129所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_259" o:spid="_x0000_i1026" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image225.jpg" style='width:172.5pt;height:232.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image138.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image138.jpg" o:title="image225" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image225.jpg

8-129 创建相应的Struts Action Bean

8.8.5 创建相应的JSP

JSP来实现视图(页面显示),JSP是通过相应的Strutstag libForm Bean来创建的,如图8-130所示。

<!--[if gte vml 1]><v:shape id="图片_x0020_260" o:spid="_x0000_i1025" type="#_x0000_t75" alt="http://book.csdn.net/BookFiles/262/img/image226.jpg" style='width:149.25pt;height:280.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image139.jpg" mce_src="file:///C:/DOCUME~1/bobo/LOCALS~1/Temp/msohtmlclip1/01/clip_image139.jpg" o:title="image226" /> </v:shape><![endif]-->http://book.csdn.net/BookFiles/262/img/image226.jpg

8-130 创建相应的JSP

8.9 运行本章的例子

本书所附光盘提供了本章实例源代码,读者需要先创建一个对应于RADchapter_8_rad_workspace,然后导入光盘目录chapter_8_rad_workspace下面的bkstoreEJBProjectEAR.ear即可(可参照第7章例子)。

读者还需要完成下面的工作。

1)配置数据源(参见第7章)。

2)根据8.2节创建DB2的数据库表和数据。

3)在RAD上启动ServerAdmin Console

4)完成8.7节所说明的建立服务总线的所有工作。

5)发布入站服务,生成WSDL文件。

此外读者需要将光盘里的chap_8_eclipse.zip解压缩,然后将Eclipse3.1.2指向chap_8_eclipse以运行WebLogic(参照第7章的例子),以实现WebLogicWebsphere的服务总线的调用。因为每个人的机器的名字不同,读者需要用自己所创建的入站服务的WSDL文件覆盖光盘中的WSDL文件,重新生成和编译客户端代码。

8.10 小结

本章首先介绍了SOA出现的原因在于其能够提供一个整合和监控各种松散耦合(或完全解耦)的各种服务的整合平台。然后详细介绍了如何创建基于Websphere 6.0 SIBus服务总线的SOA架构的企业服务系统。以一个网上书店系统的实例,详细介绍了SOA的实施过程。完成了在Websphere 6.0上建立SOA的网上书店服务体系。在WebLogic 9.1中应用Struts调用SOA Web Service客户端,实现基于SOA架构的StrutsEJBWeb ServiceJ2EE跨服务器平台整合应用开发。一个SOA的实施主要包括以下几个方面。

l 对业务需求进行分析,将整个业务需求划分为松散耦合的子服务系统,实现本章第1节所述的SOA的第1个要点。

l 对服务接口方法进行粗粒度的接近业务实际服务操作的划分,实现SOA的第2个要点。

l 在进一步细化业务需求的基础上对各个子服务系统进行数据库设计、建模、创建类图、创建时序图等设计工作。

l 在设计的基础上通过IDE工具实现各个子服务系统的编程开发。

l 通过服务总线将各个子服务系统进行集成,实现SOA的第3个要点,即服务的地址和传输协议的透明化(此外Websphere 6.0 SIBus作为服务总线进一步提供了修改消息格式,修改消息内容,以及改变传输协议等强大功能,有兴趣的读者可以进行进一步的探讨)。

l 将用户界面系统和服务总线进行集成。

本书第6章介绍了基于BEA Aqulogic服务总线的SOA的实现,本章进一步介绍了基于IBM SIBus服务总线的SOA的实现,这样对基于目前市面上两大主流J2EE厂商的服务总线ESB产品进行SOA的实施本书都介绍到了,希望能对读者将来的SOA项目实施起到帮助和借鉴作用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics