目前全球最大的软件服务商IBM在实施SOA方面一直处于领先地位,因此通过介绍如何用IBM的服务总线产品来构建SOA架构更能使开发人员把握SOA的精髓。
服务总线是实现SOA架构最核心的部分,它将对系统内部或者外部的各种服务进行集成和管理。目前IBM基于企业服务总线的产品有Websphere 6.0上自带的SIBus(Service Integration Bus),由于它已经和Websphere集成在一起,从而使它可以应用Websphere所带有的各种资源。从对这个产品的实施中,我们可以观察到它实施服务总线(ESB)架构的技术思路主要是通过消息引擎来驱动的。SIBus比BEA的Aqulogic服务总线多了一个消息层,也就是读者将要在下面章节中看到的目标(Destination),SIBus是通过消息队列Queue或者Topic等来实现的。这是服务总线中最核心的部分,笔者十分看好其技术前景。本章将通过一个网上书店的实例详细介绍如何基于IBM Websphere SIBus服务总线来构建SOA架构体系的整合应用,包括下面几个方面的内容。
l 基于企业服务总线SIBus构建SOA架构的基本原理。
l 创建网上书店系统的DB2数据库。
l 创建网上书店系统的组件架构。
l 创建网上书店的实际业务流程和实现步骤。
l 在Websphere RAD创建网上书店的业务模型服务组件,包括Session Bean、CMP和Web 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]-->
图8-1 网上书店系统主页
8.1.2 网上书店系统SOA实施
SOA实施规划是最关键的。SOA的出发点完全不同于现有的建模和组件的出发点。现有的软件实施也是实际项目中的真实情况:软件的设计和开发人员在拿到业务需求后,马上就会想到是不是需要用到Struts的MVC架构,是用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]-->
<!--[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]-->
<!--[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]-->
图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]-->
图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_id和order_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,-- 注册费、资金结余
--定义accountid和userid为主键,此表有多个主键
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]-->
图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]-->
图8-5 数据库ERWin的逻辑图
8.2.3 在DB2上创建数据库表
本章所创建的数据库表如图8-6到图8-10所示。
(1)USER表——记录用户详细信息
<!--[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]-->
图8-6 DB2的USER表
(2)ACCOUNT表——记录用户资金账户信息
<!--[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]-->
图8-7 DB2的ACCOUNT表
(3)BOOK表——记录图书的详细信息
<!--[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]-->
图8-8 DB2的BOOK表
(4)ORDER表——记录用户每次购买的总的信息
<!--[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]-->
图8-9 DB2的ORDER表
(5)ORDER_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]-->
图8-10 DB2的ORDER_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]--> 图8-11 网上书店的组件图 l JSP组件:负责页面显示。 l Struts Action Bean:控制器部分,负责页面层和逻辑层的结合,以及页面转换。 l ClientManagerImp:负责调用后台服务的组件。 l SOA Service Integration Bus:SOA服务总线。 l Web Service:Web服务组件。 l Session Bean:负责业务逻辑。 l Entity Bean CMP:负责数据库层的操作。 2.Class类图 图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]--> 图8-12 网上书店的类图 8.4 网上书店的业务和时序图 为了让读者尽快掌握创建SOA应用的方法和步骤,下面详细介绍各个服务接口是如何实现的,包括介绍业务需求、时序图和实现步骤,使读者能尽快掌握精髓,运用到实际项目中去。 8.4.1 注册系统业务和时序图 用户需要通过注册系统来将他们的有关个人信息登记到网上书店系统中,这些个人信息是用户购书时需要的。下面将介绍具体的业务需求及实现步骤。 1.注册系统业务需求简介 做任何一个项目首先需要知道具体的业务,下面首先介绍注册系统总的业务需求。 (1)提供用户界面给用户,输入他们的Name(姓名)、Login Name(登录名)、Password(密码)、Phone(电话号码)、E-mail和Registration Fee(注册费)。 (2)提供用户界面的输入校验。 l 所有字段不能为空。 l 登录名和密码不能少于5个字符。 l 电话号码必须按888-888-8888的格式输入。 l E-mail必须按aaa@aaa.com的格式输入。 l 注册费必须输入数字。 (3)用户填完注册信息,单击【Save】按钮之后,所有的用户信息将会记录到数据库USER表和ACCOUNT表中。 (4)用户注册成功后系统将给出成功注册的信息。 2.注册系统业务及实现 下面是本章所实现的业务详解。 (1)用户输入个人信息后,系统进行页面校验。 这里通过Struts的Validator来实现页面校验,返回具体的错误信息让用户修正,如图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]--> 图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]--> 图8-14 注册页面输入正确信息 (3)用户注册成功后系统将给出成功注册的信息。 用户个人信息存入到数据库后,Action Form经过ActionMapping的forward方法将页面消息输出到页面,在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]--> 图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]--> 图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]--> 图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="UEsDBBQABgAIAAAAIQAmAzrEEQEAAFACAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbKSSu07DMBSG dyTewfKKEqcMCKEkHbiMwFAe4GCfJFZ9k+2W9u05SdOlKllYLPtc/v/zsev1wRq2x5i0dw1flRVn 6KRX2vUN/9q8FY+cpQxOgfEOG37ExNft7U29OQZMjLpdaviQc3gSIskBLaTSB3SU6Xy0kOkYexFA bqFHcV9VD0J6l9HlIo8avK1fsIOdyez1QOETSUSTOHs+FY5eDYcQjJaQiVTsnbpwKWaHkjqnmjTo kO4Ig4urDmPmb4O574NGE7VC9gkxv4MlDCGNDt8eohIqwg8NKp03q3JZ9Aq17zotUXm5szSRclZc wO51d4Gt7TjYMU4XXQbO9D4opvX/rJPMmVRM/6H9BQAA//8DAFBLAwQUAAYACAAAACEArTA/8cEA AAAyAQAACwAAAF9yZWxzLy5yZWxzhI/NCsIwEITvgu8Q9m7TehCRpr2I4FX0AdZk2wbbJGTj39ub i6AgeJtl2G9m6vYxjeJGka13CqqiBEFOe2Ndr+B03C3WIDihMzh6RwqexNA281l9oBFTfuLBBhaZ 4ljBkFLYSMl6oAm58IFcdjofJ0z5jL0MqC/Yk1yW5UrGTwY0X0yxNwri3lQgjs+Qk/+zfddZTVuv rxO59CNCmoj3vCwjMfaUFOjRhrPHaN4Wv0VV5OYgm1p+LW1eAAAA//8DAFBLAwQUAAYACAAAACEA B5laGWYDAADRCAAAHwAAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWysVetu0zAY/Y/E O1j5T9N26+gqsgkGRUhcqg3Eb9dxYwvHDrabjidAPAPvwtsgXoNjJ2nTajC0MSmrr+c73/kufnJ+ XSpSc+uk0VkyGgwTwjUzudRFlnx4P380TYjzVOdUGc2z5At3yfnZwwdP6KywtBKSESBoN6NZIryv ZmnqmOAldQNTcY29lbEl9ZjaIs0t3QC5VOl4ODxJSyp1craDek49JWsr7wClDPvE8wuqa+oAqdis v9JyVOz+yHSm65e2uqoWNjBnb+uFJTLPEiinaQmJkrTdaI9hmh7cKnYA1ytbhvNmtSLXEeVL+B8x +LUnDIvHj8fHx0MYYNgbnUwnp+NJa0W8u+EeEy9uuQlCjWEMemTakM4tHAmkgqsxyHHl0OOjcefy z+8/fn37SsJCzh2zW5mXxnwaMJfrgeY+fYbZXCru0vHJOJVlgY8WfDQaDgq56ul2aLPP6zUi7Yg2 F4Lqgj91FWceqoTbcAbxOKTciv8HzOBmC3+P9Ksk82vLkXkYzfC1GYfRVot/r4t9NF0vJAvaY/mm fMNusP0f1O8MNOZo8ONPau8CYK3ZCE5z1wVhHyUN0z0XlkpWyAIVlA/jVqpd0vxFKFSJZPy5YeuS a990EcsV9WhfTsjKJcTOeLnkKEj7Ko9ZQWfOsktkSawp5y33TATjK5Bo15Ej243IeEcy8HeodrLc vDE56puuvUGguwq6W+nCYFf5lXX+JTclCQPQBtMIT+vXLnDG0e5IsOqMknmnn7PF8kJZUlOVJfP4 F+86QXPerE4nQ7SOBqc9HjH3cJQmmyyZTk9jl6FVlrjPDdBt1lrg/rFSem6JkiUQYXtrXenAn69W 8BCuhYlZ4+iVyDdkqdb2kiJsk8iX5DKIMQoAaCoS2TFBC4wzqgq8VV4h1sZ/lF5cCVohMMOGcV+S eKNZp6oStJEkAt0gyZZNFGiPqGNc86M8cGZojpa20TLWC7NtT0b7pospWQh/KQtiJd5RvzEL33rR xBbECbI29ns8rPHX8jpLHuNhDE42snYwTcB2FFzVUFnymqv3IXTjoE5CBCQ7HU7a94OBj1lbJEhM nL4wba40ZvrnQiVE9FgGIfFhPNQAvkij1yz782Chy+i7vGXbgsBgq2d8htKDx7xvNbTs/vzsNwAA AP//AwBQSwMEFAAGAAgAAAAhAEybJ6HSAAAAqwEAACoAAABjbGlwYm9hcmQvZHJhd2luZ3MvX3Jl bHMvZHJhd2luZzEueG1sLnJlbHOskM9KBDEMh++C71Byt5nZg4hsZy8i7FXWBwhtplOc/qGt4r69 0b04sODFSyAJ+fLx2x8+46o+uLaQk4FRD6A42exC8gZeT893D6Bap+RozYkNnLnBYbq92b/wSl2O 2hJKU0JJzcDSe3lEbHbhSE3nwkk2c66RurTVYyH7Rp5xNwz3WH8zYNow1dEZqEe3A3U6F/n8NzvP c7D8lO175NSvvMAuXixAqp67Aa0vk0sdtbgCXtcY/1MjRIlgoxHZBcKf+ah9mL81cBPx9AUAAP// AwBQSwMEFAAGAAgAAAAhAOFRNx/PBgAA5hsAABoAAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnht bOxZzW/cRBS/I/E/jHxvs9/NRt1U2c1uA23aKNkW9Thrz9rTjD3WzGzSvaH2iISEKIgDlbhxQECl VuJS/ppAERSp/wJvZmyvJ+uQtI2gguaQtZ9/877fm6/LV+7FDB0QISlPel79Ys1DJPF5QJOw590a jy6sekgqnASY8YT0vDmR3pX199+7jNd8RtMJxyIYRyQmCBglcg33vEipdG1lRfpAxvIiT0kC36Zc xFjBqwhXAoEPQUDMVhq1WmclxjTx1oGj0oyGDP4lSmqCz8SeZkNQgmOQfnM6pT4x2GC/rhFyLgdM oAPMeh7wDPjhmNxTHmJYKvjQ82rmz1tZv7yC17JBTJ0wtjRuZP6ycdmAYL9hZIpwUgitj1rdS5sF fwNgahk3HA4Hw3rBzwCw74OlVpcyz9Zotd7PeZZA9nGZ96DWrrVcfIl/c0nnbr/fb3czXSxTA7KP rSX8aq3T2mg4eAOy+PYSvtXfGAw6Dt6ALL6zhB9d6nZaLt6AIkaT/SW0DuholHEvIFPOtirhqwBf rWXwBQqyocguLWLKE3VSrsX4LhcjAGggw4omSM1TMsU+5OQAxxNBsRaA1wgufbEkXy6RtCwkfUFT 1fM+THHilSAvn33/8tkTdHT/6dH9n44ePDi6/6Nl5IzawklYHvXi28/+fPQx+uPJNy8eflGNl2X8 rz988svPn1cDoXwW5j3/8vFvTx8//+rT3797WAHfEHhSho9pTCS6QQ7RLo/BMOMVV3MyEa82Yhxh Wh6xkYQSJ1hLqeA/VJGDvjHHLIuOo0efuB68LaB9VAGvzu46Cu9FYqZoheRrUewAtzlnfS4qvXBN yyq5eTxLwmrhYlbG7WJ8UCV7gBMnvsNZCn0zT0vH8EFEHDV3GE4UDklCFNLf+D4hFdbdodTx6zb1 BZd8qtAdivqYVrpkTCdONi0GbdEY4jKvshni7fhm+zbqc1Zl9SY5cJFQFZhVKD8mzHHjVTxTOK5i OcYxKzv8OlZRlZJ7c+GXcUOpINIhYRwNAyJl1ZibAuwtBf0aho5VGfZtNo9dpFB0v4rndcx5GbnJ 9wcRjtMq7B5NojL2A7kPKYrRDldV8G3uVoh+hzjg5MRw36bECffp3eAWDR2VFgmiv8yEjiW0aqcD xzT5u3bMKPRjmwPn146hAT7/+lFFZr2tjXgD5qSqStg61n5Pwh1vugMuAvr299xNPEt2CKT58sTz ruW+a7nef77lnlTPZ220i94KbVevG+yi2CyR4xNXyFPK2J6aM3JdmkWyhHkiGAFRjzM7QVLsmNII HrO+7uBCgc0YJLj6iKpoL8IpLLDrnmYSyox1KFHKJWzsDLmSt8bDIl3ZbWFbbxhsP5BYbfPAkpua nO8LCjZmtgnN5jMX1NQMziqseSljCma/jrC6VurM0upGNdPqHGmFyRDDZdOAWHgTFiAIli3g5Q7s xbVo2JhgRgLtdzv35mExUTjPEMkIBySLkbZ7OUZ1E6Q8V8xJAORORYz0Ju8Ur5WkdTXbN5B2liCV xbVOEJdH702ilGfwIkq6bo+VI0vKxckSdNjzuu1G20M+TnveFPa08BinEHWp13yYhXAa5Cth0/7U YjZVvohmNzfMLYI6HFNYvy8Z7PSBVEi1iWVkU8N8ylKAJVqS1b/RBreelwE2019Di+YqJMO/pgX4 0Q0tmU6Jr8rBLlG07+xr1kr5TBGxFwWHaMJmYhdD+HWqgj0BlXA0YTqCfoFzNO1t88ltzlnRlU+v DM7SMUsjnLVbXaJ5JVu4qeNCB/NWUg9sq9TdGPfqppiSPydTymn8PzNFzydwUtAMdAR8OJQVGOl6 7XlcqIhDF0oj6o8ELBxM74BsgbNY+AxJBSfI5leQA/1ra87yMGUNGz61S0MkKMxHKhKE7EBbMtl3 CrN6NndZlixjZDKqpK5MrdoTckDYWPfAjp7bPRRBqptukrUBgzuef+57VkGTUC9yyvXm9JBi7rU1 8E+vfGwxg1FuHzYLmtz/hYoVs6odb4bnc2/ZEP1hscxq5VUBwkpTQTcr+9dU4RWnWtuxlixutHPl IIrLFgOxWBClcN6D9D+Y/6jwmb1t0BPqmO9Cb0Vw0aCZQdpAVl+wCw+kG6QlTmDhZIk2mTQr69ps 6aS9lk/W57zSLeQec7bW7CzxfkVnF4szV5xTi+fp7MzDjq8t7URXQ2SPlyiQpvlGxgSm6tZpG6do EtZ7Htz8QKDvwRPcHXlAa2haQ9PgCS6EYLFkb3F6XvaQU+C7pRSYZk5p5phWTmnllHZOgcVZdl+S UzrQqfQVB1yx6R8P5bcZsILLbj/ypupcza3/BQAA//8DAFBLAwQKAAAAAAAAACEACJ05/zIXAAAy FwAAGgAAAGNsaXBib2FyZC9tZWRpYS9pbWFnZTEuZ2lmR0lGODlh8AGxAHcAMSH+GlNvZnR3YXJl 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]--> 图8-18 注册系统时序图 4.注册系统具体实现步骤 下面是实现如图8-18所示的时序图的具体步骤。 (1)用户单击“URL Regis.do”链接时,Struts的ActionServlet通过config.xml的配置将会指向Regis.jsp的页面。 (2)用户填写完注册信息后单击【Submit】按钮时,Struts会通过config.xml的配置调用RegistrationAction类的execute()方法,并将用户的信息存到UserAccountDTO类中。 (3)RegistrationAction类的execute()方法调用BookStoreMgrImp类的saveUserInfo()方法。 (4)BookStoreMgrImp类的saveUserInfo()方法调用WSDL所生成的接口的ServiceLocator去调用相应的SOA Service Integration Buses的入站服务。 (5)Service Integration Buses的入站服务调用相应的Web Service。 (6)Web Service调用Session Bean(BKStoreMgr)的saveUserInfo()。 (7)Session Bean调用Entity Bean CMP(UserCMP)。 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]--> 图8-19 “登录”界面 (2)用户输入一个系统没有注册的用户名时,系统会提示相应的错误。 程序回到后台数据库通过CMP来查询是否在数据库中有该用户名,通过findByLoginName的方法来查询。如果通过findByLoginName查不到任何记录,表示没有该loginName,服务器端会将该错误作为异常抛出到Action Bean,Action 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]--> 图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]--> |