4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
热卖商品
新闻详情
精通SOA:基于服务总线的Struts+EJB+WebService整合应用..._CSDN博客
来自 : CSDN技术社区 发布时间:2021-03-25

目前全球最大的软件服务商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 q1esEb KHUsUophDaNOqXcu2rdu1UJVGXfq2rl27cWve3cu3r9 8Bv0KHswX8FnCiBMjBpzwsOLH kNkyJug48l7DjelaLsyw8ubPeJGCHi1ZNOnTgidTRs26ruqSrUsjpezRc2zGtmN/Nqx7t2gybg4N WhJ8UIDjSQYpOT7ETSAqat8gr/vcbfW9hABxNtu7 vA3Q/h/6ZpkqNj5ccDQH97fW17t7hjF8qi fTRv1PPrW aNJ8whPFxAh4cRaL3RRRRoFXLFHOsdEkgSBfo32Htv5bfdQ7lFN91eFFqXnhH6QfZd hsItF4B/gRBxxyGGjBFGIOmpeJlD5WkmHIIsAkdafOGBdl PivE2CIJx1EHfGyCiNWRaADY4yBP1 FVJFAEbo4QQRRgISyBB2jBEAllNWuV6LVP7hZXpDbBEAEl5WeeWKsmFIHYSHvCGhZdfBEdx 3LWl 4IqFWOFccyW uF6Hbb323URi5LdkjmyECYiUaRoq5ZdwPncpEXNAoYSM4nUGpG8KkTjqjKUeMp8f WfxRhh1lzP9xnBF74OigEw06OKscKDpBp54DVgdjr vhISCu/0GIxxdZyHEsnYmGVdeTUUq66R2b MkgmiDBimtZ1RUqKXnPdgqoqfdHK2RaFgUDhxSF5bGEoWtdZmC5lTJmXFnrHUdGfg/6G0aKh/xrS B70Bs5gHt vxeKqIpj082H1xMPjfgUxCYWuTbeGRXr8Iv5HEv3V vJ6ewp3I4pnMnlGcErnCJS11 u6KYsMEF5 GvgFQ8 N d3X6Zhs3Z/ewzyaGpyxbS9E6Bxh9o8Bq0ua5hCNJ5CFIrHXIo96fplIQC fOkQakD3qMP4oWtfxKTZy2eq/znRawB04qFxggs2iEfdKgP/nCAWVfRsdt/XGRs3dEgC8gazzh7 1qKmquVxekmM7cbYZaM8ZHVIF/5xEmSeyPmdVSvtXoOC3PEcHGys4XXMdyl69b44Poj0v3a2d53u vvodKtsSLwZ88Kg2piQTgAq6Na0mkkt5yVT6MWUAyBaoXslDRHqcE mxSaXiH3MxxRjei/n4zG7t jZbHpCP8La6GGzv6t8XKnRbKuQvYPnx9shVocAN7TiC4EIbXpcZqH2kUfR5VJylMjwqXkttzJqei ejBX8fhFPdAhbbNfOyD6dnMjywDwg9GZoTE8xH63LI86fWLgnegoLbapCX9fetDLlRPtwI0vwSp TWamWwu//2z2JwOuxW1AbMiiJCKGEjrxiVA04e/glkLCoLCKpTMeFlXYv7ZE8YtgDCMY1TIit4gx jGREYG34cqkkrSts7kvj8LYYuznSMYlRuaMIV6jHiXVRN6pByBL/eBtR9bF4eTzkvRKpyMRAri0M RNleRGYZQuhBRgNDpCEjuSe7DDFFK8rk1O4wGZsMkkY96iC/rscWChVtLZaEXVooCcsLXigqQXPj 6WY5nVeuC5Mu8t8P60jFu2wNWtSRZRz94ktNGlKItpKkXQqBBSzASTEWJJRy9rfITUazkxW6QvLU oE0l2AxhuJmLvsKjShwZQkfTHOa5QnTEal5znn0xTJ7ASf8/etFpcfJUy5Zetj8kJk2Ld/FZnbjp F0TVxaAHRSVbIqm9CkoqEG8yVn/IpCKOdul7oytXDI/jLnjJS1VVqBRGiSBHiXJyU3W46JUs9q2S xuucAMOMOjcSubUB71GhM4L00hSgTaUhg3RYTpqOMz4q6SGDMQwYR48agKZWCapxwuV64vBRI5jJ qYgrApTWt6Y2WelDerDpFr6Q0i1w4UpGSuunZBWAI3zqnlNkpDDrQ60EyRRL9DFErKjA0ZiCtEHb AgRHkxqA5ngMdDRcKV7R8siJRvOkOLOZz97phifZ8kHCup789He0MFjQaVDj1c8CiMy8evN bigY HDSrLNL/BQK1UUNRjEhZqtnwNJXPVJKJjqNbgY0hQAXjQxUgVLRlZeGpz/oPGIDjWegE4gjPFW3v mEZZpEwtDQLS7vh0G71mPetfGMWtHOTWIi5AyIIgUl/iKHRF9tQMYArV0 YEpyvN6o1nwkpSf/IT v561tqUSheb9tNecrdGtOvyqFJMkpLkohFR/FqQC61znn67NC8GvRYuextYEygkLdQzaMHpzFZdS /padwb2RcJ5gho8Fp0ljixR0Qsesp75MQF1o3knP5eMS2RCPlPFccQLwssaCEw9SyILLjOxg9aiY UBzLsN8oycDuFpMvk0PO7gI2QQk5OAntqTDJQmda lTY/6GujTHeACVOhHUOcRLCqNmeYEvjABjP o8vwAAvoH9x9OC1lVFWd/3RDoEHnfyvjIQFXDGLZjQS4P61d33AXoG85EDr467F2w5tnZA3CCXwe 9c ymuT6hfdYEGxW3aLcODzAL889m7T93tBpLVcHSb5DtB2XxjdH/82aAhycsdf355QFx04Ebjb/ CEmv9BQQqpfSIQTrrGgtOBl7baBhBOe1US9tO4b GTd9 xe0QmfQsNoWLnE1JU5KC1suKukpF7/M QAc7kHrIzWCXCLTDplrVlngAlYK8PYRwV9WsRwZxTXL5Va9C3EFGqHGZyAfxbOOqiGwF KOfa13E DcFbEv HjVvc1sIHtoeSv26s9nRIucRiTw3HCVCLIHvY81FbkYbu5rBPc8p1eifGZ0y60kso9JIs /elPZ7VeGulIPlK9jfT0Mo3IQpWY6JtUX66QpLBYX/yMnT3KLDvVnTn0tUvdJzDhete5Ive6b6VU ds 7UOiu975bxSx D7xR4M4QAQxgIAQoAOEXz/jGO/7xkI98RgyPeMVL/vKYz7zmN8/5ixjgAAgQ COUFQoAEKCAAC2DA6RuAAAc8YAEQ6DxLAiD7hdC 9g65Pe5335PRA4AAEZAAACZAAOE7gAIOqABM dH955vPe bwnCPSjT32ITN8ivi/96S1wgfRU4PjVD7// MdP/ugbAAOxP3/sAeCAAAhfIOB/yfUd P//O13/39y9/9fPPkM HHv7pIQEZcBypd3oBgHwUsHyax3 Zx4D2p38QOBAOGIEUWIEWeIH0B3UT uBEbuBMdCHkfiHkhiIEgGIEjeBMnyHgpWIIkGH4r2IIwGIMyOIP7t4AuqH8vSIM6kYOPx4Mt4YM8 AYSEJ4Q6qIBFeIRImIRK2IA2WIPlR4RLmBJQCHdTeBJVKBNXuINRyIQqYQAaUBAbEACs5wASQIYD wQGWBwAGsHr/B3/vlxAO0AEesIV0WId2yBAT8AHKNxDglwFl IYCgYYD4YfsB4hmuBAgkIZZCBKL KH84/3iHLHg1QAECCfCFZhgC61eIDiACpycBHDACJBB78QcAaCgAJeB67ud6FjACJoB8Yvh/jegR sfiDjwiJ9CcSYoAIiIAQXkgQJ5CJZOh6EuCFGQB7g4h6EFCKp0gBn4cCFCAAKaACK4ACLJCGtniN 2AiDubiLaviFA4GJatgCwWiMAFCMmSh6JaCMZugCKCABpjgB01iNEtiE1DeLMWGP2Wh9uKiLvOiN 8JeAGYB8ZfgAEgCPL3ABCViOwmeKaHh8x9eM7lgC8EiNikiP0YePjpiPVLiP3NiLhxiGY1iGnOh nxiKanh6sCcAJgADp/gAqRiRExkDrKeRNFmT47eNRf8nEhiZETuJEj05ezYZhByZkzxVED9pEUcZ EkkphUHpgUN5EzXSlFI5lZKHk2IxEnvXfDf4hFSJgk pEV9hEPwogltJfktpk0SIkzJRHmrZlW75 ljnRlnE5llrphGYJlxl5NXQ5l9xYl/VYi3gJlCEhlzhBmIF5mIiZQHtZmIsZiRcJmIlphV/Jl0SJ hWU5fmdZk2nZmGtJl2uIjCAhA20oeodHetYYmaiphIbZmX1JiAH5Ef5XEL84EL34EJnZEbeplKkp mYPJmV7XmGQYm5/JehugfMU5nAiQh6g3AwApgAFAA2zoe6Zpm5cpfrmZj5vZl5RJELE5iMaXgBsQ A8r/R4gOmYDt15yfVwPfOYoCQYi7 Z5FuJq/qZ3qB4beBwACYAOKF4bHUQHu2YfDeAA34H3uyYcJ 2RDXqREJKovwyYi4CBQ7ERSiZ5IFUaATgAMjkAIIUKDgp5LgGaDqaaAVCoi2V50m2qA8yZuLx58H KJwGmAMfAJANoAMGCJ4BYAGmFwAEmYfQeRzPWJqVh6JCCoOZ2ZOzKRC1mXsn pdDyoEq6pQ3kX2n WaJ2iZlN6qQ6aYuVeaVc2nhFGnnlsaAYIaYcQaaQCIVnKXh x6R32aUXgaY9IZ8 QRLbqJ1ueqeR l6a Gac1oYt2intmqqB4WhFw hN7Snh1uqVDCJmD/6qP ieniOqnirqRXNmoUBqhhwp3iToQyrmH kwekifcQ3TkQHloQoxeqAhGoKWqpEVGomPqnjbep//h7U0oRUiqqoDeiCXGkSaqqY8qq8Zmpcyqp BTEBOwAB3fmZC8ADJnCjBeB/yvmKUqqsqveKrpd6B4ACBAgBKmkBPfAB0gqktJqqjAqsRviqk8oS soqkCuCp3jl8PhB6hJh4AuB 7PejlUeIxLeeyteM4yl8fviaAcme7umrb2qu1JmlhgqrjLeuIsqd 2/etx/GdA h907p93def4NeMzamQoWp4BXqv5FqpCBuDkKqpxNqe37kQ7befwmcAP/ADQPCG9Vmf AP/4hhubrR0bsACJgARRsOVasoKJrlWZssMHrqzXnRW7ADNwHDGQkMdZo wXgOVIgNV6gDnrjAqp kMrJetKJqgaLlELLEK6qEyc7rMLKeLzqj2FLqGOrjRAKpkaLeadakST7ttL3pFp4eQ6reVDRthQB uEpYtlo6t5sXpkGLtyaIeYmqpo4bt9apuEaptzlhsH3rt4JkuGwquQBAuJB4uYzbp2nLuQhruZrL eaD7fKQ7srrZE6Y7unILu5snuEnouXeYun57uqs7tq/LsIeru/i3u7brlXwLvJkHutA4mrYKqrVa EKMqeq1oqgOAqlRKusNbh7h7vJqbhzN5EbfqEM//u7Wyiaz uLsx2Lvp qqwmgFBAHr p6zM6qzQ Cq7hWnnUyobXygDZuq3dKrFeW5rUmxC0i4TXe4 Ma7wH3JjQqAO5qrLwKq/CR6/2enxSqq/Fd6/J p4bZ q8KKbA K74KMcBHWMBbmL0J/KcVe4C0GbH0S7EfUwEXe6MZGwDfl4Acu7V LED8J8Har4t iL68B7rhO7Uuq4YxO7O0iX5qqMQ3K6I37JoC2LPxF7KTu7oknJdgKqG7J8TuC3pL27QB8LQCEbU OrUTW7Wod7U 8QAW5BIiwB1S7bCS7k TBEmrLbkSxt1bIFtK8JRgcCMZ3gBbBA24cc6eMUu0cfU /9e4j9vIkKu4iLzHSAHIjJu5sivJZMmFQUzJVSm6vluykTy0frnFnKy9l4ynoYzJlFHKJ5y quy6 Fol7d/y7p3ynqawSihx9s5y7teymt/zKu2zKnywQymkBzTsR39t/DUwQpUqqAHzMeJvLm9zLkGfC SboRybwQQ0zFa1uBv yTsVx7wdzKDqGSr5isKBm/xgytO1Ct/4t4OVqA1vp6 tt6/Nusx/HOQbq4 CvvKTMTKxSusHVoCujoB8bq19LrD35l9wTd8F yQ/Qp6GeyaDyDFPUzFnCvNpEzNj7fL7HmSNyqx E0wBfsiiMAyqOcp93pezrbezxoyfCk0QH92mrf8rlJq80cPceSZMniTKhwFQxDD7AxBQoDXLxO2H szYs0Ttb0eX4wQ7MzzXtz4D3yLqMwJ2qwf/3xU4Ltf0qte03sUurxiwNoOXYAW/8tdBsh19606p7 kwDteN28U1X6EWudyZtbfeP8eHHcGK4My/0s1TPIyI482IMXhXU9ym0tfnktzpbc18Qb1Xtr14/p 1hztt6Lr2Jb514Btsm 90Zh915UbzoBKfovt2cGr2aHN1qet2J0ty3TZtcpbEdmszcsMvT0M09T7 zZsdfqXt2q3Zxhox2woRvhj9i9dMx4 N2KvN260tznR5AkJwzg0Mv826zqAXrfpMq/c7z9iqrcj/ 2L9n/cys66B LdmJzdyVrdN0uQEr 7PCZ9AQTKv1utDMa8H8qsEowME829RT/H66vduL3Nyy15az dGf6a0tfK8pTMMxrNIam9RaC8U6zMO47BMafd54LeDq/duFyLI/DQDsbcQyS7NKbLNTi9T4vbNR zN8JCbSojRMXvtwZnt6o 9pvrLQECMZiDOIV8Jkq/NX2GtY1mrUqDtt7bciRO9cBTuO0/NkpYdzl i9yZbd4yvshafIFnu3iCbLeQndpUPtp3i VMHndV7MtLOtkkmOUN6 R5W97KDeY0jYFWGXgoMRRd botI3uZxLuY5bR59J5Z9npp5Po9hboFqjqim8TTmen6pb157gx7C2qjoUCnp442Nj965iRuBh 54 m56Yl37pZS7nlD6fmH3YkvfpmQ6Bnd6wow7qiXzmGG7oox53s27hou3oqf6ote4Sq 6oNv3luF7o FdjrkRrogQvgyN4Yu94SxA7st6jk0E6BzY62pW7rqg3nVtqC0x6nrZ7s3l4SVH244R7tzw7a5C60 /33nPQjrVR7NUv7t8I7Kty57rk7o1vvu59ro9J7rpYvv8f7vTRrj2J7k9/7iyX3q7D7wkOzvAN/w 8Cnwwb7nC2/wU67vDyjsb5vuDr/xXQnx 47xvMvwtHjtEZ/tBW8RAQEAO1BLAQItABQABgAIAAAA IQAmAzrEEQEAAFACAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0A FAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAAAAAAAAAAAAAAAAQgEAAF9yZWxzLy5yZWxzUEsBAi0A FAAGAAgAAAAhAAeZWhlmAwAA0QgAAB8AAAAAAAAAAAAAAAAALAIAAGNsaXBib2FyZC9kcmF3aW5n cy9kcmF3aW5nMS54bWxQSwECLQAUAAYACAAAACEATJsnodIAAACrAQAAKgAAAAAAAAAAAAAAAADP BQAAY2xpcGJvYXJkL2RyYXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzUEsBAi0AFAAGAAgA AAAhAOFRNx/PBgAA5hsAABoAAAAAAAAAAAAAAAAA6QYAAGNsaXBib2FyZC90aGVtZS90aGVtZTEu eG1sUEsBAi0ACgAAAAAAAAAhAAidOf8yFwAAMhcAABoAAAAAAAAAAAAAAAAA8A0AAGNsaXBib2Fy ZC9tZWRpYS9pbWFnZTEuZ2lmUEsFBgAAAAAGAAYArwEAAFolAAAAAA 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]--

图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]--

图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]--

图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]--

图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]--

图8-25 登录系统时序图

4 登录系统具体实现步骤

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

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

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

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

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

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

6 Web Service调用Session Bean BKStoreMgr 的checkUserLogin ()。

7 Session Bean调用Entity Bean CMP UserCMP 。

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 UEsDBBQABgAIAAAAIQDI4TOSFQEAAFICAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbKSSTW7DIBCF 95V6B8S2snG6qKrKdhb9WbZdpAeYwtimxYCApMntO3ZsqY2sbLJBwPDe xgo1/vesB2GqJ2t Cov OEMrndK2rfjH5iW75ywmsAqMs1jxA0a rq vys3BY2SktrHiXUr QYgoO wh5s6jpUrjQg JlqEV HuQ3tChui JOSGcT2pSlwYPX5RM2sDWJPe9p 0jy5bHl7PF4cMiquO4Hg7EgFjUBTTzRgPdGS0h0 O7Gz6oQsm6hyUo5nYqd9vCF0vpwwVP5D/Q2YdG/UzqAVsncI6RV6QhfSaP/pICihAvxQc M8WeXn TReoXdNoicrJbU9dzCfHGft8fKIXQjGOlyePNnOuGH9E/QsAAP//AwBQSwMEFAAGAAgAAAAhAK0w P/HBAAAAMgEAAAsAAABfcmVscy8ucmVsc4SPzQrCMBCE74LvEPZu03oQkaa9iOBV9AHWZNsG2yRk 49/bm4ugIHibZdhvZur2MY3iRpGtdwqqogRBTntjXa/gdNwt1iA4oTM4ekcKnsTQNvNZfaARU37i wQYWmeJYwZBS2EjJeqAJufCBXHY6HydM Yy9DKgv2JNcluVKxk8GNF9MsTcK4t5UII7PkJP/s33X WU1br68TufQjQpqI97wsIzH2lBTo0Yazx2jeFr9FVeTmIJtafi1tXgAAAP//AwBQSwMEFAAGAAgA AAAhACIo4wVpAwAA0QgAAB8AAABjbGlwYm9hcmQvZHJhd2luZ3MvZHJhd2luZzEueG1srFVbbhMx FP1HYg W/8nk0bRp1GkFLa2QCkRtEd OxxmbeuzBdibpChBrYC/sBrENrj2eySRqKWqJNK2f5557 7sNHJ tCoooZK7RK8aDXx4gpqjOh8hR/ujl/NcHIOqIyIrViKb5jFp8cv3xxRKa5ISUXFAGCslOS Yu5cOU0SSzkriO3pkinYW2hTEAdTkyeZIStALmQy7Pf3k4IIhY83UGfEEbQ04glQUtNblp0SVREL kJJOuyuRo6TPRyZTVV2Y8rqcGc cfqhmBoksxaCcIgVIhJO4EY/BNNm5lW8A1gtT PN6sUDrgHLn /wYMtnaIwuJotDcaHowxorA3HIxG /14gvKP99yj/O0jN4FQbRgGHTIxpOcGHPGkvKshyGFl1 O9 1uVfP37 /v4N YWMWWpameda3/aozVRPMZe8gdm5kMwmw/1hIoocPpKzwWDS 1LmHd12bXZ5XUKk LVL6lBOVs9e2ZNRB5vrb4AzEY5dyFP8BTO9mhH9G pWCuqVhkHkwmsIXMw5GrRb/XhfbaKqaCeq1 h X78g12ve3/oH5joDZHvB8Pqb0JgDF6xRnJbBOEbZTET7dcmEtRQhZIr7wfR6k2SfMXoaBKBGVn mi4LplzdRQyTxEH7slyUFiMzZcWcQUGad1nICjK1hl5BloSass4wR7k3vgAScR1ypN0IjDckPX8L 1Y7mq/c6g/omS6ch0E0FPa10wWBT aWx7oLpAvkB0AamAZ5Ul9ZzhqPNEW/VaimyRj9r8vmpNKgi MsXn4RfuWk4yVq9Oxv26W3gf6 MBcwtHKrRK8WRyCEcRJWWK7dca6DFrNcEtsEI4ZpAUBSCC7da6 VJ4/WyzAQ3DNT/QSjl7zbIXmcmmuCIRtHPiiTHgxBh4AmoqA7Bjv1WCIyBzeKich1tp9Fo5fc1JC YPo1464k4Ua9TmTJSS1JAIoNoytJyyYItEXUUqbYKPOcKTRHQ2K0tHFct 1JK1d3MSly7q5EjoyA d9St9MxFL rYAnEEWRv6PTys4b9hVYoP4GGEXyTXwNQB21CwZU1lziomb3zohl4djDhIdtgfN68D 8NFLAwkSEqcrTMyV2DQ753yWBPRQBj7xwbivAfgCjU6z7M69hSajn/KWtQUBg1bP8AwlO49516pv 2d358R8AAAD//wMAUEsDBBQABgAIAAAAIQCUrQ3f1AAAAKwBAAAqAAAAY2xpcGJvYXJkL2RyYXdp bmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzrJC/agMxDIf3Qt/BaK91lyGUEl WEsgakgcQts7n 9PwH2wnN29dtlh4EunQRSEKfPn6b7aefxZVzcTEo6GUHgoOOxgWr4HTcvbyCKJWCoTkGVnDjAtvh Wlz4JlqOyqTS0U0SigKplrTG2LRE3sqMiYObTPG7Km2NltMpD/IMq66bo35NwOGBVPsjYK8NysQ x1tqn/9mx3F0mt jvngO9cELrM2LG5Cy5apAyvvkXnvZXAEfa/T/qeF8i2Ch4dk4wp95L8 J7bcH LjIevgAAAP//AwBQSwMEFAAGAAgAAAAhAOFRNx/PBgAA5hsAABoAAABjbGlwYm9hcmQvdGhlbWUv dGhlbWUxLnhtbOxZzW/cRBS/I/E/jHxvs9/NRt1U2c1uA23aKNkW9Thrz9rTjD3WzGzSvaH2iISE KIgDlbhxQEClVuJS/ppAERSp/wJvZmyvJ uQtI2gguaQtZ9/877fm6/LV 7FDB0QISlPel79Ys1D JPF5QJOw590ajy6sekgqnASY8YT0vDmR3pX199 7jNd8RtMJxyIYRyQmCBglcg33vEipdG1lRfpA xvIiT0kC36ZcxFjBqwhXAoEPQUDMVhq1WmclxjTx1oGj0oyGDP4lSmqCz8SeZkNQgmOQfnM6pT4x 2GC/rhFyLgdMoAPMeh7wDPjhmNxTHmJYKvjQ82rmz1tZv7yC17JBTJ0wtjRuZP6ycdmAYL9hZIpw Ugitj1rdS5sFfwNgahk3HA4Hw3rBzwCw74OlVpcyz9Zotd7PeZZA9nGZ96DWrrVcfIl/c0nnbr/f b3czXSxTA7KPrSX8aq3T2mg4eAOy PYSvtXfGAw6Dt6ALL6zhB9d6nZaLt6AIkaT/SW0DuholHEv IFPOtirhqwBfrWXwBQqyocguLWLKE3VSrsX4LhcjAGggw4omSM1TMsU 5OQAxxNBsRaA1wgufbEk Xy6RtCwkfUFT1fM THHilSAvn33/8tkTdHT/6dH9n44ePDi6/6Nl5IzawklYHvXi28/ fPQx uPJ Ny8eflGNl2X8rz988svPn1cDoXwW5j3/8vFvTx8// rT3797WAHfEHhSho9pTCS6QQ7RLo/BMOMV V3MyEa82YhxhWh6xkYQSJ1hLqeA/VJGDvjHHLIuOo0efuB68LaB9VAGvzu46Cu9FYqZoheRrUewA tzlnfS4qvXBNyyq5eTxLwmrhYlbG7WJ8UCV7gBMnvsNZCn0zT0vH8EFEHDV3GE4UDklCFNLf D4h FdbdodTx6zb1BZd8qtAdivqYVrpkTCdONi0GbdEY4jKvshni7fhm zbqc1Zl9SY5cJFQFZhVKD8m zHHjVTxTOK5iOcYxKzv8OlZRlZJ7c GXcUOpINIhYRwNAyJl1ZibAuwtBf0aho5VGfZtNo9dpFB0 v4rndcx5GbnJ9wcRjtMq7B5NojL2A7kPKYrRDldV8G3uVoh hzjg5MRw36bECffp3eAWDR2VFgmi v8yEjiW0aqcDxzT5u3bMKPRjmwPn146hAT7/ lFFZr2tjXgD5qSqStg61n5Pwh1vugMuAvr299xN PEt2CKT58sTzruW a7nef77lnlTPZ220i94KbVevG yi2CyR4xNXyFPK2J6aM3JdmkWyhHkiGAFR jzM7QVLsmNIIHrO 7uBCgc0YJLj6iKpoL8IpLLDrnmYSyox1KFHKJWzsDLmSt8bDIl3ZbWFbbxhs P5BYbfPAkpuanO8LCjZmtgnN5jMX1NQMziqseSljCma/jrC6VurM0upGNdPqHGmFyRDDZdOAWHgT FiAIli3g5Q7sxbVo2JhgRgLtdzv35mExUTjPEMkIBySLkbZ7OUZ1E6Q8V8xJAORORYz0Ju8Ur5Wk dTXbN5B2liCVxbVOEJdH702ilGfwIkq6bo VI0vKxckSdNjzuu1G20M TnveFPa08BinEHWp13yY hXAa5Cth0/7UYjZVvohmNzfMLYI6HFNYvy8Z7PSBVEi1iWVkU8N8ylKAJVqS1b/RBreelwE2019D i YqJMO/pgX40Q0tmU6Jr8rBLlG07 xr1kr5TBGxFwWHaMJmYhdD HWqgj0BlXA0YTqCfoFzNO1t 88ltzlnRlU vDM7SMUsjnLVbXaJ5JVu4qeNCB/NWUg9sq9TdGPfqppiSPydTymn8PzNFzydwUtAM dAR8OJQVGOl67XlcqIhDF0oj6o8ELBxM74BsgbNY AxJBSfI5leQA/1ra87yMGUNGz61S0MkKMxH KhKE7EBbMtl3CrN6NndZlixjZDKqpK5MrdoTckDYWPfAjp7bPRRBqptukrUBgzuef 57VkGTUC9y yvXm9JBi7rU18E vfGwxg1FuHzYLmtz/hYoVs6odb4bnc2/ZEP1hscxq5VUBwkpTQTcr 9dU4RWn WtuxlixutHPlIIrLFgOxWBClcN6D9D Y/6jwmb1t0BPqmO9Cb0Vw0aCZQdpAVl wCw kG6QlTmDh ZIk2mTQr69ps6aS9lk/W57zSLeQec7bW7CzxfkVnF4szV5xTi fp7MzDjq8t7URXQ2SPlyiQpvlG xgSm6tZpG6doEtZ7Htz8QKDvwRPcHXlAa2haQ9PgCS6EYLFkb3F6XvaQU C7pRSYZk5p5phWTmnl lHZOgcVZdl SUzrQqfQVB1yx6R8P5bcZsILLbj/ypupcza3/BQAA//8DAFBLAwQKAAAAAAAAACEA JXlyuCJHAAAiRwAAGwAAAGNsaXBib2FyZC9tZWRpYS9pbWFnZTEuanBlZ//Y/ AAEEpGSUYAAQEB AGAAYAAA/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3 KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgA4AFfAwEiAAIRAQMRAf/EAB8AAAEF AQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFB BhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RV VldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC w8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5 v/EAB8BAAMBAQEBAQEBAQEAAAAA AAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC kaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdo aWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT 1NXW19jZ2uLj5OXm5 jp6vLz9PX29/j5 v/aAAwDAQACEQMRAD8A67w3oXhCHwV4emvvDujSTTaT DO8kljEXdvLTJJK8klicmtVND8FNDBL/AMIpo4WVWOTpkeFK9s7PXipvClgt78P/AA3ulkQjR7dB tPHMSHJHfoK0zoQNmLcXbqASVwgwAcZ4zz07mpAzR4a8GNZR3K FtFdZBkKmnQk5xkj7vYA/lT4P C3g2fy9vhXRh5mdu7TYQcjkgjbwcc1svYu9gkDXGZI1KpLsxgbSvI hNJZ2DW6x bIrtGWIKjGSR gk OPSkBzN74U8G2Vt58/h7SAzTugUWEXCgkcAL9B NRaZ4a8Hahdxwt4V01EnUvbzLZQlZMDLD 7vBFWvE lz6lao1pcRNLDO2bZpFXPzk5OSPyyKZ4csrix1DT/Ogjt4IBM0jmeLbucDAAVie1dnLT 9le pzJ1HU1Xul638CeB7qCOe30TR5IpCQjraQkMeeny x/KpV HXg5hlfD lEAkcWUPX/vmqlr4 eMJjaXV7NzDeC9iQMwQSFpN38fQrIOOmV6ckU2bRpYdUs0sr JLQXdxcyTLcsGQSFXwV3Yc7sgcY APTNc p0aFmfwF4JtVRptB0pA7rGmbGL5mJwAPkqEeDPAJlMX9kaKHDOm02kIJKAFsZXnGRnHStq ZIpb21lNzZeTbGWVYg4AaVj8pP0BbPXls44rPbSU8nTguoaeZLeOf7Q8qh/OklQgtjcONxyQeo44 o1DQzovDXw3nnggisNBeW4/1SC2g3P16Db7H8jVqTwP4FivI7OTRtGW5kGUiNpDuYew21dsbEQSW k8 o2TTwGV5Ch4mdlADtlicgZH0OBgUXmnpc6xFfrqdooHlO6HnLxh9uDnofMOe/Ao1DQpN4H8Cp erZNo2jC6ddyxG0h3EfTbUn/AAgHgn7T9m/sPSPP2eZ5X2SHdtzjdjbnGeM1ZuNOSXXF1FNTtAMp KUPP7xEdF5z935yT34q1LFE ujUBeWXl/Y2tyjcsSWDZJz93jpjvRqGhgTeFfh3bXclpNp2hR3ES b3ia1gDKuAckbfQj8x60o8KfDs7j/Z2g4SLzmJt4MLH/AHidvSta/wBPhu51nj1G0jeOKIRpwUV0 kWTPXodig98AelY48LKtncW41iyZZUnYbkziWZAjZ blRjIHX3o1DQuHwF4JF0lr/YOlee6GRUFj FnaCAT9zpkiifwD4JtQhn0PSIxI6xoXs4RuZjgAfL1JqW/0xtQgvidahtbuVYo7eeCTmFV5PfuxY 4 mc4FVLzw/JcGdf EhSSF4YEWKaUlQ0bo2eGB52HnOcueelGoaCW/g74f3d7LZW l6HLdRZ8yFL aAumDg5G3IwTipx4B8Em7Nr/AGHpH2gIJDF9jh3bScZxt6ZBFZtr4Mhs7y/vItdgNzdoVaQ/KzZd XbcVYHnbzjHWrV54dkub2a5HiCEu0AjSR5GD5wBztcDb944AHJz2o1DQmtvAnge8837NomkS TIY pNlnCdjjqp Xg8imHwV4DW FkdG0cXJIAjNnDknBbA TrhScegzTX0fUZ9NvLd/EVpDPPNFMJrbK klEVCGJYnnYDx39RVi90Zb22UnVbaK8N8bpplckgbWRApBHKqwxngkcg5NGoaCW3gLwTeQCe20PS JYiSA6WcJGQSCPu9iCPwqRfh14ObO3w/pRwcHFlDwf8Avms8eHLlXnceILYvLefaVy7hU dmKbQ4 BXDDjrnJz0xeOirG0q2utRQRPfteYWQ7iX5bPzdj07eoNGoaD/8AhXHhD/oXdL/8Aof/AIioofAX gq4aZYdB0pzC/lyYsYvlbAOPue4pkehyw2GnRx IQs9vc fORcMVnGeFyzMQAuF9Kkl0djBYPBrF vFdxSeZct5jbJmMiyMcKw5yu0ZyNrEYo1DQk/wCFceEP hd0v/wCh/8AiKgPgXwOL4WR0TRxdNGZ RD9jh3FM43Y29M8VEmg3CQ2yDxFGFhnlcxiZiJFYAAMxcsSMEdRwx781Na6Vc2D2DW s2MhitfIu XuWeRpWLKXYEyZGdv4Zo1DQkj Hng2WNXTw/pTKwyCLKHn/xylX4deDnUMvh/SipGQRZQkEf9802 DSpEk0Zptagk xQtDcZlf98CMA439fc5NX9OtksPD6aQmp26LFbfZ4p42 dcAhW5J5AwfrntRqGh nW/gHwTdw bb6FpEse5l3JZwkZBII 72II/Cpf8AhXHhD/oXdL/8Aof/AImmaLpD6Zc20kmt27RQ mUmGN22neztj5nOeXGScn5FwRznpfttp/wA/UP8A38FGoaHO/wDCuPCH/Qu6X/4BQ/8AxNH/AArj wh/0Lul/ AUP/wATXRfbbT/n6h/7 Cj7baf8/UP/AH8FGoaHO/8ACuPCH/Qu6X/4BQ//ABNH/CuP CH/Qu6X/AOAUP/xNdF9ttP8An6h/7 Cj7baf8/UP/fwUahoc7/wrjwh/0Lul/wDgFD/8TR/wrjwh /wBC7pf/AIBQ/wDxNdF9ttP fqH/AL Cj7baf8/UP/fwUahoc7/wrjwh/wBC7pf/AIBQ/wDxNH/C uPCH/Qu6X/4BQ/8AxNdF9ttP fqH/v4KPttp/wA/UP8A38FGoaHO/wDCuPCH/Qu6X/4BQ/8AxNH/ AArjwh/0Lul/ AUP/wATXRfbbT/n6h/7 Cj7baf8/UP/AH8FGoaHO/8ACuPCH/Qu6X/4BQ//ABNc V8W/BXhzSPhhrF9YaNYW91F5OyWK1jRlzNGDghQRwSK9X 22n/P1D/38FcD8arq3k EmuIk8TMfI wFcEn9/HRqGhc8F6Ldy BPD0i6vNGr6ZbMEEKEKDEvHIrd/sG8/6DU//AH4j/wAKzfC2r2WlfDvw qbyQoJNKtguFJziJM9K0v Ev0X/n6b/v03 FVGlOSukxOUVo2H9g3n/Qan/78R/4Uf2Def8AQan/ AO/Ef FH/CXaKf8Al6b/AL9N/hSjxbox/wCXlv8Av03 FP2NT Vhzx7jD4euScnV5Sfe3j/wo/4R 25/6C8n/AIDx/wCFSf8ACV6P/wA/Lf8Afpv8KUeKtIPS5b/v23 FHsqnZj5l3Iv Eduf gvJ/wCA 8f8AhR/wjtz/ANBeT/wHj/wqceJtKPS4b/v23 FOHiLTD0nb/v23 FLkn2YXRW/4R25/6C8n/gPH /hR/wjtz/wBBeT/wHj/wq1/wkOm/892/74P FIfEmljrO3/ftv8ACmqVR7Ji549yt/wjtz/0F5P/ AAHj/wAKP Eduf8AoLyf A8f FT/APCTaV/z8N/37b/Cl/4SXSv fhv /bf4U/Y1f5WHPHuV/wDh Hbn/AKC8n/gPH/hR/wAI7c/9BeT/AMB4/wDCp/8AhJtK/wCfhv8Av23 FH/CTaV/z8N/37b/AAo9 jV/lYc8e5B/wjtz/ANBeT/wHj/wo/wCEduf gvJ/4Dx/4VP/AMJNpP8Az8N/37b/AAo/4SbSv fh v /bf4Uexq/ysOePcg/4R25/6C8n/gPH/hR/wjtz/wBBeT/wHj/wqf8A4SfSf fhv /bf4Uf8JNp X/Pw3/ftv8KPY1f5WHPHuQf8I7c/9BeT/wAB4/8ACj/hHbn/AKC8n/gPH/hU3/CT6T/z8N/37b/C j/hJ9J/5 G/79t/hR7Gr/Kw549yH/hHbn/oLyf8AgPH/AIUf8I7c/wDQXk/8B4/8Km/4SnSP flv /bf4Un/AAlOkf8APy3/AH7b/Cj2NX Vhzx7kX/CO3P/AEF5P/AeP/Cj/hHbn/oLyf8AgPH/AIVL /wAJVpH/AD8t/wB 2/wo/wCEq0f/AJ W/wC/bf4Uexq/ysOePci/4R25/wCgvJ/4Dx/4Uf8ACO3P /QXk/wDAeP8AwqT/AISvR/8An5b/AL9t/hR/wlej/wDPy3/fpv8ACj2NX Vhzx7kf/CO3P8A0F5P /AeP/Cj/AIR25/6C8n/gPH/hUn/CV6P/AM/Lf9 m/wAKP Er0f8A5 W/79N/hR7Gr/Kw549yP/hH bn/oLyf A8f FH/CO3P/AEF5P/AeP/CpP Er0f8A5 W/79N/hR/wlej/APPy3/fpv8KPY1f5WHPH uR/8I7c/9BeT/wAB4/8ACj/hHbn/AKC8n/gPH/hUn/CV6P8A8/Lf9 m/wo/4SzR/ flv /Tf4Uex q/ysOePcj/4R25/6C8n/AIDx/wCFH/CO3P8A0F5P/AeP/Cn/APCWaN/z8t/36b/Cj/hLdG/5 W/7 9N/hR7Gr/Kw549xn/CO3P/QXk/8AAeP/AAo/4R25/wCgvJ/4Dx/4U/8A4S3Rv flv /Tf4Uf8Jdo 3/Py3/fpv8KPY1P5WHPHuM/4R25/6C8n/gPH/hR/wjtz/wBBeT/wHj/wp3/CXaN/z8t/36b/AAo/ 4S7Rf fl/wDv03 FHsav8rDnj3G/8I7c/wDQXk/8B4/8KP8AhHbn/oLyf A8f FO/wCEu0X/AJ X /wC/Tf4Uf8Jdo3/Py3/fpv8ACj2NX Vhzx7jf Eduf8AoLyf A8f FH/AAjtz/0F5P8AwHj/AMKd /wAJdov/AD8t/wB m/wo/wCEu0X/AJ W/wC/Tf4Uexq/ysOePcb/AMI7c/8AQXk/8B4/8K4f4v6N PafCzWZ31F5lXyMoYUXOZ4x1AzXdf8Jdov8Az9N/36b/AArlvjHcxXnwY1m4gbdFILdlOMZH2iOp lCcfiTQ1JPYqOP8Ai23gv/sGQf8AolKyQK12Gfhv4L/7BsH/AKJSsrFerhP4KOSt8bHQxGaZIxxu OM4zj34q4mmyNMyedCANuGySGz06Dj8aZZLGrmaS6EDIQVAUkt WK3LZBmeZ2YM8LOkioVYAdcZO ep714 a5nVw0mqba0SXuve62bVno9bX 80o0lJamRc6dJaxiRpYnXeYzsJOGHbpTIYjI4UFQT0yc VrXMKjEDXwt4dnyxmI7WHUkHOCfeoNPUqku23MrtjYSmQBnnr0qKOaVJYN1G7y72cVZvRttJaLe1 1obeySkJHYt85aSJAhwST0Pp0qWe3 zSeWWDNgE47VrxqJd/ qMhbL4UNjHTOByazbm6EkMivHtc uCp24OO9cmW5lisXiWmvdWjXa z2u1o uzT9SuoxiVQkkpIjjZyP7ozUp02YW6zM6oGGSrggj9KW 1dorO7lZTsKADPAZs9KtFmWydWAaSKIMQowQG oNdOMzDFwrqnQaUVNR73Vo31eitKSXr8zClTi4 80uxjujoxV1KsOxGKmWyleCOYPEFfON0gHT602aSW6xIUJEcYUt2wO5NaEaGKxtfPTEQDtKGH8J6 D6ntXdj8wrUadLla527Nb/ZbstVreyXqu4oQUm xR wTZxvgz1x5q1FcQSWs7RSY3D0PBrTlmVo5 QZFSW4BMW5cFVOPlb0zjAqvqsbyaqyorMzKpCgZPSubL80r1cRyYhpR5ZPZrZx1u mrXyLqU4qN4 lWztmvLlYFYKWBOTUJwGIyODitXSLW4i1GNpIJEUKeWXA6UyZtSmRo3tm2k/ww4/WtVmv 3TpRlB 00o6uSVr817aO y0uvxJ9l7l3e/oZ2Ksw2E0glLBozHHvwyn5h7U1EjhdhdxzBgMqo4P15rTs7uK aK5XFwdsLEl5ckj29DTzTMcRSgpYaF1ePvaW1a2u9b3t6vyHSpxbtJmW1m4s1ud6jJIKNwf161FB BJcTCKLl26AnFa8UkWomG2ktrkRx5bcz5A pIqvp0YTUXuE3fZYNx3t6Y4rnhm1eOHre1VqsbtJ2 a1bUI3i9Xpto/XcbpLmVtn/TII9Ldy4lnhjKrkDeDz6H0pDo94I2fZHtUZJ8wcVbgW30yXzZ7gH7 RESEEZPB9aq3UCrZLcwvF5Tvt2pGU/meazo5hiqmIUY1Pck1yt05Wel2k7q2z3b8uw3Tgo6rVeZn UUGivpzlE70Ud6XFMBpop2KTFACYop2KTFAhMUmKXFBpDG0YpcUmKAExSFc07FGKAGbaTbUmKMUA M20bafRQA3bSbafRQAzGDWj8S/8AkgF9/wBcrb/0ojqj1q98TP8AkgN//wBcrb/0ojrix3wL1NqH xMk/5pv4L/7BkH/olKywK1P ab C/wDsGwf iUrMFXhf4KJq/Gx8TNG4dCAw6HGcVZiu7iN5X3lm lTYxfk4qstSqKdWlTn8cU/8AgO/5lwutiaN5fJ8kuTH12nkD6elWoJJYwArttHIUnK/l0qCNasrw K55UKUk4uKs9duvc0lNxRI88rAZcgDoF4A/AUkmoXDwNE7hgeCSOcemaiY8VAxyauGXYaTi5U4 7 qtFp6HL7WbbsyQXlypjxMx8v7oPIFNW6njmMyysJD1bPX60zHrTTXT9Tw1mvZxs1Z6LVb29L6j55 dyxPqd1PEsTMoUHPyrjJ7VWmnlnbdLIzt0yTTTSEVFDBYbDpKjTUbX2S67g5yluxDzyeasNe3DXH 2jzSJcbdwGOKr4oxWk6FKo7zinpbVX0drr0dl9wk2tiR55pCC8sjY6ZY8VNFqN3E2VuHPsxyP1qr S4qKmDw9WPJUpxa7NJoanJO6ZJLK80jSSMWdjkk0sNxJAJQhH7xCjZHaoaTNaSo05Q9m0uXTTppt 9wuZ3uSm5nMXlGaQx9Nu44pnmyCIxb28snOzPGfpTc0UlRpx0UVvfbr39fMOZ9y1/ad4I0QTbVQY GFHSo5764uY0jmk3KhyOAOagzQBWNPAYSnJThSimtmkk/vsU5yas2NNFOCk08JXUQMApcU/YRRtP pQAzFJnmpNtGwUAREikzUpjB7U3yqAGkUmKd5ZFAU0BYbik21Lto20ARbaMVJto20BYjK0wg1Pim smRQIr0ZoYbTSUDHA04HNR8GgHFAE2KufEz/AJIFf/8AXK2/9KI6pK3FXfibz8Ar/wD65W3/AKUR 1xY74F6m1D4h/wDzTfwX/wBgyD/0SlZgrSY4 G3gv/sGQf8AolKzBVYZ/ukOavMlWrEdQRirSCnO RaVkTIMVIWFR5wKjZ6Kcbs5qs7uw9nFRFhTWbNJuGK7UrIlaDt1ITTM0maTAsQWs9yX8iMvsUs2O wFPk0 6jg85owEC7jyMgZxkj61Ppl1b21tetOQXePy41UfOSfQ9hWtrj3I0G1BAGVHn4zkdxnPTn 2rmnVkpqPRs1jFNXMTT9Pl1GSRYsgIhYuR8oI7E9s1Hd2U9msZl2fvM42tnBHUH35Fa2jXdwulXE KtlWYLEpx16njqeBTddIliR2lUOjMcckSZP8LY5wAMil7WfteV7ByrluZENtNLbyTom6OMgMc9z0 qW7tDayrGXDEoG47Z7Vt6Re6fFpGHdBOitvVu4zwQD169uar61Jtj c5aWYvFuKkrGFA4x2J6fSh VpOpy20DlXLcy7WxlvZ/JiK7yCefamT2ctuE3lSWB4VslT6EdjXQeHLmO3JzKpknJVIlUFsgZyT2 FZmoxrDOpMheZ13zKWDFG9CR1NUqrdRx6C5Fy3ILfSbi4tWuSRHEGCgt/Ec84 nvUN/ZSWN00LlW xyCpByPX2rrNLhhi0mIM6rJNIASCTuHXA9Kx9Y8j7YBGm3Cr3yGGODnrmop1nKq49CnBKNynpWkS amZNr Wq8BthPzHoDjoPeqIQgkHqDiuw0aOC2tCEkDvIDISRwuOAQOvr Vc5MsQuHEQygbjryPxq qdVynJdBOFopgmmXTWaXcaho3YqACN2R7d6JrOa1EZmUASLuUhgQR Fb m3UdxEIoYPLSDa 1Mgk 5/HI479c1k6k0suoTeY2/YxRTgDAB4HFTCrOU3FlcqSuh9no095HFKDtjkk2c9cYyWHqKypt8Urp wwViMjoa7HS53isIo3jAaNSwxy2OpPoCQa557Zre9RpUG3eJMZByuc0qdVuTTCUNLkUOn3Ek8UUi iPzY/MVjyMds lVVbcP612M8ttJF5NiwaV0byijDcD9T Pv1rBuTCurs5RJI48KQOFYgAEnHXn86 KVaUm7oUoJIjk0q5S3gl2qRKM7c4K/X0GOc1WmtpIJNjgZIBGDkEHvmupnmiF1BN8kj SWLbQAQc DJHbJ45rLvoUk12OOYSpE6phVUbhx lFOtJv3hyglsULvTprIRedw0gJC45H NVvLyK66S6iluVm UiSNIiA6LvCnPBIHOePaubk3GVy45JJPy4z FVSqykveQShbYqFMUjYUZYgD1PFSyyMjAJbvICOq sox ZFUdTmkawlUwrAGXHmTspVfoASSfQU51FFN2FykvmRggeYmWOANw5PpQWXeE3DewyFzyRXPW tvPa6lpsUymNThkjJGVwsnBx1IG0E0l4pk1ASM 2jDRyzDftQtjj73TgZxwMisI4luPNy63/wAg aOhyB3prSRrjcQMnAz3PpVC5a7e0Q2MsPm5HzuCVI9qq6urytZRgLuedAMuRn6Adfr2ronV5Ytpb WM0avmQmRkypdfvLnkfWhfKlUMmGUjIIOQawLPC2rQtJ80gl/dQx5cgPg/N174 lTae8n2nlXEUU pjUQyFlBCA7TnsOefUc1lHE35brcdjWzAQ5WVCEGWww X6 nQ/lTTswrB1KuQFOeG nrXIsksMrz LCQrl5U3KCpUF o6EZIq5q6vHfwrtJwR/Bgk4OCAD0/KsFjnyuTjt pTidDtPY5rR Jf/JAL7P8A zytv/SiOsrSYiLGNSmzvjbgfhzz9a1/ieMfATUB/0ytv/SiOqxcualFl0VaTBv8Akm/gr/sGQf8A olKzVXNdz4R06z1D4d Fxd26TBNKtiu7tmJa1h4d0gdNPh/KsaeJUIKNjVwvK551HGasouBXfDQd LHSxi/Kl/sPTP fKL8qPrC7BKDa0PPmaoSa9GOg6UetjF RpP7A0n/nxi/I10QxtOPRmH1eV73PO M00tXpP/AAj k/8APhD VJ/wj2kf8 EP5GreYQfRh9Xl3PNc0Zr0r/hHtI/58Ifyo/4R7SP fCH8 qn6/Dsx wl3PNc0FizZYkn1Nelf8I9pH/PhD VH/AAj2kf8APhD VH16HZh7CXc83DkAAMRg5GD3 9almvLi4ULPPLKq9A7k4r0P/AIR7SP8Anwh/Kj/hHtI/58Ifyo u0 zD2Eu55vuo3fXjivSP Ee0 j/nwh/I0f8I9pH/PhD Rp/X4dmHsJdzzuGd4JVkiba69D lMDYxjgV6R/wAI/pP/AD4RfkaP Ef0 n/nwh/Kj69T7MPYS7nDR3k6RoizkKh3L/snGOKS4uvtMxkkILYA4GOgruv8AhH9J/wCfGL8qP Ef 0n/nxi/I1P1yle/KV7KXc4P7STL5hkfzB/Hnn86mm1O4uYxHNKZEBz8wGc/XrXbf2BpP/PjF VH9 gaV/z4xfkaPrlL UPZT7nAmcxMDExVuuQcU9bws5eU5LHJPrXd/2BpP/AD4xfkaP Ef0n/nwh/Kh 42m jD2Uu5x/9rsnzIxLHGSeen1qlLeGaUyN95jk44rvf Ef0n/nwh/Kj/hHtJH/AC4Q/kalYukt ojdOb6nn3mZOQTn605cV3/8Awj k/wDPjF Rpf7B0r/nxi/Kq uw7MXsZdzgS5PGSR069qe00rYZ 5HLbdud3O30rvBoWljpZRflQdC0snJsos/Q0vrkOw/ZM4KG4eCQSRO0bjoynBqWe kuZN88rSP0y 1dv/AGDpX/PjF VJ/YGlf8 MX5Gl9bpt3sHspdzhfOX2NIXjbG5AcHIyM4Nd5/YGlf8APjF Ro/s DSv fGL8jR9cp9mHs5HC/KSMjn1IpoijX5QqhcfdxxXff2JpnH hxcDHSkOh6Yc/6FFz7VLxi7D9 mzgvs8Z9B9KkW3jGOBkdPau5/sPTMY xRYpf7E0z/nzip/XI9gVI4JoI95YBNx6sAMmgWwIwFGO4 Heu7/sDSs5 wxfkacNF01TxZxj86PrcOwezOENuAOUXGNuMdvSoJI1OMqCQcjI6V6IdI089bSP8A KmnRNMPWyi/KksXHsN0zznO0dKl J/PwE1D/AK5W3/pRHXf/ANhaX/z4xflXG/GeGO3 DetRRIEj QW4VR0A 0R1lXrxqRSQ4QcWaXh3WbbRPhf4curg5A0m2IXOMgRJnk8Dj1IrZl8S6eml3Gop50ltb NiVvLKbRjOfn25HuM1yVvZalqvwm0DTLK1aRLjRIEaVZ9mwmFRyMjcOeh4rQnttcu9AvtKuNId45 1Cxk3W8gY53Mzk9QCAMDH51nGEXFNnZCEHFN7 vQ1dK8W2mryzCK1uYYoY1aR5gqlGY8KUzuBIGe R61Jqnie00p7kSruWCJZGbzFHXPByePlBOTxwRkGsHQvDt/pUl7EILmWO7RCZZ/LVg6sxI VyNvz HHGeeelN8VeHtV1S v8A7PBLNFcWItY3MwUQE53lQGGQcrkHrtpqNNzt0HyU/a2v7pt6v400jRrG K7meaWKUuF8qPJ VdxODjjAp2geLbHxDDLNbxTwxpKsaGYD5yyK4IAJxww61ymveGdZ8RaVBbXWn XPBHKqS5WUsWyBlnk3YCknr1x0HFafhPw1c6HFJb/ZHSP7SkiyP5YJRY0Tnax5 Ut6fNTlCmqd0 9RzhSVJtP3i1rXj w0W/uLN7G8mktyvmsgTaA33Tndk84HTI6mrOveMbXQ4xIYftC UZGVJVDrgZ 2lTzkjpXOa94a1rUdelu7aw8mAsg2RyKofbIWLYyOXHBz2qTXfDmq65dadMLW609LRlPl2floVAB 63mckE8cDAz61ShS0v89S1To 7d up29lqlrfwwSQSq3nIHABzj1BI4yK5aT4j2cd81sbJztlaP Pnpu4nEP3c5zuOcf3ea1NGttTigt2u7RI5YImjCphVbH3cDcx9M5PXNchL4M1J5kmFrdeY3zzZkQ LvNys7bV8zG3gqAfYnmppxp3fMZ0oUuZqex2N94u0 wvri3kjuXjtA32ueOFmS3IQON3rlTnjNVd e8d6d4fW2a5trp0uGURtGEO5Tj5sbs4GR1ApllppS81G81Dw/JdXF7ceacpAwjUKEVQWfPRQT7k4 rJ8R HtQ1zVFu49HaDZA1uDviDMhx156jHHNEYU ZJ7epUIUuZKW3qbuo M7LTILeaaFis4XYomi Lnc4UfKGORglsjIwD3rS07X9N1UuLSdnZHEbAxsuGKhh1HoQc 9cdeeEpNR03SLObTry2TT4GhK2 4gbzBlCCSXGDmME8c5NaHhHw5daLujaGVI/OVl8wpkKsaoPuk5PyZPA68UpRpqOj1JqQpKm2nr/w Rtv8UNCvNWi021ivJZ3D4VYwTuU4C4BzkkHrjA5OBW5f JbWw1FbEQXVxMoVpxDEW8hGDbWb1GVI 4ya87Pw3vYNZj1CztpIG 0yTSBVUjaT8qD98Ny4HOcZyfYDr7TTJBqt3f3 gyXDSxRQRR7ISsaRg 4PzSE5JY/gB161c4UlrFmlSnQWsH0F1H4h6ZYvbiG0vr1Li0F1E9vDkMrfdHOCM4PPbFLJ8Q9Jh0 yO/ktr5YnkeIqY13o6rvIZd2R8oz/wDrFVPFGj3 t/2YLPSpreOzL5jcxBWVl2gDa/GKrXfh2/1D RtIs7zSt8mnrtwscQWQbSgXLOxC7T6E5ANCjSsr/AJijCjZX/M3/AA/4y0/xGLt7aK4ijt5xb75l A3vjJAAJIx71nal8RLXT9cudK/s65llgbYWQghm2q2ABk87uPofSovCfh6 0e0e0lsfK3XRuWlLo d WPBwc5AwPfHbpVDVPB15deItR1EWrv585dMxI6svlhMHMqkDI3cDsM9OFGNLnae3QUY0fayT26 HTT L7WDTdKvTZ3rpqPkbBHCW2eb0yRwSPQc1ny/EXT4bHTrptO1Jkvkd1VIckKv8XXkHIxj1GcV SuPDUtxoujWjaTc/abA23mzEx4kWIAEAeZ3xxmobvwvfHw3a6XaWd0JIb4XbM4iWPoQURRIdi8jA 5HFNQpdSowode/c1oviFpj6YbySzv4tkqQyRPGodGb7vBbkH16VNoHjvS/EV1dxWkN1GlrHG7yzI FGXzgYBJ6DNYreHdRuPDNrpNzph/0W4M0ZSOJhgNuVctIcZP3jg5HaneGfDF9pD6kh03yheSrIJP MQ7FUAKhwecc/n0FKUaXK2t/UUoUeSTW/TU09b8e2uia6dKexnlkCo29CMfMDjjk9sdOpFTt40tU 8Mw621he XKceUsW5lPmeXgkcDn1NY2v E7rUfFU pC2eRNsAT92jg7M7gQZV4bOOmev4xt4WuJf BsWjy6VO15GQBcAxhQPO8zAHmZ6Einy0rR VwUKDjHvpf9ToB4xtBpdzqL2N8ltbzSQuzIq8o23I DEE5ORgc5BGKi0vxzYatog1WGCSKEFQwnlijIJPI5bqBzzjI6Vh3fha6k0i7sIdLncXVyLhmcxRi EqwK WodgCcfMeMkk96ZaeFb2PR9WsJtMlRtQZXNxH5LshG0AYLDj5emepNHJStuHs6Nt v4HSaT 410jVkgCPJFLOrskboTkLyTuGR0weveoNe IGieHr42V403nmJZVCqMMGDY5J/2cdOMisLSvBU m a0lzbW955W2QsbjyQS7DH8LcDGfU59Km8TeDG1jxDa6g1jJIIbZIW8pgpfJO75i4wQD8uAQSTnik o0vaWvoLkoe0tf3bGnqHxF0fTrSCWWO5815VikhMe1oSVViWz2AdeRkHIxRY/Ejw/qGj3OoW8k7/ AGWES3MIgctFkE4JxjsRnOK5yXwPfzaJLaMmoi6lu0nMgaLaEXYAufM3cKgwMgA49BV7RPCcmkm7 U6fehJlWPbAsA3qrM26QO7AsWc8DgALiqcKPLvqW6eH5d9fU6zRPEVnr1vHLax3C7lJYPCwCMDhl LYxkHI49K165Hwjokuh5jktbtWeSZjIwgCBWdmUHad2QCB6Z9q66ueooqXu7HLVUVJqOwUUUVBmF FFFABRRRQAUUUUAFcB8bf SQ67/27/8Ao Ou/rgPjb/ySHXf 3f/ANHx0Ab/AIE/5J74a/7BVr/6 KWugrk/Cml22p/DvwsLnzMR6VbFdkhTrCnpWmPC mjoLj/wIf/GrSjbVi1NmiskeHNPHTz/ /wC3 NL/AMI9Yek//f5v8aLR7g79DVorJPhzTz/z3/7/ALf40n/CNad/08f9/wB/8aaVPq393/BJvLsa 9FZH/CNad/08f9/3/wAaT/hGdO/6eP8AwIf/ABp8tP8Amf3f8Ed5djYorG/4RjTf nj/AMCH/wAa P EY03/p4/8AAh/8aOWn3f3f8ELy7GzRWN/wjGm/9PH/AIEP/jR/wjGm/wDTx/4EP/jRy0 7 7/g heXY2aKxv EY03/p4/8AAh/8aP8AhGNN/wCnj/wIf/Gjlp9393/BC8uxs0Vj/wDCM6d/08f BD/4 0f8ACM6d6XH/AIEP/jRy0 7 7/gheXY2KKx/ EZ04f8APx/4EP8A40v/AAjWnf8ATx/3/f8Axo5a f8z 7/gheXY16KyP Ea07/p4/wC/7/40f8I1p3/Tx/3/AH/xpctPu/u/4IXl2Neisj/hG9O/6eP /wC/ NH/AAjen/8ATx/3/b/Gny0 7 7/AIIXl2Neisg G9PP/Px/3/b/ABpP Ea07/p4/wDAh/8A Gjlp9393/BC8uxsUVj/8I1p3/Tx/3/f/ABo/4RrTv nj/v8Av/jStT7v7v8AgheXY2KKyP8AhGtO 9Lj/AL/v/jS/8I5p/wD03/7/ALf40Wp9393/AAQvLsa1FZQ8PWA7T/8Af9v8aD4esD/z3/7/ALf4 0Wp9/wAP CF32NWisn/hHNP9J/8Av 3 NH/COaf/ANPH/f8Ab/Gi0O/4f8ELy7GtRWT/AMI3p/8A 08f9/wBv8aP Ec0//p4/7/t/jRan3/D/AIIXl2Naiss6BYntP0x/rm/xo/4R xzn9/0x/rm/xpWh 3/D/AII9TUorMGgWIGP3/wD3 b/Gj wbL/pv/wB/m/xotDv H/BDU06Kyv8AhHrH1uP /wC3 NPG h2Q/57f9/m/xotDv H/BDU0qKzTodkf e3/f1v8AGmnw/YH/AJ7/APf5v8aLQ7/h/wAENTUrgPjb /wAkh13/ALd//R8ddSfDmnntP/3/AG/xrkfjLAlt8GtZhjzsQW4G45P/AB8R96UlHowV pr F9X0 7Rvhv4Wl1G8htY5NMtURpWxuPkg4H4An6A1vabrel6xDJLp1/BdRxEB2ifIXI3DP1BBHsa83utK1 LWvh14HtdMhmMlvpiXMkq7gqr9iaPbkEEsxkACjqM54HObo/hbW28LXukT2N2s97e6Zh3QgKkUUJ lLFycBfLZe4JAAGDipGeuxavps2nJqMd/bNZOMrceauw8465x14qC38RaJdySR22rWMzxMVdI51Z gQNxGAc8DmsOTwlYaHDqN/ZPefa7i2FuDBBGduGLKRHHHjO5jliCcfSuG HHhLVNI8Qs17FqFrFd WZW6ZEdfOuePnLFflGN5BBByfegD1uw1fTtU3/YL63udm3d5UgbG5Qy9PVSD9DV2vA7TwH40gvrS 81G3eZ7i6t5JlMwmkEiyQFnZgPlGEkP3sYIA64r3ygAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArgPjb/wAkh13/ ALd//R8dd/XAfG3/AJJDrv8A27/ j46AN/wJ/wAk98Nf9gq1/wDRS10Fc14KuI4Ph54aMhCr/ZVr ySAP9UvrW3/aNt/z1T/vsf40AWqKqf2ja/8APVP x/jR/aVr/z2j/77H NAFuiqzX0CsFLqCQGA 3joe/WkOoWwODKg/4GP8aALVFVP7Rtf eqf99j/Gj 0rX/ntH/32P8aALdFVP7Stf e0f/fY/wAa cb 3CqxkTa2cHeOcde9AFmiqv9oWw/5ap/32P8aDqFsBkyp/32P8aALVFVP7Stf e0f/AH2P8aP7 Stf e0f/AH2P8aALdFVhf25Qv5ibQQCd4wCfxpv9o2v/AD1T/vsf40AW6Kq/2hbf89U/77H NJ/a Vr/z2j/77H NAFuiqn9pWv8Az2j/AO x/jR/aVr/AM9o/wDvsf40AW6Krfb7coX8xNoIBO8Yz dN /tK1/wCe0f8A32P8aALdFVP7Stf e0f/AH2P8aP7Stf e0f/AH2P8aALdFVP7Stf e0f/fY/xo/t K1/57R/99j/GgC3RVT 0rX/ntH/32P8AGj 0rX/ntH/32P8AGgC3RVT 0rX/AJ7R/wDfY/xo/tK1 /wCe0f8A32P8aALdFVlv7d87ZEOAWOHHAHfrSf2jbf8APVP x/jQBaoqqNRtj0lT/vsf40f2hbH /lon/fY/xoAtUVBFdRzOqoc7gSGBBHGM/wAxU9ABRRRQAUUUUAFFFFABXAfG3/kkOu/9u/8A6Pjr v64D42/8kh13/t3/APR8dAFjRZJofhV4fkt5BHOmj2xjc7flbyOD83HX1rM8P3N9F4l0y3m1e4ki xyrCkjwLmMMmwOh fcQBngHkehrb8MTQ2/w38MzTj5E0u0Y9MDEQ5Oe3WtG31awvrhZLdLeaVsM kgKEtwSMHvwD9MUActo2uyx MplvZr0NLdCAQGZADIyDlotxKqBgDH1PNej1zVp4w0q/vI7O0uYp biVnCRqeSUOG6jsaIPGml3N8llDdxvcvK0Kxg8lx1FAGf4wiluYY7e3iWeUz YYmVWyiwSZYgsow CV5J4JHfFYPh9dR/sB7C2cW11cXlspSPC/IbdGcnazYyOSc555xmvQkZxcyGK3Z3KrvJK8cdKerX CElbLBPcFPb/AAH5UAc3NZ6toPhvUTPfTzxeWAiwkyPDGqncQzsDk8ck8Yp/gLVPtVpNZyTTSXES RyvvuFmSMNkBEYHOBsP3uec w6My3ZBBtSQeo3L/AI0ebd5z9lOfXcv NAFyuX8Yeb/Z0zwv5ciI xWQzmJUPyjc5DKSoz0z6cHFbvnXf/Pq3/fa/41DIzPMoa2Z5WRwyErjb8vX9KAPOLSeabwdqkthJ KlykUf7mK9knZQ0vVRG5x0YDoxwSeDitfw8txa MYY20toPMilLyMSHKsEYFgckgMjDJJOWHvXZR LLBkQ2Cx567Ngz VP826zn7Kc9M7l/xoAuUVU867/wCfVv8Avtf8aPOu/wDn1b/vtf8AGgCvrXnm zf7Nn7RtbycYzv2Ntxn3xXBeHb7VrXxJLBqF7cQrNKYnS7YnMjRRBPkZsn5s9OOvNegTSSHY0sDi QSLsUMvJ5/8Ar0MJHmWZrBGlXhXJQsPxoA810PVvM8UaaDdLIoWO3KuhfbKccoHlyBgEblHHTnGa 9aqkJLnHFpwP9pe340vn3X/Psemfvr/jQBcoqn593jP2Y/8Afa/40efdf8 x9Pvr/jQBU8QTNb6d LOk4geNGdZTj5CEcg88fnXN23jWaztbWOZRfTzJ5jO91ApQkhQv7vIOc5 h9RXU3DNKqia3Yt5gC plSG4PX9aVYWQALpsagdgEFHUZyep/EOPEtvaKsLmJXiuDMjAFkz8ynrg44B5z1Fdnptw11pdpcM wZpYEcsvQkqDkVWaL J9Ni9MkJU6yXSKFW0IUDAAZcD9aegi5RVTzrv/AJ9W/wC 1/xo867/AOfV v 1/wAaQFuiqnnXf/Pq3/fa/wCNHnXf/Pq3/fa/40AW6Kqedd/8 rf99r/jR513/wA rf8Afa/4 0ALqHNnIP9lv5GvPrjXZotR05kvXs4XmnR2MtsjKMvuZlkPyksuSB8uMY5ru7iSRreX7RA6R7GyQ y5PBprwmR98mmRMx7sEJoA8z8TzazNquobb6L7JItyx2XE6oY0hUA8MAMNkccFsg5pvi2wv/APhJ rieO8vPLihhdxBqDBYgFOeNh2cqo5PVwSeePUSZmTabIFAMYJTGKP3xMn gj94Pn5T5h059aAGWU UsL2cU1wbmVLcq85GPMICZb8etaVUoixvYt6FG8t8rxxynpV2gAorL8RzTW3hvUZreVoZkt3KSJj KnHBGeM1LZ3cy3Bsb4AXIBMcgGFnUdx6Ed17fSgC/RRRQAUUUUAFcB8bf SQ67/27/8Ao Ou/rgP jb/ySHXf 3f/ANHx0AWtCgNz8LvDtuvm5l0m1TELhHOYOik8A/Wqml FtT0rWW1DbdEi2SLEVwAO jEYjBC/KcAjhTu9qveHriS1 GHh2aJQzppNqQpGc4hB9D6elV9M8U3l/qcMckAisJoy4uNmWj UN lxjAXnG7OMkDrQBU0fwtrumeIrnWpJS3nynEaQoXVZNrMeXx94HOOnbIpNP8La7a KJtekkJEjqw jWFPMG8Yckb9ueBkdMHjJHMtn47S/wBeh02MpEHuDC0j/MT12kAJxn5epHDexwll46/tHxDDp9qn jSLGTK5i35ckD5QxAwccE7uTxQBuayl9LN5NnHdvG7AT/ZzHjZsPytv5wTxleRyaw7WPxnYabZW kEN0Vh8jLEQE7QiB0xnkAhsHOenJrp576OHUUtHnKTSJmNEg3F9oBY5x7jirnlnBP29MBtp Revp 9aBnE3eo KtP0xBfXc8M0oiIlcWyEPsbeq9iAQpx1PY noMDb7eNvnOUB cYPTuOxqkyLlle/i Q jcCifKe2fSobW6hvI5pIdRUrDI0chaILtZSVOc9sg80CNesPXjeiKQacLj7UUIQ2 zevzJk/P8pw Ocd6umMjdm/QbRub5F4Hqfaqt7dx2LW4nuQqyOI1kWHcWZioUcdASev0oA5iO18VafDex2EF4Enk nkQMYCY2MoKsMnnKliR AxSte LrSznur954lKuvzi3RY Y9mDk4JzIMnI6cevXopdN320L8oZla NQVB9R2oMYyEa/jyy7gpROR6/SjZDuR HZ5rnQLSW4mkmmZTvkcKCxyf7vBHoR1HNalZEFxBPezW cOoKZoVRmXygBhgSMHoeB2qwsZfZtv0bfnbhFO7HXHrQLYZrKzvalLVgtw3ETE4w21sfrXGxeH9e jW3 zxTJ5Ucgt/NaLMe7duMmP WpyuHXPv3z19xIILbzTdRtFuy0uxSEUAknj6Vmr4j05hGTqEqB 0ZzvtCNgXOd3HB VsZ64osMz5NI1k FU01bZ1tQ SkckYuWj3EhWGPLJ6bueec9apXHh/XpRd bF Kxl2CbyTFhwB8ix7v WYONyNx1xnPPSPq1smkDU2vJhAX8sL9l/ebs4K7cZzkH8qgl8R6dEJidQl YRbc7LQndnn5ePmxznHTFFhFbVNO8QXd1pz VCHtx 7ELhoVfj5nVgCON2NuSDWXb H9fjFp5Ucy mJneEztEdrkfO8uOrHnawyfWuou9RtrKa1jnv2BuRujK2 RjgZJA4GSBz3NVIvEenSiAjUJVEu7B a0I2gd244ByME9c0WAj0qzvdN0BYTDILgSu0CSlPMYlWI3lflLFs8/TNZ8M/jdRab7e4fYJhLnyB vzv2Z54I/d8jjrxWyNYtX0dtSFy32ZGJkkktiGjCgk/LjPQenetCH98qst5t3ZKh4lBYDuAe1MDh tXbU30i3TXIWe6xKF894Y1OCdh5bZn7ue/ygYAJrSEviWP7KNMgunsBZlRkx5LYO05fkEYHXIOa6 lo1Kruv4irHC5RME 3vUD3UKX8Vk2pL58qs6jyhghSAeemcsOOtIDF0m48WLqVkdRtrh7YW5S44h wz9m4bIPqORzRJ/wlhhiERuRK0zeYWEG1W4249YT82f4 ldI8DxrukvVRemWjUCmtGVDlr9BswGy i/Lnpn0p3Aw9FPildWi/tIzPaMXD71hUDgkH5Tnso/E/h1dc9e6xZ6feLaz377ycErb7lQ8dSBju PpT7jU7a2S5d7yVltpRFOUtS3lkgNk4H3QCCT0oA3qKybWdL2a5jt70v9mfy5H8kbQ3cA9CR39Kn WMtt236Hcu4YReR6/SkBJqP/AB4y/wC438jXMX jXtxLfCOwlKvfPJGTIuAzRIqyj5uisCexHUCu gl3R28si3Ec2EbjYuAcH0rPk1m0hkljlvJkeKQRsrWhBwRnf0 5gE7unBoAoW kX8On38D2MjecU 8xQ6/wCkMrEyMef4xgc9cYOBUmhaNf2erQzTW5QKjZlLg4jIAWHg5 UjPp6Hmr8eqWstvdTpfuUt jh/9H5bJwCox8wJ4BHU0tnqdtfXSW8F 7SPHvGbfA9SuSPvAEEr1GaLAaZ/5Caf9c3/9kq1VKNGS jVm3kRyfNtAzylXaAKOtWUupaJe2ULoks8LIjOCVBI4JxziucbT5YvF9kNRE oDJkt5mBxExySQ B8o2nI5/hdRzg57GigAooooAKKKKACuA Nv/ACSHXf8At3/9Hx139cB8bf8AkkOu/wDbv/6PjoAv GrZrv4a GoFCnfpVoDvQuoHkgcqCMj2yKfpXgbTNFvRd2JxL53mN5kRYY2qMAZAUggkEcAHGCMV Y8E20E/w 8MmWJHI0m1ALDOP3S1u/YLP/n2i/wC aAOYsPB8mnaxNqtvqSC6nLGTNmdvOMkKGwG4 69Pbkkkfg S3lgnt9T2zRRiEPJaeYEQbAuwFsKw2n5ueXY46V0/2Cz/59ov aPsFn/z7Rf980Ac /rvhyTXbmJvtP2ZIXDjdAZN3Q8cjGCtZTfDtJJ7iWTUYnaVZcFrHlGcKNw bGRtHQDmu0 wWf/Pt F/3zS/YLP/n2i/75p3Hc4c DbnUDqkNxstUunyZTbqxYZY4G184 YnJ2kHFWj4F3LPuv4jJOJPMf 7EQWLOjgnD5O3bx9fz677BZ/8 0X/fNH2Cz/AOfaL/vmkK5zE/gxZpruX 0G3zpsDPagkA7Nwbkb l/d8DjbuODUs/hqSXQLPRhdYW3jRPPaAsGCMhAK7s8hcda6L7BZ/8 0X/fNJ9gs/ faL/vmjyDY4 xfh6v2q1ml1COZYBCux7EkOI9uAfmx/D3B6nrUcPg 7iv0hDKYo7T7Ml21spCjZtyF3Zz2wRjGea 7j7BZ/8APtF/3zR9gs/ faL/AL5p3A4 18BC2MZ/tCN2j2KhNk2QgEoKZ35wfNPftVmLwYsb2THU GYWqBVxbYKkM5XYc/KPnwwOdwAya6f7BZ/8APtF/3zR9gs/ faL/AL5pDuYOk HpNH0k2CXJlDzt J5qQbNm4EEhSSOvPpz0qCDwg0K2oXU2X7PHJGuy2xgPn5VyTheR8p3fdGMV0n2Cz/wCfaL/vml w Wf8Az7Rf980biOfbwpu0Mab/AGlMVA2hDCTCo3bgAmcjHQfNkYHNR3PhFrj7ZnU3P2ny8l7bOSnR mwRlhxgjbjAzmuk wWf/AD7Rf980fYLP/n2i/wC aAMa58PNcXVnP/al0Wt3LhpIwzDOOFOBtzjB BBBBPHQ1UtvCLW/2Pbqbj7M8jLsttu3d1CcnaD3ByDngDjHSfYLP/n2i/wC aPsFn/z7Rf8AfNAG FH4fktvDzaSlyWD7181YSFiDqw VM9Bnpnv2rEuPh0bi1SBtVQBRKB/oJwPM37sfP/tnqT0Fdv8A YLP/AJ9ov aX7BZ/wDPtF/3zQFzjLjwlcQalaNbRRTwJcmfAtlWOMkocEFsgArnKg89R6oPh8Qk obU0csJCpNjyjuI/nHzYB/djpjqeldp9gs/ faL/AL5o wWf/PtF/wB80B5mLqNrceI7VbSeyn0/ ypFlWaZUlyR6BXPPPfI9jWfeeB0u479TqBBu2OWa1ySpdnw/I3EFsA8EAAV1X2Cz/wCfaL/vmj7B Z/8APtF/3zQFzjrzw/qovIEh/fRII8S WoU7c/e3NuXk7vlDcqD7VtS6Pdlrsw6hGi3M0bsj2jOA qoF2/eGc4Bz Fa/2Cz/59ov aPsFn/z7Rf980BYwYfCyQw6hEl4VF4CrMttg7cswzg4ZssckjkD GO9U7zwPDe7/ADLqJFaEx7IrPaqMVdfkGflU7ySuTkgHNdV9gs/ faL/AL5o wWf/PtF/wB80AYG m G/7HS MMolFxGR5aW/l4O6Rh3PZ9v4CpLjQLi8kle51FSZHYEpaFT5TDBTJY84xg8Y5ODmtr7B Z/8APtF/3zS/YLP/AJ9ov aHruBjReHmht5okvT8 wRsbfOxUJaMdecEnJ7j060/TfD6adexz/a nkRNz7PKIzKwwzZ9CB93t61rfYLP/n2i/wC aPsFn/z7Rf8AfNGgDeupRnBwY36jH9yrVRRWtvC5 eKFEYjGVXBxUtABRRRQAUUUUAFFFFABXAfG3/kkOu/8Abv8A j467 uA Nv/ACSHXf8At3/9Hx0A W/Dl7PbeAfB8Ntd2UEs m2yKt1n5z5K4C471di1fUJmhCatormaRoowu75mHUDn/ADketcvofijQ ZPAvhewbxF4djWLT7YXcdzqKJIjLGmBt9QRnBxyBSC98Otnf408NoZVSKVo9QjyiR7NjJ833jsGQ emeCcc0p2VrCaO1tbjV7xGeC80yVUcozIrEBh1FJcXmpWk0ENxfaZFJO22JXDDefQVy lX/giHTU ttR8T6BJ5bkxRxauNkSkAEAlweSN2OxJxVm88ReFPs9tYWHiXw0LEPvmE2qoWBzkFeTnB55I5Ao5 /ILXNdNYu5TF5eq6O3nO0ceC3zMvUDmoJ/EF1BpR1M6npb2m/wAvfEjtlvTjvXORah4dEgaTxj4Y /ebEmAv4yFSPZsKgtyTsGQfXqcc1b 70G58If2OPFvhppftHnAjVI8LtX5V3E5PzADJHAOOcc0qn kvuJ5TqG8S3qadLqL3VnHYoFIuJYHjV93TbuIJ/LHPBNNPiqdY7iVtRsVigVmd2tZwpCuEYqcYbD EDjPWuNt4fC9roFzp8Pivw5E9xGm5oNThUja2dhOec5J3dR06VqTav4euIroN4l8Pp9uMe8DV4t1 uFdWOCDglsZOMfN69aPa S 4fL5nQ2/iHULpJZY7mz8iFQZJmgcRqTjC5zyfmH3cj1NR6d4qn1a5 W2stU02WVndFUQS8lc556Y4PPesPR5/BWnXvnf8ACS H4Q9uytJDqcXmIxcHaHJyQEAXdnJ56Z4h 8I3Phnw3qdvO/jLQpY/sBilH9owgLIWQ4Hzcj5W5P9aPavsvuDl8zvfL8Rf899N/74ejy/EX/PfT f Hqv8A8J34Q/6GvQ//AAYw/wDxVH/Cd EP hr0P/wYw/8AxVHtX2X3By ZY8vxF/z303/vh6PL 8Rf899N/74eq/wDwnfhD/oa9D/8ABjD/APFUf8J34Q/6GvQ//BjD/wDFUe1fZfcHL5lny/EX/PbT f Ho8vxF/z307/vh6rf8J34Q/6GvQ//AAYw/wDxVH/Cd EP hr0P/wYw/8AxVHtX2X3By ZZ8vx D/z307/vh6PL8Q/89tO/74eq3/Cd EP hr0P/wAGMP8A8VR/wnfhD/oa9D/8GMP/AMVT9q y 4OX zLWzxB/z207/AL4ejZ4g/wCe2nf98PVX/hO/CH/Q16H/AODGH/4qj/hO/CH/AENeh/8Agxh/ Kpe 0fZfcHL5lrZ4g/57ad/3w9GzxB/z20//AL4eqv8AwnfhD/oa9D/8GMP/AMVR/wAJ34Q/6GvQ/wDw Yw//ABVHtX2X3By ZaKeIO02nf8AfD0mzxD/AM9tO/74eq3/AAnfhD/oa9D/APBjD/8AFUf8J34Q /wChr0P/AMGMP/xVHtX2X3By ZZ2eIf e2nf98PR5fiH/ntp3/fD1W/4Tvwh/wBDXof/AIMYf/iq P E78If9DXof/gxh/wDiqPaeS 4OXzLWzxB/z207/vh6XZr3/PbT/wDvhqqf8J34Q/6GvQ//AAYw /wDxVH/Cd EP hr0P/wYw/8AxVHtPJfcHL5lwJrveaw/74agprvaaw/74aqf/Cd EP8Aoa9D/wDB jD/8VR/wnfhD/oa9D/8ABjD/APFUe08l9wcpb2a9/wA9tP8A Go2a//AM9tP/74eqn/AAnfhD/o a9D/APBjD/8AFUf8J34Q/wChr0P/AMGMP/xVHtPJfcHKW9mv/wDPbT/ Ho2a/8A89tP/wC Hqp/ wnfhD/oa9D/8GMP/AMVR/wAJ34Q/6GvQ/wDwYw//ABVHtPJfcHKXSmt9pbHp/cbrRs1z/nrYdP7r VS/4Tvwh/wBDXof/AIMYf/iqP E78If9DXof/gxh/wDiqXP5DsXQmt45lsc/7rUuzWv etj/AN8t VH/hO/CH/Q16H/4MYf8A4qj/AITvwh/0Neh/ DGH/wCKo5/JBYubNd/566f/AN8vTwus95bL8Faq H/Cd EP hr0P/wAGMP8A8VR/wnfhD/oa9D/8GMP/AMVRz SCxfK6x2lsv WppTXO0th/wB8tVL/ AITvwh/0Neh/ DGH/wCKo/4Tvwh/0Neh/wDgxh/ Ko5/JBYtlNe7Taf/AN8NXIfGUTD4NayLgoZs W 8oMLn7RH0zXSf8J34Q/wChr0P/AMGMP/xVcR8X/FnhvU/hbrNnYeINKu7qTyNkMF5HI7YnjJwo OTgAn8KUpX6AlY//2VBLAQItABQABgAIAAAAIQDI4TOSFQEAAFICAAATAAAAAAAAAAAAAAAAAAAA AABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAAAAAAAA AAAAAAAARgEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhACIo4wVpAwAA0QgAAB8AAAAAAAAA AAAAAAAAMAIAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwECLQAUAAYACAAAACEA lK0N39QAAACsAQAAKgAAAAAAAAAAAAAAAADWBQAAY2xpcGJvYXJkL2RyYXdpbmdzL19yZWxzL2Ry YXdpbmcxLnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhAOFRNx/PBgAA5hsAABoAAAAAAAAAAAAAAAAA 8gYAAGNsaXBib2FyZC90aGVtZS90aGVtZTEueG1sUEsBAi0ACgAAAAAAAAAhACV5crgiRwAAIkcA ABsAAAAAAAAAAAAAAAAA Q0AAGNsaXBib2FyZC9tZWRpYS9pbWFnZTEuanBlZ1BLBQYAAAAABgAG 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]--

图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 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 810fbnADAADRCAAAHwAAAGNsaXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWysVV1uEzsYfUdi D9a8k0lCUtKIKYJCERLcW7Ugnh2PM7bw2IPtTMoKEGtgL3c3V2yDY48nmUSFIiDStP493/nO9 PH T25qRVpunTS6yCajcUa4ZqaUuiqyd28vHiwy4jzVJVVG8yL7xF325Oz vcd0WVnaCMkIELRb0iIT 3jfLPHdM8Jq6kWm4xt7a2Jp6TG2Vl5ZugVyrfDoen Q1lTo720M9p56SjZW/AaUM 8DLc6pb6gCp 2HK4kjgq9ufIdKnbl7a5bi5tYM7 aS8tkWWRQTlNa0iU5WkjHcM0P7pV7QFu1rYO5816TW4iyqfw N2LwG08YFh/OpqfjMQww7E1n4/lsskhWxL 33GPixR03QagzjMGATArphYUjgVRwNQY5rhx7PJv0 Lv//9b9vXz6TsFByx xO5pUxH0bMlXqkuc fYXYhFXf59GSay7rCRys mZyOKrke6HZsc8jrNSLt iDbnguqKP3UNZx6ZG27DGcTjmHIS/weYwc0E/wfp10jmN5Yj8zBa4ksZh9FOi1 vi0M03V5KFrTH 8m35ht1g y o3xvozNHgx4/U3gfAWrMVnJauD8IhSh6mBy6slGyQBSooH8ZJqn3S/EQoVIlk/Llh m5pr33URyxX1aF9OyMZlxC55veIoSPuqjFlBl86yK2RJrCnnLfdMBONrkEjryJHdRmS8Jxn4O1Q7 WW3fmBL1TTfeINB9Bd1ZuouTxcm dCensXRhsK/8xjr/kpuahAFog2mEp 1rFzjjaH8kWHVGybLX z9lqda4saakqsov4i3edoCXvVhfz0Do6nHQ8Yh7gKE22RbZYoM2AKm2KzH3sgO6yloCHx2rpuSVK 1kCE7Z11pQN/vl7DQ7gWJmaDo9ei3JKV2tgrirDNI19SyiDGJACgqUhkx3zWgRGqKrxVXiHWxr X XlwL2iAw447xUJJ4o1unqhG0kyQC3SLJjk0U6ICoY1zzh2XgzNAcLU3RMtYLs2tPRvuuiylZCX8l K2Il3lG/NZc edHFFsQJsjb2ezys8b/lbZE9wsOIXyLXw3QB21NwTUdlxVuu3obQTYM6GRGQ7HQ8 T 8HAx zsUiQmDhDYVKudNEbnguVENFjGYTEh/FQA/gijUGzHM6DhT6jf ct2xUEBjs94zOUHz3m Q6uhZQ/nZ98BAAD//wMAUEsDBBQABgAIAAAAIQBMmyeh0gAAAKsBAAAqAAAAY2xpcGJvYXJkL2Ry YXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzrJDPSgQxDIfvgu9QcreZ2YOIbGcvIuxV1gcI baZTnP6hreK vdG9OLDgxUsgCfny8dsfPuOqPri2kJOBUQ gONnsQvIGXk/Pdw gWqfkaM2JDZy5 wWG6vdm/8EpdjtoSSlNCSc3A0nt5RGx24UhN58JJNnOukbq01WMh 0aecTcM91h/M2DaMNXRGahH twN1Ohf5/Dc7z3Ow/JTte TUr7zALl4sQKqeuwGtL5NLHbW4Al7XGP9TI0SJYKMR2QXCn/mofZi/ NXAT8fQFAAD//wMAUEsDBBQABgAIAAAAIQDhUTcfzwYAAOYbAAAaAAAAY2xpcGJvYXJkL3RoZW1l L3RoZW1lMS54bWzsWc1v3EQUvyPxP4x8b7PfzUbdVNnNbgNt2ijZFvU4a8/a04w91sxs0r2h9oiE hCiIA5W4cUBApVbiUv6aQBEUqf8Cb2ZsryfrkLSNoILmkLWff/O 35uvy1fuxQwdECEpT3pe/WLN QyTxeUCTsOfdGo8urHpIKpwEmPGE9Lw5kd6V9fffu4zXfEbTCcciGEckJggYJXIN97xIqXRtZUX6 QMbyIk9JAt mXMRYwasIVwKBD0FAzFYatVpnJcY08daBo9KMhgz JUpqgs/EnmZDUIJjkH5zOqU Mdhgv64Rci4HTKADzHoe8Az44ZjcUx5iWCr40PNq5s9bWb 8gteyQUydMLY0bmT snHZgGC/YWSK cFIIrY9a3UubBX8DYGoZNxwOB8N6wc8AsO DpVaXMs/WaLXez3mWQPZxmfeg1q61XHyJf3NJ526/ 3293M10sUwOyj60l/Gqt09poOHgDsvj2Er7V3xgMOg7egCy s4QfXep2Wi7egCJGk/0ltA7oaJRx LyBTzrYq4asAX61l8AUKsqHILi1iyhN1Uq7F C4XIwBoIMOKJkjNUzLFPuTkAMcTQbEWgNcILn2x JF8ukbQsJH1BU9XzPkxx4pUgL599//LZE3R0/ nR/Z OHjw4uv jZeSM2sJJWB714tvP/nz0Mfrj yTcvHn5RjZdl/K8/fPLLz59XA6F8FuY9//Lxb08fP//q09 /e1gB3xB4UoaPaUwkukEO0S6PwTDj FVdzMhGvNmIcYVoesZGEEidYS6ngP1SRg74xxyyLjqNHn7gevC2gfVQBr87uOgrvRWKmaIXka1Hs ALc5Z30uKr1wTcsquXk8S8Jq4WJWxu1ifFAle4ATJ77DWQp9M09Lx/BBRBw1dxhOFA5JQhTS3/g IRXW3aHU8es29QWXfKrQHYr6mFa6ZEwnTjYtBm3RGOIyr7IZ4u34Zvs26nNWZfUmOXCRUBWYVSg/ Jsxx41U8UziuYjnGMSs7/DpWUZWSe3Phl3FDqSDSIWEcDQMiZdWYmwLsLQX9GoaOVRn2bTaPXaRQ dL K53XMeRm5yfcHEY7TKuweTaIy9gO5DymK0Q5XVfBt7laIfoc44OTEcN mxAn36d3gFg0dlRYJ or/MhI4ltGqnA8c0 bt2zCj0Y5sD59eOoQE //pRRWa9rY14A akqkrYOtZ T8Idb7oDLgL69vfc TTxLdgik fLE867lvmu53n 5Z5Uz2dttIveCm1XrxvsotgskeMTV8hTytiemjNyXZpFsoR5IhgB UY8zO0FS7JjSCB6zvu7gQoHNGCS4 oiqaC/CKSyw655mEsqMdShRyiVs7Ay5krfGwyJd2W1hW28Y bD QWG3zwJKbmpzvCwo2ZrYJzeYzF9TUDM4qrHkpYwpmv46wulbqzNLqRjXT6hxphckQw2XTgFh4 ExYgCJYt4OUO7MW1aNiYYEYC7Xc79 ZhMVE4zxDJCAcki5G2ezlGdROkPFfMSQDkTkWM9CbvFK V pHU12zeQdpYglcW1ThCXR 9NopRn8CJKum6PlSNLysXJEnTY87rtRttDPk573hT2tPAYpxB1qdd8 mIVwGuQrYdP 1GI2Vb6IZjc3zC2COhxTWL8vGez0gVRItYllZFPDfMpSgCVaktW/0Qa3npcBNtNf Q4vmKiTDv6YF NENLZlOia/KwS5RtO/sa9ZK UwRsRcFh2jCZmIXQ/h1qoI9AZVwNGE6gn6BczTt bfPJbc5Z0ZVPrwzO0jFLI5y1W12ieSVbuKnjQgfzVlIPbKvU3Rj36qaYkj8nU8pp/D8zRc8ncFLQ DHQEfDiUFRjpeu15XKiIQxdKI qPBCwcTO AbIGzWPgMSQUnyOZXkAP9a2vO8jBlDRs tUtDJCjM RyoShOxAWzLZdwqzejZ3WZYsY2QyqqSuTK3aE3JA2Fj3wI6e2z0UQaqbbpK1AYM7nn/ue1ZBk1Av csr15vSQYu61NfBPr3xsMYNRbh82C5rc/4WKFbOqHW G53Nv2RD9YbHMauVVAcJKU0E3K/vXVOEV p1rbsZYsbrRz5SCKyxYDsVgQpXDeg/Q/mP o8Jm9bdAT6pjvQm9FcNGgmUHaQFZfsAsPpBukJU5g 4WSJNpk0K vabOmkvZZP1ue80i3kHnO21uws8X5FZxeLM1ecU4vn6ezMw46vLe1EV0Nkj5cokKb5 RsYEpurWaRunaBLWex7c/ECg78ET3B15QGtoWkPT4AkuhGCxZG9xel72kFPgu6UUmGZOaeaYVk5p 5ZR2ToHFWXZfklM60Kn0FQdcsekfD W3GbCCy24/8qbqXM2t/wUAAP//AwBQSwMECgAAAAAAAAAh AJxx201sGAAAbBgAABoAAABjbGlwYm9hcmQvbWVkaWEvaW1hZ2UxLmdpZkdJRjg5YZIBGgF3ADEh /hpTb2Z0d2FyZTogTWljcm9zb2Z0IE9mZmljZQAh QQBAAAAACwNAAYAgAEQAYYAAAAAAAAAABoN BwQEBwwEBAQAAAIHCQwNCQYCAAAAAAQJCwwCAgICAgQJBAIEBgoCBgoEBgYJBAAABAgCBAgNCwgE BAgLBgIEAAAHBwYCAgYLCwwLBgQCAgAJBAQCAAQJCwgJCQYNCwoHBAYEAgQEAAQEAgYJBgICBggL CwoAAgILCQoHAgAJBwQHBgIHCQgJCwoCBAQAAgYHAgQHBAQHBgQCAAIaAAkHAgILBwQAACIAAEQA VYgrAAArACIzADMrKwArKyIrK0QrK2YrVUQrVYgrgGYrgIgrgKpVAABNADNVAERVKyJVK2ZVVSJV VURVVWZVVYhVgGZVgIhVgKpVqohVqqpVqsx/AAlmADN/ADOZABGZABqZADOZACqAKwCAK0SAVSKA VWaAgCKAgESAgIiAqmaAqsyA1IiA1MyqVQCqVSKqVUSqgCKqgESqqkSq1Gaq/4iq/6qq/8zUgCLU gETUgGbU/4jU/6rU/8z/qkT/1Gb//4j//6r//8z///8H/4AAgoJdhYOHiImKi4yNjo QkZKTlJWW l5iZmpucnZ6IXYOhn6SlpqeoqaqrrK2SowCwrrO0tba3uLmqsrGahb/AwcLDxIaNxcjJysSKy87P 0JDQ09TAzdXY1JXZ0YSgvn7h4uPk5ebmvIld5 zt7u3pse/z9PXh8er2 vv3zfz/ vAdA0hPFiyB rwjOQyhPocN46xxKLMeQ0MSLEC9q9FMx30ZyBkMZyxTxoziGJU0W9KdSYceULe1ljAmwIyia6Ww gilOz5VwPtnR elHD5JxQ1HSXMhy6b6X9cTk4bNkTh8xd5IE2DFHT4CvPIbym mHj1au7owK/aoj Tc1t5v/ogNWDts XIGzdvsvZKWXQokT1PAnQdk8PrnrwHi2KxKsONEl2ZHHEc9/ff2QlXnYprV6d NIKv7KEi1uhfNUGIBmxaGolhxITJEAZNpEfbOkACEC0t vAcubpx6 6pmiNccnp4hKPzJLWfPUyc 7ykCtDhIQswwVQYMVIjeNWlGGxXL PPyK0qdwmuqvh5Uej7roIni03Bb7s HP21q3y340eaZV1QA 4RUxlFp AKfbf1QAhcSBi6Fz3DgCFmVEFH7UQYZ01O2lTl/n/KWHFD3opsZcDwbmWolXJEVZe xk BqOHO9WzxxRi4CGGG3oZ1hhRe i3mkfi HhiADwYFgD/ibrpocMcfETx2WjnPVfEkUmWiMSUDZ6j kyjlVGgUG3KUkVheTH24yXbThaNGYUWA5yB5Rv1nIHovzkgRe3quVyM9fZCBoR1S5KHGT9Od5tx RB5qpZx /EdgopMWwWWV00HKRldbhtelhJTwlNxyQTQmxRmJWecORJx08dWrsMYq66y0fjUQP7UG wOhNCuVK0Hvz5CosrGny6sewyCYr7EkTiqNsrdd90ypOefbJLJHWxthZtqAay223CcXEi0jTiltt tjJ Ow6w6vaDbbvXTrIdRocctOY8CO66yLztpQsvu 36G3CzJhlULzjvmEaYE3ipCq4/IjpcJWPi iLWH/w96VXxFvtHeBNx95chp1lZjSFxUXV9Yt9nD 4YzMlohRqjxPOT5eVPE7Vyc8T4Hoqzqlxbh tzI5wPFA1xx 2IXXbO72cjBJ HaaIBJ8NJEHjYysI JgOpjhW1GKOejVV1wxd9TIVUT2xoq35YZn PqWRWJhtaaxhxhBt/CTXDnDQfeZWb0jHhBVfBPBEcwE8GIQOsik 3HutvfaGbb9tbIRWve1Qcjj9 jbx02mh6CXFgXIfnW2KaP3E25iP3dpunwqW9Q CIDl744UFIdtzWhHmNWO5vKJdgc7Vz6C6r2kWt ZGpXXb3qiyJ6F6mnjNEp9VB9gBGH1UNNB6GdEGakIP cdq4hxBz9DWVnneExcWGGG/6khuo 0dEY D1W3QXUTxv3Z3/TQMUIT8ACGrugmU6YjCvhEQ53xwElb YjedzxllOxtLw/duxMCp8MlCB3ofRpy zvyOArSGSBCAVFCLmEAYPyv1QyAlBFPCkCAp13ToeQMREZNepZzxqGh5G3vVFTZ1Hj0coYBR4pL4 EBUAKEEBiVFQA8yUZAUoGuVIiSOTme4jmB91jwr5u8JV ncuI70KCWyIA4achDQ/YPEn2YNSFIio pAdxJUoQvFlgmHQFLCnsK0NsIxHjmETYeQpCWnSSW7pIxnDpsEQ8VGHGxlSmv4GMXFm7BL96wjaG Ccn/Zi1rkxsLQyBOWk9SffxJcoYSRvZx0FNLzE BygcEJDgqSFdYHw0XaSpUiZB LRINGJugvza9 55Zx4qXZBnSFqoXBLeRZIB a6MAC5bFeLhzlLPVyRVWGpZnEBOczvbexTo0GQiPypfxU18hIRESU bwpPKSk2qgSVKp2pAkkMt5WWCNUMay17lkCTlZGBGvRZP3nPQRcqK9UUlKEQpVU7txXRWTWtFJsM h5D icOsqUtgKnHUOWoGsI/y6VsiLWFGOXMKbjyDMi6N6UjqJVNlbOErAtBCMbDwA2vspKZAhUhQ s3HTAOT0F9sY6jB0wdSmOvWpUI2qVKdK1apa9apY/9XEAAggiK3SIgBRBetVxZrVRJB1rGUdxFkj 4VUAtHUABQiAAQ6AgAQoYAEDYMBdS7FWpvZVqn8ta2ABm1ZBDBYSb23AAQThALo YAAQKKxkJ0vZ yrrirRFIQAAIIIGvTACypzisLUTbVNJW1bSllSxqF4EACghCAnNtbWO7GllTrLYVt71FbqG6W92q thJtBUBnAzCBusZWsxAArW0ti4veOtW5zMWtZaEbWqxSVxfXdUV2vzrd6I7Wu ANa3fDq93xkvep 2/Utb61rXrQWNr3fPS8r4Cvf k6Cvtxdr3spi19U9FcV/5Wufq0a4PkK9rf2TbCCF8zgWCA1v hl b/9lC0wKCi XJH/4wz4zYeFKdHgTH65uVkPsiet2IcMbbrCKV8ziUKG4FiSORIwvMeNP1JjGCNbO iyH8XAnz98Dv9cWOW0zkIhtZk0Mu74BP214C5xjJGoaxePc72RtbwsqYMPGOK2CBRFzAs5BVLgBm O4gLcNWttWXsYo/M5jZn9cRRrusE3HrmAcwZABcoQHIhUAEMyDUDGtiAIMxMWw50YLMOALSgsbwI Rsu4yUwOMoajDAAuI4IDa0YzZM2MgAA0YAFlrjMEzAxZB3zasFN28oSBnFYtU9rSh8D0IMIMAQ A WgJ7HbSoMY2AB Aa1G4OtrCf6lNYz/rOF2DAns3/XIEAdCDNhEYzrx/ggGejeslUdTSHWc1tHA/C 0sH9MnFp3ec/fwDY4v4sBKad6HMDQNuIgLcj5H3lbvt42PjOt74VQWJZ0Pvaqv7xiJ/s7VYY49/v vjfBI91qXyhVG/uOuMRblWRUGAPOKa6wwiW9cSpbAuO0AHmPPc5xkptcXhVfhcgnzvKWvyLlu4C5 egNeZXuf/OWUdsXK/dpxm08V4Y9wdca3IXOJA10SRwev0ENedCnfvOeELfnHm26Knbs86ZDAenSX Pgurt1zr83Z5waE8dBfnXBDGzTQmoj2IXgNA1vGGutyxPfefzpQVPh1EY 3c1rre1QMg6LLfF1Bu /wLwOgIYUEAI7LoAEYxA0I4X9MIbLnYPg3jmiQjumB2LABIstrG95jQFpm1m0D/A7YKAu1rrzvCn //zy8U2EsV/r2cgL17O2Tr1jzTzcz56ZznF3Pc2Hz/rCVqAEwNb7muHKVTIz2wQnIMCmCUDm4Gq 8tifvIET0fu axYFI0jB4 saAD77WfoBUMFjFY9c1L9d7QkXfuuJL/ wx74Vtrf9IcAef4EXP8LY 53ayVnbZV4BK5nS6cHD/F3ULmFqacGMPB1T053MMSIFX5XVdNwoYaIAcmAsQSHU6B4IeCGnZpn33 ZQsbWAsp6ID V38AOFkr2HUi2IE0uAofeHa5EP D2EWCryd19aaCM6hyQzYAcgV/ikBqdfZ7Ryhq oQYAqKd6/McIUdh/FmhVOmhwQ7YCdNZWIsACAVAAmaUAIJB4LZCERGgAGcB4eaUALlBnDCBXL5B4 MPB4gqB/NchyN0iAa5JkA5BruiZcsfUASNhVhvd5jgVa0TYAc6Vr7vd AFdzA eDlgeEOIgLVtda hzBbROhZg0hn5Pcq6oZndRYDmkUAnUiIj2iCqVaFWYeCQRhzOddYs0dosLVmovda1EdXAbB8kZWI u9hapwh8d4iHrliJt7ByaceFXgiGyNWHC9B7TpgAaNiMvQhmpDhXfRgCDxBrazaF/MaKqzh2IWj/ jMVoExKghJ gf15Ah1SoinTnglJYjk4Vg5soA5JnCk oBHo4jPaVh/OIYhE4VC04gfP3g0xHjpS4 j30hEq/4gvDIglkmj011hV0nCg05cvwYfNuWkP IkExFkeFYkA9JbBfZUiWJhR4pkvyYXf44kSeJ dy85ghmpkRHJkS6ZkjkYk80Fju/4ZjrpCSBpk 5IgywpkR/5kxaHlAg4kjv4gEaZgEpZdVE5C1Po jamYVkGZClkpgzg5kyvWkkfZlcc4lQfIlDK5kQepkDomlk9JeQ3Ic5S1lSbJlkLplW0GllBJl2k5 kCrZl0jXlpZIlp8gl3D5lk0Jg4JJdlVFmHZ5/154mZN6yZVquX2GeZY1uZc3OZl9kZg2yJMOWViM SQqhCYua2ZhuKZkdWZp7GJkQSZAl6JR1CZmqKWSsWZhmuZNxyZlEV5swyZumqXSAOZa SZp8 Zqn KY4oOZs4p5xryZx85ZkYKVmjCZS6uZrO Zs9iJlheZ27yZ0lBp2taZComZmLWZ3 BZ62iZy96Z1Z Y56Txp7YGZ3jCJ/N4J7NWZzZiZ5mFZz8SZ6QWJm4iZbjuZ3lOZzxuWqxGZgGmpQLupSumZ/qKYQN ap0FSp wCaCYF6HE6Z9TNZ3355VFmaDCaaE7UXQiMAPJ1wideH2HkIjQxlW9pnr7GYnHiZX2Kf8N Nzp1COmMwdWFXxiGY6gAZdhVcXVcd5VX5UdbmxgACjCHG2CHNAmisKedeUmilCFzjkcDKSqKgLh7 0ldniqVmvTZ9hbZYnLaNjviNphmiVCqbFboIW5V7mbhYSzoBK5pZm9V9oyZq5McAX4qKaoqhH2qj E0qbVnoMMpduiECLiyiKmNilssWLLgp6m/VW6Lh6azqlA1qlb8oIttajy4inyXVXvZd25LdsYAYB xlUDioemMrp/ mmZGqqVOXqlhSqaJ3mOphB5duhvsRqg0lmriHqrg9mQ9XiPpBCj8Hd3BzqrDHqo hCCsKKdhAVmtzAqhgtqOyZmanfpmDAmtQTf/lFTloRRHrNRprlVnkeC6b4 poOuqDtK6h 8aj5JI Ce06ot1qo/PaaOLaofFan harvtaogMrbPfanwQarAUbpdl6sCLKrQpLo7/KqRwqVeQqgwvrZg7b plB1sSGYsZhao5PIsfg6rv KYSB7lbdJsQnrrwGblCl7ZBu7qVHlsVgYs1aprSNLs 6ar2V1Yjjb r40ws/Ppsz4Zs0ZGtNtqsi9rkkFbryf4sFLbsvoqsVYrnkVbsTV7sjqGtEWmtOtptFgFtFe7sior oeBqs8XatFL5tCJrrwjLsyTJthhFt1 rqVlLtVtrt8WaDuR3qV72p8K4hLTVojBqA0aYszlr/5F8 a6sLq7ZCmA6WWoehaldBOqRuVaR0pYZvWFthBodyGH7syINRS7Jx66YRu6hFaLiQKoiCOwBhunlj uqdlyojb Kr/eZlye7o9m7qy12XK51ageKelqKcu reDeH2KW1mQq6OPy7VIlg6yCLx/WIuM6FqQ SgHVR7toBnoUkLyAC7V/ObW7q7VHmwjJeGY yozl54ylKo2b276jlqrJ2Krv56vi 2jkm7cWC71T BzS6uquiK2gKmL9iy7slC5rUugxFdVQRyAU3oI/Z8ZUIjLYHbIWNGyoMmcEC6qxzmbb 254cLK/j yrheu7jROsIA 7wqjLJjG8Jlyb o67Jeq/ uL9zCO vBUonD9QLDK4yYKdu8F4aYPGzCF1yeQezD lFm pmu L5zElfi3kLCi4culaNaEyhqouivDvUvDQHzD0rt8v7e QEqGdVakaXiketWGSvoqTfp4 UHq2YAyxXuy7RosDHdCoTViLofe6YWp6iLhrZkoAT2iEnAC2Fsy0NRytUJwOOHAAs7d5wsuJr4un oBjItNWnr3upbMrEnjzDVXuBKTe9i8pV1uuo2MvHu1i4k6qLmzyjRAzCRSzCixwLs y46Au/oPqj zUiqnmVcaSi/eEa/0siq2qh7Q/zJS1vHCtzIlRDApMCrdDgSnczFCdy/t4xyzsxWX2GPp5D/xaIg x6J8y0JMoXasyNaqVBeqzGGryF88zhlrCKOJyBvKzKGMwdk8rBlHz7Saz6CgxO7kzz88xx28zCyL zbVMtvDsk8PJz896xCa7zQtd0O2stx0L0Dgq0fi8zxVczwj9zhtNCdCoolXcnetszR3dxEhM0JRw ikjKpEFaA4eoVzVwaCUNrw2d0g/tzudsz5EQyd3rpdMWyGKGozm9vwa9twkt0DhdQmw3axDQe2Y2 1JE1bdNay7ZMzhhtxD390ZQgp4dQarZoitK3Z /XiCV61CrNzjp9lBLdEbZnfarayy2Qfo9V1Y51 1Sed1F3s1c08x9dKbA8WrFrN1Cm81I0c/9j15dAfDNH us2KLZ9Yy9fXrNQg7difSaiyzMKIzdIq xtg7zNmXzdNlC7dIXdF fc YLdk/C8PlbKij7dMMBtp1a9hZ3dmTcKqO8NTv baly9YebdldTdKO lwO/99JimHgyPaY0bdPL6dsTbdFzi9uTcMpQbXpTfYi9WNbPzWK0jau2/dptK9IEcKIpCllSXYiz e9ZoatQnjLeU3dbxjcFA01gi8MhhDQHOR9a0xt7dXdqeDcrC/dfh7AinKtcHLqR2DVpWHdC2ncwo fdrynZMaWLB517ATDt6irbDWIM8igVQe7mAOFuIkDuIfLuIdHgrLm5uFveEEHtnNCsvA3f/PLq7a BbviFJ3I0k3Hqu2X2JrD873WAn6 MQ7kqD3k0x3bP/6grSjhwX3RD74vUS7OS/7bES7kfd3aWP3Z Gb62NZ7bjEfSdeu2E0vlje3EPD4J3vtWbwjTyj3TClDTm/W/AG6cWxzkM57nYoq9tIXd6n3XoljU L7flZquzOn7QA04JRKgCfI5m6U3V/k10ZF7nIY3mlo5YaRbUukZqZt3gLkboTB6uTk7jnQrjqnuk 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]--

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

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

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

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

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

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

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

5 Web Service调用Session Bean BKStoreMgr 的getUserList ()。

6 Session Bean调用Entity Bean CMP UserCMP 。

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]--

图8-28 “账户管理”界面

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

如果用户注入新的资金 如图8-29所示 单击【Submit】按钮后 新的资金会存到Form Bean中传到Action Bean Action 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]--

图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]--

图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]--

图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]--

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

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

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

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

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

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

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

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

6 Web Service调用Session Bean BKStoreMgr 的updateAccountBalance ()。

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

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]--

图8-33 “图书管理”界面

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

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

图书信息存入数据库后 Action Bean在ActionMessages对象中定义一个图书成功加入的消息 Action Form经过ActionMapping的forward方法将消息输出到新的转向页面 如图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]--

图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]--

图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]--

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

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

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

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

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

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

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

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

6 Web Service调用Session Bean BKStoreMgr 的createBook()。

7 Session Bean调用Entity Bean CMP BookCMP 。

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]--

图8-37 “图书查询”界面

2 图书查询系统时序图

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

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

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

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

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

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

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

5 Web Service调用Session Bean BKStoreMgr 的getBookList ()。

6 Session Bean调用Entity Bean CMP BookCMP 。

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]--

图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]--

图8-39 选择图书

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

单击书名的链接时 将指向viewBook.do 这样将调用ViewBookAction 同时把该图书的ID号也包含在请求中 ViewBookAction根据request.getParameter的方法得到该书的ID号 并将它作为参数来调用BookStoreMgrImp的getBook方法 得到该图书的所有信息 显示在下页 如图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]--

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

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

如果用户单击图8-40中的【加入购物车】按钮 页面将会继续提交到ViewBookAction ViewBookAction将会根据request.getParameter( addShopCart )来确认这个请求是否真正来自“加入购物车”。如果是 将相关的图书信息从Form Bean中取出 存到一个ShoppingCartDTO实例中 因为一个用户可能会买很多书 一个ShoppingCartDTO代表所购买的一种书 将它加入到一个List中保存起来。值得说明的是 在购物车提交之前 所有购书的信息都是存在内存List中的。如果没有加入的错误信息 则通过Action Bean的saveMessages方法 将成功的信息加入到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]--

图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]--

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

直接单击“加入购物车”链接 会调用BookListAction。它首先检查是否含有一个action为addShopCart的请求 如果有 将从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]--

图8-43 进入“购物车”界面

6 删除不想买的书。

如果用户想删除不想买的图书 需要选中每种书前面的复选框checkbox 然后单击【删除】按钮 如图8-44所示 这个删除请求和所要删除的图书序号将会通过Struts的ActionServlet送到ShoppingCartAction 在ShoppingCartAction的execute方法中 将会检查是否有删除请求 如果有 则通过请求中该图书的序列号 从缓存的List中找到含有该图书序号bookID的ShoppingCartDTO 从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]--

图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]--

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

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

如果需要修改所买书的数量 则选中要修改数量的书 然后单击【修改数量】按钮。提交请求后 对应于每本书的数量将会在请求消息中存在 并通过ActionServlet转交给ShoppingCartAction 在ShoppingCartAction的execute方法中 它将会检查是否有“修改数量”的请求 如果有这样的请求 则取出请求中的图书数量 取出缓存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]--

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

8 提交购物车。

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

!--[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]--

图8-47 提交购物车

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

提交购物车时 程序将会在服务器端检查用户的账户资金是否大于购书总价 如果账户资金小于购书总价 服务器端将会抛出账户资金不够的异常 Struts的Action 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]--

图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]--

图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]--

图8-50 购买成功

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

12 ORDER表记录了总的购书信息 如图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]--

图8-51 ORDER表

13 ORDER-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]--

图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]--

图8-53 购物车系统时序图

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

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

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

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

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

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

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

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

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

8.5 在Websphere RAD上创建Entity Bean CMP、

Session Bean和Web Service

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

RAD所创建的网上书店的Session Bean和CMP如图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]--

图8-54 RAD所创建的网上书店的Session Bean和CMP

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]--

图8-55 在RAD上创建的Entity Bean CMP

下面是各个Entity Bean CMP。

1 AccountCMP 负责对ACCOUNT数据库表的select、insert、update和delete 如图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]--

图8-56 AccountCMP

2 BkSequenceNumCMP 负责对BK-SEQUENCE-NUM数据库表的select、insert、update和delete 如图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]--

图8-57 BkSequenceNumCMP

3 BookCMP 负责对BOOK数据库表的select、insert、update和delete 如图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]--

图8-58 BookCMP

4 OrderCMP 负责对ORDER数据库表的select、insert、update和delete 如图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]--

图8-59 OrderCMP

5 OrderItemCMP 负责对ORDER-ITEM数据库表的select、insert、update和delete 如图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]--

图8-60 OrderItemCMP

6 UserCMP 负责对USER数据库表的select、insert、update和delete 如图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]--

图8-61 UserCMP

8.5.2 在RAD上创建Session Bean

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

1 根据前端所传来的数据 调用相应的Entity Bean CMP 对相应的数据库的数据进行相应的insert、update或delete操作。

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]--

图8-62 RAD所创建的Session Bean

在此将创建3个Session Bean。

1 BookMgr 如图8-63所示。

l Session Bean远程实现类 BookMgrBean

l Session Bean远程接口类 BookMgr

l Session Bean的远程Home接口 BookMgrHome

2 OrderMgr 如图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]-- !--[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]--

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

3 UserAccountMgr 如图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]--

图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所示 包括如下3个Web 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]--

图8-66 将Session Bean发布成Web Service

8.6 SIBus服务总线的基本原理

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

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

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

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

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

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

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

服务请求者在收到服务总线入站服务发布的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]--

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

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

SOA架构的服务集成系统

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

8.7.1 创建SDO库

SDO 其全称为Service Data Objects 中文为“服务数据对象” 是IBM和BEA共同发布的一个基于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]--

图8-68 应用程序服务器

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

注意 E:/rad/runtimes/base_v6/bin路径是笔者安装的RAD所带的Websphere 6.0的bin路径 读者需要根据自己安装的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]--

图8-69 运行创建SDO Repository命令

通过上面的liangahNode01和server1 读者要根据图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]--

图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]--

图8-71 Repository运行程序

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

资源适配器 英文为Resource Adapter 是J2EE Connector Architecture JCA 所定义的一个组件 其目的在于使得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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

!--[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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图8-89 所添加的总线成员

8.7.6 创建总线目标

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

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

1 BookMgrService

2 OrderMgrService

3 UserAccountMgrService

本章将分别对上面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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图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]--

图8-96 所创建的目标

上面完成了对应于BookMgr服务的总线目标“BookMgrDestination”的创建 同样的方法可建立对应于OrderMgr和UserAccountMgr的总线目标OrderMgrDestination和UserAccountMgrDestionation 如图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]--

图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]--

图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]--

!--[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]--

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

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

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

同样的方法可以得到OrderMgr.wsdl和UserAccountMgr.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]--

图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]--

图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]--

图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]--

图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]--

图8-104 服务器端口

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

l 出站服务名称 BookMgrOutboundService

l Service destination名 BookMgrOutboundService

l Port destination名 BookMgrOutboundPort

!--[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]--

图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]--

图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]--

图8-107 所创建的出站服务

上面是所创建的对应于BookMgr的出站服务BookMgrOutboundServer 同理可建立对应于OrderMgr和UserAccountMgr的出站服务 如图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]--

图8-108 建立对应于OrderMgr和UserAccountMgr的出站服务

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]--

图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]--

图8-110 目标对话框

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

l BookStoreBus OrderMgrOutboundService

l BookStoreBus UserAccountMgrOutboundService

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]--

图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]--

图8-112 选择入站服务

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

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]--

图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]--

图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]--

图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]--

图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]--

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

同样可根据OrderMgr和UserAccountMgr的WSDL路径创建相应的入站服务 如图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]--

图8-118 根据OrderMgr和UserAccountMgr的WSDL路径创建相应的入站服务

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 UEsDBBQABgAIAAAAIQDI4TOSFQEAAFICAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbKSSTW7DIBCF 95V6B8S2snG6qKrKdhb9WbZdpAeYwtimxYCApMntO3ZsqY2sbLJBwPDe xgo1/vesB2GqJ2t Cov OEMrndK2rfjH5iW75ywmsAqMs1jxA0a rq vys3BY2SktrHiXUr QYgoO wh5s6jpUrjQg JlqEV HuQ3tChui JOSGcT2pSlwYPX5RM2sDWJPe9p 0jy5bHl7PF4cMiquO4Hg7EgFjUBTTzRgPdGS0h0 O7Gz6oQsm6hyUo5nYqd9vCF0vpwwVP5D/Q2YdG/UzqAVsncI6RV6QhfSaP/pICihAvxQc M8WeXn TReoXdNoicrJbU9dzCfHGft8fKIXQjGOlyePNnOuGH9E/QsAAP//AwBQSwMEFAAGAAgAAAAhAK0w P/HBAAAAMgEAAAsAAABfcmVscy8ucmVsc4SPzQrCMBCE74LvEPZu03oQkaa9iOBV9AHWZNsG2yRk 49/bm4ugIHibZdhvZur2MY3iRpGtdwqqogRBTntjXa/gdNwt1iA4oTM4ekcKnsTQNvNZfaARU37i wQYWmeJYwZBS2EjJeqAJufCBXHY6HydM Yy9DKgv2JNcluVKxk8GNF9MsTcK4t5UII7PkJP/s33X WU1br68TufQjQpqI97wsIzH2lBTo0Yazx2jeFr9FVeTmIJtafi1tXgAAAP//AwBQSwMEFAAGAAgA AAAhAP/ZMlNrAwAA1AgAAB8AAABjbGlwYm9hcmQvZHJhd2luZ3MvZHJhd2luZzEueG1srFVbThsx FP2v1D1Y899MEgiFiAG10KBKfURA1W/H44xdPPbUdiZhBVXX0L10N1W30XvtmWQSQamgSEP8PPfc cx8 Pl2VitTcOml0lgx6/YRwzUwudZEln64nLw4T4jzVOVVG8yy55S45PXn 7JiOC0srIRkBBO3G NEuE99U4TR0TvKSuZyquYW9ubEk9TG2R5pYuAblU6bDfP0hLKnVysoE6p56ShZWPgFKG3fD8jOqa OoBUbNxdaTgq9nRkOtb1ha2uqqlF5uxDPbVE5lkCymlagkRJ2mw0x2Ca7twqNgCruS3xvJnPySqg 3OL/gMFXnjBY3O8PjkYjMMBgb3C0vzfoNyeY HjHPSbePHATCEXDMOiQaUI6seAIkkJXQ5DDyq7H g6OD1udfP37 /v6NhJWcO2bXQs Muekxl ue5j59DbOJVNylw4NhKssCPlrw4WDU 1IVHeV2rXaZ vYNYO6LNmaC64K9cxZkHXfA2uAMR2SXdyH8PJjrawD8hASvJ/MJyyD0YjeFrcg5Gay3 vTK20XQ9 lQzVh W7Mg520fb/kL 1EO1RdOQ uTcRsNYsBae5a6OwjZLidMuHmZIVpIFC6XHcaLXJmr8oBYUi GT83bFFy7WMjsVxRDx3MCVm5hNgxL2ccatK zUNa0LGz7BLSJJSV85Z7JtD4HEg065Ak643AeEMS TsoeDJbvjc5lDhdeAORbovocdULBtvir6zzF9yUBAdAG5gGeFq/c8gZjrZH0KozSuatfs4WszNl SU1VlkzCX7jrBM15XD0c9WPDQB/j8YC5haM0WWbJ4eERHCWMVlnivkagh6xFgltgpfTcEiVLQATb a tKI38 n4OH4BpOzAKOXol8SWZqYS8phA16HZLIJYoxQACcQHaM9hELZlQV8Fx5BbE2/rP04krQ CgLTj4y7koQbcZ2qStAoSQBqOkZXkjWbINAWUce45ns5cmbQHy1tomWsF2bdn4z2sY0pWQh/KQti JTylfmmmvvEixhaIE8ja0PLhbQ2/ltdZ8hLeRnQyytrCxIBtKLgqUpnxmqtrDN0Q1UmIwCeiD69F yHUGfMzCQoKExOkK0 RKNNM9h1kS0EMZYOKDcawB AKNTrfsztFCm9GPec7WBQGDtZ7hJUp33vOu VezZ3fnJHwAAAP//AwBQSwMEFAAGAAgAAAAhAJStDd/UAAAArAEAACoAAABjbGlwYm9hcmQvZHJh d2luZ3MvX3JlbHMvZHJhd2luZzEueG1sLnJlbHOskL9qAzEMh/dC38For3WXIZQSX5YSyBqSBxC2 zuf0/AfbCc3b122WHgS6dBFIQp8 fpvtp5/FlXNxMSjoZQeCg47GBavgdNy9vIIolYKhOQZWcOMC 2 H5aXPgmWo7KpNLRTRKKAqmWtMbYtETeyoyJg5tM8bsqbY2W0ykP8gyrrpujfk3A4YFU yNgrw3 KxDHW2qf/2bHcXSa36O eA71wQuszYsbkLLlqkDK Ree9lcAR9r9P p4XyLYKHh2TjCn3kvz4nt twcuMh6 AAAA//8DAFBLAwQUAAYACAAAACEA4VE3H88GAADmGwAAGgAAAGNsaXBib2FyZC90aGVt ZS90aGVtZTEueG1s7FnNb9xEFL8j8T MfG z381G3VTZzW4Dbdoo2Rb1OGvP2tOMPdbMbNK9ofaI hIQoiAOVuHFAQKVW4lL mkARFKn/Am9mbK8n65C0jaCC5pC1n3/zvt br8tX7sUMHRAhKU96Xv1i zUMk8XlAk7Dn3RqPLqx6SCqcBJjxhPS8OZHelfX337uM13xG0wnHIhhHJCYIGCVyDfe8SKl0bWVF kDG8iJPSQLfplzEWMGrCFcCgQ9BQMxWGrVaZyXGNPHWgaPSjIYM/iVKaoLPxJ5mQ1CCY5B czql PjHYYL uEXIuB0ygA8x6HvAM OGY3FMeYlgq NDzaubPW1m/vILXskFMnTC2NG5k/rJx2YBgv2Fk inBSCK2PWt1LmwV/A2BqGTccDgfDesHPALDvg6VWlzLP1mi13s95lkD2cZn3oNautVx8iX9zSedu v99vdzNdLFMDso tJfxqrdPaaDh4A7L49hK 1d8YDDoO3oAsvrOEH13qdlou3oAiRpP9JbQO6GiU cS8gU862KuGrAF tZfAFCrKhyC4tYsoTdVKuxfguFyMAaCDDiiZIzVMyxT7k5ADHE0GxFoDXCC59 sSRfLpG0LCR9QVPV8z5MceKVIC fff/y2RN0dP/p0f2fjh48OLr/o2XkjNrCSVge9eLbz/589DH6 48k3Lx5 UY2XZfyvP3zyy8 fVwOhfBbmPf/y8W9PHz//6tPfv3tYAd8QeFKGj2lMJLpBDtEuj8Ew 4xVXczIRrzZiHGFaHrGRhBInWEup4D9UkYO Mccsi46jR5 4HrwtoH1UAa/O7joK70VipmiF5GtR 7AC3OWd9Liq9cE3LKrl5PEvCauFiVsbtYnxQJXuAEye w1kKfTNPS8fwQUQcNXcYThQOSUIU0t/4 PiEV1t2h1PHrNvUFl3yq0B2K phWumRMJ042LQZt0RjiMq yGeLt Gb7NupzVmX1JjlwkVAVmFUo PybMceNVPFM4rmI5xjErO/w6VlGVkntz4ZdxQ6kg0iFhHA0DImXVmJsC7C0F/RqGjlUZ9m02j12k UHS/iud1zHkZucn3BxGO0yrsHk2iMvYDuQ8pitEOV1Xwbe5WiH6HOODkxHDfpsQJ9 nd4BYNHZUW CaK/zISOJbRqpwPHNPm7dswo9GObA fXjqEBPv/6UUVmva2NeAPmpKpK2DrWfk/CHW 6Ay4C vb3 3E08S3YIpPnyxPOu5b5rud5/vuWeVM9nbbSL3gptV68b7KLYLJHjE1fIU8rYnpozcl2aRbKEeSIY AVGPMztBUuyY0gges77u4EKBzRgkuPqIqmgvwikssOueZhLKjHUoUcolbOwMuZK3xsMiXdltYVtv GGw/kFht88CSm5qc7wsKNma2Cc3mMxfU1AzOKqx5KWMKZr OsLpW6szS6kY10 ocaYXJEMNl04BY eBMWIAiWLeDlDuzFtWjYmGBGAu13O/fmYTFROM8QyQgHJIuRtns5RnUTpDxXzEkA5E5FjPQm7xSv laR1Nds3kHaWIJXFtU4Ql0fvTaKUZ/AiSrpuj5UjS8rFyRJ02PO67UbbQz5Oe94U9rTwGKcQdanX fJiFcBrkK2HT/tRiNlW iGY3N8wtgjocU1i/Lxns9IFUSLWJZWRTw3zKUoAlWpLVv9EGt56XATbT X0OL5iokw7 mBfjRDS2ZTomvysEuUbTv7GvWSvlMEbEXBYdowmZiF0P4daqCPQGVcDRhOoJ gXM0 7W3zyW3OWdGVT68MztIxSyOctVtdonklW7ip40IH81ZSD2yr1N0Y9 qmmJI/J1PKafw/M0XPJ3BS 0Ax0BHw4lBUY6XrteVyoiEMXSiPqjwQsHEzvgGyBs1j4DEkFJ8jmV5AD/WtrzvIwZQ0bPrVLQyQo zEcqEoTsQFsy2XcKs3o2d1mWLGNkMqqkrkyt2hNyQNhY98COnts9FEGqm26StQGDO55/7ntWQZNQ L3LK9eb0kGLutTXwT698bDGDUW4fNgua3P FihWzqh1vhudzb9kQ/WGxzGrlVQHCSlNBNyv711Th Fada27GWLG60c UgissWA7FYEKVw3oP0P5j/qPCZvW3QE qY70JvRXDRoJlB2kBWX7ALD6QbpCVO YOFkiTaZNCvr2mzppL2WT9bnvNIt5B5zttbsLPF RWcXizNXnFOL5 nszMOOry3tRFdDZI XKJCm UbGBKbq1mkbp2gS1nse3PxAoO/BE9wdeUBraFpD0 AJLoRgsWRvcXpe9pBT4LulFJhmTmnmmFZO aeWUdk6BxVl2X5JTOtCp9BUHXLHpHw/ltxmwgstuP/Km6lzNrf8FAAD//wMAUEsDBAoAAAAAAAAA IQDbVWE0FT4AABU AAAbAAAAY2xpcGJvYXJkL21lZGlhL2ltYWdlMS5qcGVn/9j/4AAQSkZJRgAB AQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwc KDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADMAaYDASIAAhEBAxEB/8QAHwAA AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpT VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 usLDxMXGx8jJytLT1NXW19jZ2uHi4 Tl5ufo6erx8vP09fb3 Pn6/8QAHwEAAwEBAQEBAQEBAQAA AAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEI FEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVm Z2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 Pn6/9oADAMBAAIRAxEAPwD2 vZLeVUiRWO0s2TUM p 3EdwUjgDKJAu4nA249fr/Kr8tskxBcKcHIBUHn8aabOM5yFOc5/drz lAFiimbH/AOep/IUbH/56 n8hQA imbH/56n8hRsf/AJ6n8hQA imbH/56n8hRsf8A56n8hQA imbH/wCep/IUbH/56n8hQA i mbH/AOep/IUbH/56n8hQA imbH/56n8hRsf/AJ6n8hQA imbH/56n8hRsf8A56n8hQA imbH/wCe p/IUbH/56n8hQA imbH/AOep/IUbH/56n8hQA imbH/56n8hRsf/AJ6n8hQA imbH/56n8hRsf8A 56n8hQA imbH/wCep/IUbH/56n8hQA imbH/AOep/IUbH/56n8hQA imbH/56n8hRsf/AJ6n8hQA imbH/56n8hRsf8A56n8hQA imbH/wCep/IUbH/56n8hQA imbH/AOep/IUbH/56n8hQA imbH/5 6n8hRsf/AJ6n8hQA imbH/56n8hRsf8A56n8hQA imbH/wCep/IUbH/56n8hQA imbH/AOep/IUb H/56n8hQA imbH/56n8hRsf/AJ6n8hQA imbH/56n8hRsf8A56n8hQA imbH/wCep/IUbH/56n8h QA imbH/AOep/IUbH/56n8hQA imbH/56n8hRQBxPiy2tbnxXai7MJRdPkKJM3yli47d M n1rJh 0/Ro9Ru/OtbZ1Z4WGyRSFI5YDnpnsOMDGfXu9S0LStYukfUbCC5aOMhGkXJUE8iqv/CFeGv gLaf 98V0060Yx5Wv6uc86MpSumeaa5p9nHq0v2eC38pgGXyDlTn09PpWd9jh/wCeA/KvXP8AhCvDX/QF tP8Avij/AIQrw1/0BbT/AL4rpjjYJJcpzywc278x5H9jh/54D8qPscP/ADwH5V65/wAIV4a/6Atp /wB8Uf8ACFeGv gLaf8AfFP69T/kF9Sn/MeR/Y4f eA/Kj7HD/zwH5V65/whXhr/AKAtp/3xR/wh Xhr/AKAtp/3xR9ep/wAgfUp/zHkf2OH/AJ4D8qPscP8AzwH5V65/whXhr/oC2n/fFH/CFeGv gLa f98UfXqf8gfUp/zHkf2OH/ngPyo xw/88B Veuf8IV4a/wCgLaf98Uf8IV4a/wCgLaf98UfXqf8A IH1Kf8x5H9jh/wCeA/Kj7HD/AM8B Veuf8IV4a/6Atp/3xR/whXhr/oC2n/fFH16n/IH1Kf8x5H9 jh/54D8qPscP/PAflXrn/CFeGv8AoC2n/fFH/CFeGv8AoC2n/fFH16n/ACB9Sn/MeR/Y4f8AngPy o xw/wDPAflXrn/CFeGv gLaf98Uf8IV4a/6Atp/3xR9ep/yB9Sn/MeR/Y4f eA/Kj7HD/zwH5V6 5/whXhr/AKAtp/3xR/whXhr/AKAtp/3xR9ep/wAgfUp/zHkf2OH/AJ4D8qPscP8AzwH5V65/whXh r/oC2n/fFH/CFeGv gLaf98UfXqf8gfUp/zHkf2OH/ngPyo xw/88B Veuf8IV4a/wCgLaf98Uf8 IV4a/wCgLaf98UfXqf8AIH1Kf8x5H9jh/wCeA/Kj7HD/AM8B Veuf8IV4a/6Atp/3xR/whXhr/oC 2n/fFH16n/IH1Kf8x5H9jh/54D8qPscP/PAflXrn/CFeGv8AoC2n/fFH/CFeGv8AoC2n/fFH16n/ ACB9Sn/MeR/Y4f8AngPyo xw/wDPAflXrn/CFeGv gLaf98Uf8IV4a/6Atp/3xR9ep/yB9Sn/MeR /Y4f eA/Kj7HD/zwH5V65/whXhr/AKAtp/3xR/whXhr/AKAtp/3xR9ep/wAgfUp/zHkf2OH/AJ4D 8qPscP8AzwH5V65/whXhr/oC2n/fFH/CFeGv gLaf98UfXqf8gfUp/zHkf2OH/ngPyo xw/88B V euf8IV4a/wCgLaf98Uf8IV4a/wCgLaf98UfXqf8AIH1Kf8x5H9jh/wCeA/Kj7HD/AM8B Veuf8IV 4a/6Atp/3xR/whXhr/oC2n/fFH16n/IH1Kf8x5H9jh/54D8qPscP/PAflXrn/CFeGv8AoC2n/fFH /CFeGv8AoC2n/fFH16n/ACB9Sn/MeR/Y4f8AngPyo xw/wDPAflXrn/CFeGv gLaf98Uf8IV4a/6 Atp/3xR9ep/yB9Sn/MeR/Y4f eA/Kj7HD/zwH5V65/whXhr/AKAtp/3xR/whXhr/AKAtp/3xR9ep /wAgfUp/zHkf2OH/AJ4D8qPscP8AzwH5V65/whXhr/oC2n/fFH/CFeGv gLaf98UfXqf8gfUp/zH kf2OH/ngPyo xw/88B Veuf8IV4a/wCgLaf98Uf8IV4a/wCgLaf98UfXqf8AIH1Kf8x5H9jh/wCe A/Kj7HD/AM8B Veuf8IV4a/6Atp/3xR/whXhr/oC2n/fFH16n/IH1Kf8x5NFbW8cqM8C7AecqSMf SmyQ201zPJFahIvMOxdp6V63/wAIV4a/6Atp/wB8Uf8ACF Gv gLaf8AfFL69TvfkH9Tna3MeD N Fhh0qBrNmDGYbikbR7flbjPf/wCtRXtuo CvDBt1DaHZON44aPI6GiuepiIzldI3hQlFWbOl/wCX j/gH9apa7qT6Rotzfx25uHiUFYwcZJIHJ7AZyT6A1d/5eP8AgH9apa3odl4g082N jPblw5UY5I6 dQaxo8ntI 0 G vodDvbQ5G/ JT2GnQTPo7vcSyzIEjl3IypGH3K2AW 8o6Do3oM9N4e1yXXPDUO rNZmJ5FZhCrg7sEgYJx1x3qgngLR44TEpnCGQykfISWPBOduegx9OK1tJ0Kx0fTX0 1izauzM0bK uPm6jAAGPau3FTwbpWoxtK u2vn6Ex5r6mcfGVhL4f1HVbSOWX7BkTQMNpDcfLu5B69VJFQQ Pd MERN7HLbOjMs4Cllhw7ou7gEbihwMZ9QK37nTba50xtP8tY7Zl2bERcBfTBBGPwrNTwpZxtEyTSh ot3lnyocrnOcfu T dZUHhvZ2qp3v8Ahb5jd hnjx9YtrNnYLbzA3SsqqwAk8z5Cq4zjBV92c 3 XiooviFb ZEt1p81sSX 0RuSJLYLG0hLoyg9EP3cg84JrTHhGwWNYxJIEX7q VDgchuP3fqAfwHp Sr4TskVVWaUKrb1Hlw8NjGfuehI hro5sBb4X9789f8AgeW4veuVJPH2kQlxLFeIYonlmBhz5Krj 72D33LjGfvD3qKTx9arfwwrYz Q4UySyZQx5aRemMdY/73O4YzWjH4Vs4Y9kc0qJsaMqIocFGOSv r6E84pB4TshLHKJpvMjGEcxxEr1PXZ7n8zUp4FdH97/AMg94is/Guk301tHELgfaHCI8ke1AxRH ALE4yRIuB1POBxVw IrKPxCuhziWK8lUvCCoZZVAyTlSduP9rHtmobXwnp9nJC0LOoikEioI4gu7 jnhOuABnrxWxHbQQyyyxQRpLKQZHVAGcjpk965cR7HmXsb28ylfqZCeIkbxReaJsVnhtxNG4JG9s ZaM5GNwBRuOziuZtfiet7pV9eQWMLm105rsqJyMuhYMmCoPGFPTIDjI5GelbwtaFAgublUWZp1A2 cSHOWztzk5I5PI46VTfwBormUkSjzVKSbRGu5SFBHC/7Cf8AfIrspSwC/iJvbv03 /8AAl83Q5zR fiudV8O32qNYW6PbrGBELjhXYuMOSOBhAc992MV2XhfX18R6Ml8EjicswaJHL7OflBOBztwSPes 1 H2iWNpNaWnnwW8wCyxRlQJADnDfLyPrW1pOjwaNbvBbSStEzF9sm04YkknIAJJJ5zmjG1MDOMv q8WnfTfa233/APDhFS6lS08UWV5JqFuiSpeWEZkngcDgc4wwJU5we fUCsPTviXp1zaCW8tJ7WQg OY1 fbEY43MhyFIUeYo6c9sjmuxis7a3tzbw28UcJzmNEAU568D1qmnh3RYo4400myVI3EiKIFwr AAAjj0AH4CvLRZzV78TdItZLIpHK0E82wsy4ZlKybGQdwzRlecY6nFVR8V7CPVpbG50y7hEM91FL JncAIc4IwPmLkMAAeNpzXYHQNHZZFOlWREjM7gwKdxYEEnjuCR J9aJtC0qa1Ns2n24i/eYCxgbS 4Icj0JycnvmgDnp/iNYCKb7Lp97LPCAZEdQioTOYcM2Tg71boD0qaHx/ppvfsFxb3KXyzPDLFDGZ QhV9m7I5Kk gz6gVrWnhfRLGwNlDplv5DLscSJvLjcX YnJPzMW57mrA0XSwIQNPtgIQRHiMDaCc nH1PP1oA5d/iNazSKtpZSmMxQyNLMwGzfOsWxlBLKw3dD074qaL4laDNaxzgXah3RQhiG8BgpD4z nbh1ye3ftW NA0cFSNLs8r0Pkrn7wb0/vAH6jNNPh3RCqKdIscIQVH2deMAAduwA/IUwObtfiPay yR/aLGaHzYi0cC4eVmEkqnGPlxiFj1zx9MuuPiVphtrqTT7ee6eDaQH/AHSyKXjQlW56GVOoHWuj bw9ozpIjaVZFZDlwYF5 Yt6epJ pPrRL4f0acOJdKsnDnLZgX5uQeePVVP4D0pIbsc1efEqwgnSK 3s7mUpctDOCu0hFEwZ05 bDQMOcetWx8RNBZk2NcskrhIXEXEp3bSV5zgHg5x7ZrZl8OaJMpWXSL F1JyQ0CnJyx9PV2/76PqadJoGjzed5ml2b eVMuYV cjpnjtQBgRfErQ52CRR3rO wRL5I/es3lY Uc9f3ydcDk88VSs/ibbm0tbnVLB9PgmtBc bIWKyfuy7CIhcOVxggkHrxiur/wCEe0bYU/smy2kY I8heny 3 wn/AHyPSli0DR4ceXpdmgCeWAIVwFxtxjHTHH0oEYg IWkb9pttQAWLzpnNvhYU8wpu Y56ZBORkY5os/Hdle6qbOKCaTzghtVjT55VKuxY5wAuEyOeQRW8mi6XHHIi6fbBZIjC48ofPGc5Q q8njpzSNoekuFDabaEKEC/uV4CAhccdgSB7GgCroHifT/EqTyaeJzHER88kRVXBzgqe44PuO4Fb NV7WwtLLzPsttFB5hy3lqFyfw p/OrFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFAFTUP Pdf98fyNFGof8e6/wC P5GigCf/AJeP Af1qtqsUtxp8ltFEHaceXlvuoD1Y/QfrirP /Lx/wD tVri4aIXUzzrFBbruY7N2AFyTTSA5jWtO8QTQ2yWsUkskUMlrLJ5 0SK FEgG4ZIHzEHH I4NY9x4f1 68Sw3xtJEhK27Sq8m/aUClwCWznIIB6n8a6ZfF mPYR3w1GQ2skZkjl xvhwGCnHHU Ejir2jaxb ILE3mm3/nQBtu425TnAPRsdiKLeYjlU0bxAl1rMzxs32m3lVJFkfcSSMbV3DaSRng4 AAxjNUdH0vxZbidZ7e5Ug7hJ55Yj5WB27nbnLdBjOOo4NemQOZLeJ2xuZATj3FSUhnOaFaajaeDv swkuvt6xEK9wq79 0ds7eue KqPB4vYKEmEeYAOCjFW5zknv0IwCO3vXXUUAczeWviTzGW3mV44Z MROxTfIhRiW5HDAkKO3GTVjTY9dXWGN25Nh5WI1bYTnC43EH72d2cDB4reooA4uOx8VpcSTpI6vK 8fnFnRiSqnJQZACZPQ84xT5rDxNLcPI0kzAGZY1EsYUhtpUsvIKjBHXPPQc12NFAXOSng8WRWLLD KZrh1VgxkjHlyfPkYwAU 5 vWoo7DxNbq4WWZ X3MZYzI2XcrsJHC8pw3YEDtXZUUAcybbxGtpfG S4Mk0ltcCNUZQFlz 62cAjjPU lVvDOmatY6isl4boKySh1kmLoi78RqMs2SACc8n5uSa6 igDmJ NN1w6yXWZ/sXn7APPP8AqWPmM2P7wYbB/smqIsfFj3EM80rGePeoZHjVAWKckZJaP5W4wGFdrRQt AOc1Sy1dtYkudOyWMJWNp3/dxttbGAGznJGQVI75FQ28HihbeWZ5i88aL5MEhRVc7m3byM87duDn t9a6migDlWtfE8S3aRzbm byHBjCkbzksMZ3lcY7A9aZrWnaxf6FY2yy3634O6V7eRYgQDnDHdgH p69D0zXW0UAeb6n4f169uIms5LtYkjtkJuS5ZnDksxHmYx3PsQBmu6t/tV5bXUN7bm1HmPFG0U2S 8fQPkfdJ546ir1FAHnh0jU30yRIrO9t7zzIiTC7Kh/eAt1lOThcluntzVXTPDGvto0FjKk9pIk0m T552g7o8NuVgSCqt fTPNem0UAeYXmgeLlnhkthMYogm7F44ZwiKuNu/rndzk5ArbOla1HC7xWki XQW4JmXUGYyFlfYNp4HJX6YrtKKAPPr/AEXxJCJLWylvJk3iXzBcthXPmNlSzgnaxT2OBkHmui0u z1Kz0K t4XcXIZhaNdOX5CKMnJJwXDHB9a36KAOUgtvFewSNdYkQKEjk2bTkvu34yTgbMYIqpZ23 ieHUnVPtSJK4m3TyROgPyht5A9AcBenBNdtRQByUVn4olmtxNcNFHuxK 6Myhfl3YIBGCQ2O MZp YNM12TRNRgvJJZL2aSORCZl2D7pYLjleQcjp6V1lFAHHpY JWnt/OlmEMLwsVgljTICkMoHcZOTn HTgdKdDa LWRjPdbZEDsAnlhXf5do5ydh bjg111FAHNWNv4lbU0 3XO21WZmfy9mGXnaB1O37uR weK5680TxJMdTlxeedIXFsouPlYl2yx fAHlhVwcDpgA5NejUUAeUx GNYt/D01nLY3hu44njthE Y2BTepAd87mOQe/AFb/gWx1fRNNjsptNm2SXL c88wBiQINrDqXyQAemK7eigAooooAKKKKACiii gAooooAKKKKACiiigCpqH/Huv P5GijUP8Aj3X/AHx/I0UAT/8ALx/wD tU7u0F/a6nZFzGLiMx bwMldyYz tXP Xj/AIB/WmQ/8fNx/vL/AOgimuojkF H3labdWUd/CwuA26aWzDSKSwIwwYYAx09 Tn2ra8MeHz4c0 a1 0JPvlMgdYth5HQ8nOO1blFIZVtbiAWkIM0YIjXI3D0qX7TB/wA94v8AvsU/ Yn91fyo2J/cX8qegtRn2mD/nvF/32KPtMH/PeL/vsU/Yn9xfyo2J/cX8qNA1GfaYP e8X/fYo 0w f894v xT9if3F/KjYn9xfyo0DUZ9pg/57xf99ij7TB/z3i/77FP2J/cX8qNif3F/KjQNRn2mD/n vF/32KPtMH/PeL/vsU/Yn9xfyo2J/cX8qNA1GfaYP e8X/fYo 0wf894v xT9if3F/KjYn9xfyo 0DUZ9pg/57xf99ij7TB/z3i/77FP2J/cX8qNif3F/KjQNRn2mD/nvF/32KPtMH/PeL/vsU/Yn9xf yo2J/cX8qNA1GfaYP e8X/fYo 0wf894v xT9if3F/KjYn9xfyo0DUZ9pg/57xf99ij7TB/z3i/ 77FP2J/cX8qNif3F/KjQNRn2mD/nvF/32KPtMH/PeL/vsU/Yn9xfyo2J/cX8qNA1GfaYP e8X/fY o 0wf894v xT9if3F/KjYn9xfyo0DUZ9pg/57xf99ij7TB/z3i/77FP2J/cX8qNif3F/KjQNRn2 mD/nvF/32KPtMH/PeL/vsU/Yn9xfyo2J/cX8qNA1GfaYP e8X/fYo 0wf894v xT9if3F/KjYn9 xfyo0DUZ9pg/57xf99ij7TB/z3i/77FP2J/cX8qNif3F/KjQNRn2mD/nvF/32KPtMH/PeL/vsU/Y n9xfyo2J/cX8qNA1GfaYP e8X/fYo 0wf894v xT9if3F/KjYn9xfyo0DUZ9pg/57xf99ij7TB/ z3i/77FP2J/cX8qNif3F/KjQNRn2mD/nvF/32KPtMH/PeL/vsU/Yn9xfyo2J/cX8qNA1GfaYP e8 X/fYo 0wf894v xT9if3F/KjYn9xfyo0DUZ9pg/57xf99ij7TB/z3i/77FP2J/cX8qNif3F/KjQ NRn2mD/nvF/32KPtMH/PeL/vsU/Yn9xfyo2J/cX8qNA1GfaYP e8X/fYpRcQEgCaMk9BvFO2J/cX 8qgvEUWzEKvVe3uKFZhqN1D/AI91/wB8fyNFGof8e6/7/wDQ0Uhk/wDy8f8AAP60yH/j5uP95f8A 0EU//l4/4B/WmQ/8fNx/vL/6CKa6iJ6ojVIiAfLk591/xq9XNsAUUEZB2gj8RVwinuKTsa/9pxf8 83/Nf8aP7Ti/55v a/40w2tvn/URf98CuavtdFl4hXSW0mAvJhozvTLoSqr34JO/g g96doiuzqP 7Ti/55v a/40f2nF/wA83/Nf8a5S28SW91rcunJp1oNr WjmU/MwYhsfJg88AZ5IPtUGm Jkur62 tJbK3aSe68j5LZ4xGBuzksTluBwOnvStEep2X9pxf883/Nf8aP7Ti/55v a/41l397ZWDzq9kr T am6OAoyA23H1qhPr1tbQyTS6QBGTMsDBlPmtETkHj5chSR1otEV2dH/acX/PN/zX/Gj 04v eb/m v NYcWpxNqkWnSaSkdwZTHL86kINhdWBx8wIBHYgitkWtvn/AFEX/fAp2iF2P/tOL/nm/wCa/wCN H9pxf883/Nf8axLNFPloVBT7Q42npje1bH2W3/54Rf8AfApuEUCk2P8A7Ti/55v a/40f2nF/wA8 3/Nf8ao6g1rYQRytBbgPPFFlwABvcKT AJP4U3SpbXU9MivBbwfOWGEXI4Yj lK0QuzQ/tOL/nm/ 5r/jR/acX/PN/wA1/wAa59tatDHZmHS1kku445I0LKoG99oBOD060w67bjziujFhaxvJdjcgaLYx VgB0foT1GR78UWiF2dH/AGnF/wA83/Nf8aP7Ti/55v8Amv8AjXPXWqKuh3l/b6fbq9vdCBVkG8ON 6ru4xj72QKpaf4ga605rqbT7JFjjjeQqG UsGIG0jJOACACcg9utFohdnXf2nF/zzf8ANf8AGj 0 4v8Anm/5r/jXGQ KjNo95qR0SFI7RVkkQuufLZWIPOMnhRj1Jp114qhtdJhvG0u2LSuyqPM4wvLn 5Qx4Ab05A9aVoj1Ox/tOL/nm/wCa/wCNH9pxf883/Nf8ao6c0F/Zi4 yW6AsyjYd4ODg87Rg5BGM dqt/Zbf/AJ4Rf98CnyxFdj/7Ti/55v8Amv8AjR/acX/PN/zX/GsR0Vbi RVAUTAbR0 6lbBtbfJ/ cRf98Cm4RQKTH/2nF/zzf81/xo/tOL/nm/5r/jTPskB6W8RPYbRXB6Z40kv/ABDc6cdGsysQcqI8 722hiRkjH8PpzUtRQanf/wBpxf8APN/zX/Gj 04v eb/AJr/AI1w k MY9WgmlGkxw XEXRRBJKZ iPQhQABwOecmrnhzxHHrt7NFJp1vbwxx7vMMbjkD5hyuODkdexotEep1n9pxf883/Nf8aP7Ti/55 v a/41zN54gtrTw0uqrpqySmdLfyAmCWLAZA64KkMPYiuft/iADpUl7c6HaqVkjRUjfOdyMxySBj GzH4jNFohqejf2nF/wA83/Nf8aP7Ti/55v8Amv8AjWVodxFq1pJM9rChWTYAIsDoD1JO7r149McV nxeI9OlmSFdMbzHRMAhf9Y0mwx/7y5BPtTtEV2dL/acX/PN/zX/Gj 04v eb/mv Nc5FrtvMjbNJ i87zkhWB5VWQFmwN6lcp69x71c06/s9RupLYWAimiVjKrBTtZX2Fcjr659DQlFhdmv8A2nF/zzf8 1/xo/tOL/nm/5r/jTPstv/zwi/74FRz2tv8AZ5f3Ef3G/hHpRyxC7J/7Ti/55v8Amv8AjR/acX/P N/zX/GsW15s4P uS/wAhUtV7NBdmr/acX/PN/wA1/wAaP7Ti/wCeb/mv NZVFHs0F2av9pxf883/ ADX/ABo/tOL/AJ5v a/41lUUezQXZq/2nF/zzf8ANf8AGj 04v8Anm/5r/jWVRR7NBdmr/acX/PN /wA1/wAaP7Ti/wCeb/mv NZVFHs0F2av9pxf883/ADX/ABo/tOL/AJ5v a/41lUd6PZoLs3oJluI VlQEK3TNMvP PVvqv8xUemf8g6H6H ZqS8/49W q/wAxWVrSK6Eeof8AHuv /wD0NFGof8e6/wC/ /Q0VIyf/AJeP Af1pkP/AB83H 8v/oIp/wDy8f8AAP60yH/j5uP95f8A0EU11ET1zTuFjDAFsbTt XGTjHSulqH7Jbf8APvF/3wKqEuUTVzK/tiLP/Hrd/wDfC/8AxVZzrYPPJP8AZ9SWVm3q6sAY2PBK /NxkcHrxx0rpvslt/wA 8P8A3wKPslt/z7w/98Cq5o9hWZzhbTTdrdHT7vzVYsDxgMSWLY3Yzk5q vbWumWjK0dtqZYXH2klnB3yc8kbsfxHpiur yW3/AD7w/wDfAo yW3/PvD/3wKXNHsFn3OevJNOv 5Ee5067dlG3sNy5B2th/mGQDg5FQNBpDedv0y8YTBwwZiQoc5fb8/wAuT1xiuo yW3/PvD/3wKPs lt/z7w/98CnzR7Bys5qIaZDPFOlhfedFI0okZyzFiu0liX b5eOc4FaA1iLP/Hrd/wDfC/8AxVav 2S2/594f BR9ktv feH/vgUc8ewcrObt5DDGkrROSJmcoMbsFyfXHQjvV7 2Iv fW7/AO F/wDi q1vslt/z7w/98Cj7Jbf8 8P/AHwKbqJ9A5WYF7c2eoRqlzZ3jIuSAAoGSCM/e9CfpmnWt3aWRl z 2d5GkjBjGFXapAA UbuOAM1u/ZLb/n3h/wC BR9ktv8An3h/74FLnj2CzOX z6OFKrpt6uSpBVyC m0llCkPlQCScDA5oa20ZggOl3e1VKFQ2A4LbiHG/58tyd2c11H2S2/594f8AvgUfZLb/AJ94f B RzR7Bys50NpgglgbTLmSGWb7Q8coDhpMhs4LHuAcdKrw2ujW9vDBDpd2ixYKkY3HGcZO7nGSB6Dj pXVfZLb/AJ94f BR9ktv feH/vgUc8ewWfc5OKy0e3Qrb6fewAlD 62r91do/i9Cffk1OV002xt zZXxgwwSPIxEGUqQnzcDBPHvXS/ZLb/n3h/74FH2S2/594f BS5o9gs 5iwaha2sIihsrpEBJxt U8kkk5LepNSf2xF/z63f/fC//FVrfZLb/n3h/wC BR9ktv8An3h/74FPnj2DlZzZkMjXc3lOoeTc qNjcQFUevse9XzrEWf8Aj1u/ F/ KrV yW3/PvD/wB8Cj7Jbf8APvD/AN8Cm6ifQOVmSdXjwf8A Rbse4Vf/AIquetNB0Kyv2vobXVvtDcMzSg7uCOefc12/2S2/594f BR9ktv feH/vgUuaPYLM5a 2ttIs2LQ6deqzJsY5HzDABzhv9kfr60y1s9Jsomht7PUkhcYki3jbIOwYbugHHGOOK6z7Jbf8 8P /fAo yW3/PvD/wB8ClzR7BZ9znLlrC7Mpks74CUKHCBQCVIKtjd1GAM nFUl0vQo7eSCHTLyCOQq z TtUlhn5s7upyc tdh9ktv feH/AL4FH2S2/wCfeH/vgUc0ewWfcwLG4s9OjeO2tb4Rsxcq21gG PLEZbqSST6k1CsejpcrcLpM4mW5a7Vto4lZdrN97uPwrpfslt/z7w/8AfAo yW3/AD7w/wDfAp80 ewWZy32bSMf8g/UC3y7XMrFkCncAreZlQDzgVJGulwyxSQ2F9E8Q2gxuV3AtuO7D/Nk5JznOa6X7 Jbf8 8P/AHwKPslt/wA 8P8A3wKOePYOVmT/AGxF/wA t3/3wv8A8VTZdWjeGRVtLrLIQPlX0/3q 2Pslt/z7w/8AfAo yW3/AD7w/wDfAo549g5Wc9bjZbQoxAZY1BGe4FSZHqPzrd yW3/PvD/3wKPs lt/z7w/98Cn7RBymFkeo/OjI9R dbv2S2/594f8AvgUfZLb/AJ94f BR7RDszCyPUfnRkeo/Ot3 7Jbf8 8P/fAo yW3/PvD/wB8Cj2iCzMLI9R dGR6j863fslt/wA 8P8A3wKPslt/z7w/98Cj2iCz MLI9R dGR6j863fslt/z7w/98Cj7Jbf8 8P/AHwKPaILMwsj1H50uRnqPzrc yW3/PvD/wB8Cj7J bf8APvD/AN8Cj2iCzItM/wCQdD9D/M1Jef8AHq31X YqZVVFCqoVR0AGAKhvP PVvqv8xWd7yuPo R6h/x7r/AL/9DRRqH/Huv //AENFSMn/AOXj/gH9aZD/AMfNx/vL/wCgin/8vH/AP60yH/j5uP8A eX/0EU11ET1yEPiq/fxHJpbJYt5bsG2seQATgHPLcEYx1U9BiuvrAfQtQeZ5DqkG5wQSdPjJIOeC c89T Zq6bjrzEz5tLHM2fxDv7iK/MlnbpJbWn2hRg4Y5QADnJ6txgdBVq38b6lPaPLDYRTyC6SBI lBViCHyep7qOnTmtY F7gsGN7ZlgCAf7MiyAeT/IflQnhaeNSqXlkoOOF0yIdOn5ZP51s5Uu35mK jV7/AJF/w7qtxrGlLd3NusDl2UBScEAkZ5H Na1YVvoup2kfl22rwwpnO2OwjUZ gNS/2drf/QeH /gEn NYyUW7p/mbRcktV RsUVj/2drf/AEHh/wCASf40f2drf/QeH/gEn NTyrv f Q Z9jYorH/ ALO1v/oPD/wCT/Gj ztb/wCg8P8AwCT/ABo5V3/P/IOZ9jYorH/s7W/ g8P/AACT/Gj ztb/AOg8 P/AJP8aOVd/z/wAg5n2Niisf ztb/wCg8P8AwCT/ABo/s7W/ g8P/AJP8aOVd/z/AMg5n2Niisf ztb/AOg8P/AJP8aP7O1v/oPD/wAAk/xo5V3/AD/yDmfY2KKx/wCztb/6Dw/8Ak/xo/s7W/8AoPD/ AMAk/wAaOVd/z/yDmfY2KKx/7O1v/oPD/wAAk/xo/s7W/wDoPD/wCT/GjlXf8/8AIOZ9jYorH/s7 W/8AoPD/AMAk/wAaP7O1v/oPD/wCT/GjlXf8/wDIOZ9jYorH/s7W/wDoPD/wCT/Gj ztb/6Dw/8A AJP8aOVd/wA/8g5n2Niisf8As7W/ g8P/AJP8aP7O1v/AKDw/wDAJP8AGjlXf8/8g5n2Niisf zt b/6Dw/8AAJP8aP7O1v8A6Dw/8Ak/xo5V3/P/ACDmfY2KKx/7O1v/AKDw/wDAJP8AGj ztb/6Dw/8 Ak/xo5V3/P8AyDmfY2KKx/7O1v8A6Dw/8Ak/xo/s7W/ g8P/AACT/GjlXf8AP/IOZ9jYorH/ALO1 v/oPD/wCT/Gj ztb/wCg8P8AwCT/ABo5V3/P/IOZ9jYorH/s7W/ g8P/AACT/Gj ztb/AOg8P/AJ P8aOVd/z/wAg5n2NiiqdhbX1uZPtl Lvdjb 5Ee316dauUnoNGfea5pmn3C293dpFKwBVWByckD0 9SPzpW1rTUlMbXkYYHaTzgHjgnoDyOOvNc/4jtDd6wsrtqG62VTbGCwMiI25XJLfxcovHHf1pHnb 1WvY4NTAbysxvp0pAKkliACFy2epHHWtVTi0mZubu0bieJNIkcot6hYByflbouS3btg/lU9lrGn ajK8VneQzSIoZlRskA968 tdAS2u5pv Jk6zJIjqdKk6OGz/ABY6t n41r6DDBod3LMljqDK8SJt TT5RgjqeSevWqlSgl7rJjUk3qdvRWP8A8JDF/wBA3Vv/AACf/Cj/AISGL/oG6t/4BP8A4VjyS7Gv PHubFFY//CQxf9A3Vv8AwCf/AAo/4SGL/oG6t/4BP/hRyS7Bzx7mxRWP/wAJDF/0DdW/8An/AMKP Ehi/wCgbq3/AIBP/hRyS7Bzx7mxUF5/x6t9V/mKfbzC4t0mCSRhxnbIpVh9QelMvP8Aj1b6r/MU luN7Eeof8e6/7/8AQ0Uah/x7r/v/ANDRSGT/APLx/wAA/rTIf Pm4/3l/wDQRT/ Xj/gH9aZD/x8 3H 8v/oIprqInqgiap/bkjvLbnTDEAkYU YHyckn0q/WH4ouBaaetwYjMIt8nlbiA5CMQOOetS0O 5zt0viKa61YQx6gk8sUy2 ZXVY22ja3A8sjgAbTkc5yea1fCFvq9ubhNSF1s/gErgqDwTgde/Y44 NUoNXsQkqXWlyLPAXM6ozDy412/OQxB53jjrTLzX9ItEileyeOBpBh3YnfGSy7lAPB3ADBx1z9J5 0FpHc0VwM2vWttfNbz6MY1S5Mcj cxCxBCxbjgtuBXaD75q6dSstsqjRpxPGrsyNMMKqor5JDejj gZPWj2kdwszsaK4Y6xaWbJBf6XvupY45YUtHeTeGDHHOCCAjfXipn1SxNwYLfSJmlEsaeXLL5TFW ONwVjnHP0p86vYNbXOzoriodZ0qRN76dIkYyGlMoChtrMF5bPRTz0pia3YShpF0mVYIwBK7yEGNv N8sgrnJ9c0udBZncUVxp1fTNqbdJuWkkUSxp5gy0RRnD53YHCNx1zTBqtlG0xk0xniV3ZGikOfKV I3LsGI5xIOBnpR7SIWZ2tFcZDqdlkRT6XJ50s0kdsEk4m2ylO7fL2649qkXVtFaze5FlNsQ4Izzn y2cj73YKR9faj2kbXCzOvoribvVrKO3lEOkyfa4xukjkl4jXKfMSG54deBzSNqtnaSzLf6d5Lb9k NupkMkmXCKQcbWByDlScZFHOgszt6K57R7q3ub9TbWFxbKqYdpjg5Khtu0nORn0roapNNXQBRRRT AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKjjnimd0jkVmjOHAPQ1JUccMUTO 0caqznLEDqfegCncaj9n1e2tGClJ1PIHKNzjJ6YOCB7isW 8VzWd3dQtZMBBOqDeQCy4OehOBgbt xwMEU6/ltLaW6jn1mGFJZCXEkG7B6j5s9uMenbFF14XRvmm1JYmlYqXWPY0hfggtuyc nT2r0aUK EbOp1XZ/15ENvoUdV8b3OmTeU1pDu 0PHgsxIAxgHjAPPPbBHrWxdaxqCJdS29taeVBOsP72Vgxy VycBf9r1rNvdC0 7jM0 r2YUh2MiRKufmAZshuTkAe3SntYadPcqz6ppj3FywlVjaxl3bOAQc56r j8K1ccM1G0dt9H/XcWp1tFRQyo8AcTJIFyGkBGCRwfpyDVaHWdMuLk28V/bPMGChBKMkkZ45549P Q15ahJ3stjS5eoqpbapZXkxhgnV5AC20egOP8 2DVulKLi7NWAKgvP8Aj1b6r/MVPUF5/wAerfVf 5ihbiexHqH/Huv8Av/0NFGof8e6/7/8AQ0Uhk/8Ay8f8A/rTIf8Aj5uP95f/AEEU/wD5eP8AgH9a ZD/x83H 8v8A6CKa6iJ6qX9hHqEaRyhGQFtyOu5XBUqQR NW6yPEOpT6XZRzQtCoL4dpMEgbSflU soY5A4znrjNIYL4fs1SNBbWe2N96fuM4bjnr7D8h6U9dEtleRxBaBpG3Ofs/3jzyefc/mfWsyPxX PPfmzh00l/OEKtLJ5fYncy4JUcZHXOe1J/wlrPcRBbTy45MqHnk8tFYHDbjtyMMCo9Tj1pcq7Aaq 6PCluIEjtliVtyqIOFbGMjnrjiq m GrfS7d4YTG 8sWaSIEnIAI4IGMKBjHaobPxR9qstSuTYSx iyBOwsNzYzwR/CeM/Q1Qs/GFw03kzWcczM8xWSGUCMqrMAEYgbvu8njqKOVdgNlfD1klqbZLWzWE sGKCDuOAeueBxS/2BZ4kH2a0/eY3/uOuDkfxcc88d6wG8bXIDzGyiMSojpHHKfMc/vA3VcFfkHI6 Z71ZvfF89piD7AhvPMeLyxIzDcANrD5RuGSM9COaOVdh2Zsf2JbeUYvs9n5Z5K/Z DwR6 hI/GmJ 4fs0Ee21sx5ZJTEHQk5J6 oB tZNt4wkYRiS1SRn2ZMUuVbKx5Efy/MQXyQegB5q3D4lkk0e8vJr WO2khhjmUPIzJh13Lkhc8dwAaOVCL0WiW0AIigtEDMWOIO5BB7 hI hpE0K1j8zZb2i ZnfiD72Q Ac89wAPwFQeGdVuNUs5jdupuInCsoh2FQVBGcMwJPXg98VuUcq7AZP8AYFnicfZrP9 cy/uPvHOc 9fXn60HQbNnVzbWZZE8tT9n6LgjHXpgkfQmtaijlXYDKm0O1uWDTW9pIQ24FrfPOAM9f9lfyHpTR 4fsl87FrZjzv9Z/o/wB7nPr688d a16KOVdgKVrpyWjoYxEiKPuxx7c8ADPJ7CrtFFMAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKr28M8cszSz YrtlFxjYPSrFFAHD6np lxJqN7NCL ORpt0bQWwC5wAWztJ4wT7nn0xsatdyX2ky29vbXyXOA0MslqxCyKQyk49wM4rA1dvM 1 6ktdVnjhQgXA27yhBDbhxkAYwMZOe2Mmm6pFfvrPnW2qTKkkW2NVmZup5ydy7egJ6Y49K9tU f kcnsrrT00ZnexPDpz263KiyuZYyYvsyeTJGY8He53DoS WHX3pzQahLFcQzw3Mq3UCwySvA5aMB3 YYGPmIDABjjkZrOvFkOq6tLayA2pBXePl3EhlK5KgtzjoSDnOT27HW9Qtk0mQqyzuSqqkch6k4BO w52jqcdhSqynGUVu5W W39Pv1EkmU9Nv7mwtJreTS7uRRJLJGUjbL7nZgCCAB1x1NUoUaOeWU6PP suVZHiELA24bJO1gPmyTkjjrweKqTDaYreyu7q4Gy2DPNPLGH/esZMk/d4xnvjHar r3dtY GIbO 51v/AE5htieKb5pX/u rDBxz2GTWc0oXkl8T139b/wBf5oaIdF00Wmr2lwYL5WW2WJi1quA/Q/Nt 3bffPSuzrzuzu99lZaX9vuku3lIkF4zBWCqzKUfkLj5enOcZHBrpvCnnrpbxzzLIwmkIxMJCAXbr 8q4/XNYYle1j7ZPy/MqOmhvVBef8erfVf5ip6gvP PVvqv8AMVwrcb2I9Q/491/3/wChoo1D/j3X /f8A6GikMn/5eP8AgH9aZD/x83H 8v8A6CKf/wAvH/AP60yH/j5uP95f/QRTXURPWXqsswurKGO5 e3SQyGRkVScKue4NalUbyze5vbOQY8uLzA/OD8y44pMZhWmtWd3avc/29ewouzPmxxAncNy4wp7A nHUY5xVi4vreAyL/AMJBcyyIFJSNYiSCQBj5cH7wP0NLb EbW2WMxXV0s0SqkcqiNSihWXGAu05D HkgnpzxSyeDtMlga2fzzaEEC33jaMgBjnGeQuOT3PrQBUuNcsbaSZG1 Yx VykEbB/Mcou0hPm5 HOOg56VZ 3WYaRf ElmzGwQgJH1OQAPk5 63T0NS/wDCJ6cY9sgmkYBVjkdgWjVegBx6YHOTgUzS /DstpetPcz70iKraxo3EaKXwCcDP sPr0HNAEFvqsE2S s6hbrsZ42mgjUSKp2kr8nPJHHXkcU b U7OGB5j4kuXRIvNYxxRthfwTr7dakfwhZTQLDcTXM6R58gSFMQ5cPwNuDyB97PAx60p8J2bSbzLO p8kw/u1jj4Ixn5VGfUA5APagBkd/ayTJEPEdwJHbaiskQJPT 5xycc96il1WxTCN4ium3F1wIUOC qhiD8nHBB561eXw1ahpneW5eSZlaRyygkhw eBxyoqtD4Ps7eOVI7m7BlyJGymWUpsIPy85Hfrnn NADIptOtUmWLX2gWMgyLHFCvJIA6JyckDjPPFaNvbS3Vuk8GuXUkUg3KyrFgj/vioYvDNnFJEwku GSF98EZZcRfvBIccZOWUZzn2xWlZWkdhaLbQ7yiliCxBPJJP6mgCD zrr/oMXn/fEX/xFH9nXX/Q YvP Iv/AIir T6UZPpQBQ/s66/6DF5/3xF/8RR/Z11/0GLz/viL/wCIq/k lGT6UAUP7Ouv gxe f98Rf/EUf2ddf9Bi8/74i/8AiKv5PpRk lAFD zrr/oMXn/fEX/xFH9nXX/QYvP Iv/AIir T6U ZPpQBQ/s66/6DF5/3xF/8RR/Z11/0GLz/viL/wCIq/k lGT6UAUP7Ouv gxef98Rf/EUf2ddf9Bi 8/74i/8AiKv5PpRk lAFD zrr/oMXn/fEX/xFH9nXX/QYvP Iv/AIir T6UZPpQBQ/s66/6DF5/ 3xF/8RR/Z11/0GLz/viL/wCIq/k lGT6UAUP7Ouv gxef98Rf/EUf2ddf9Bi8/74i/8AiKv5PpRk lAFD zrr/oMXn/fEX/xFH9nXX/QYvP Iv/AIir T6UZPpQBQ/s66/6DF5/3xF/8RR/Z11/0GLz /viL/wCIq/k lGT6UAUP7Ouv gxef98Rf/EVl316mnXcVtdeInhlmOIkleFGkPooK89R0ro8n0rB v9Ou7y jnfTbCYwSF7eSWXLRnGNw Q7Tj0oGi/os81xp2 eRpHEsibmABIVyB0AHQVoVQ0e1ms9P EVxsEpkdyEbIG5icZwPWr9AgqOOeKV3WORWZDhgD0PvUlRxwRRM7RxqrOcsQOp96AMK6vrFRcSya XBI0d21uSVXLEJv3dPwqmL LdbW7aHYC5uRE8YyCm1w3JOzORt6Y7in6hBYpqspn1e1ikdmdo3iy qnbjLfNgNsOMkA4quNOsEZrYa3B5sQSTO1vMUAfJht cYbgA/wAXvXqwjS5Ve/8A5MZu/Q0NMmtN Qv2t20e0iEcbFztDEOsjIVHy4IypOc/hWbb6qj6ubCXw9AsizBH2xoUAKZ /nGQQc/T1pq3WmaZd Zj1 CGZYlh2LbMSFb5wNuTyd2c4zzzUyadBb3Cx/2/8A6QkxTc0Z3AghmUnd905BIPBzzmq5YRbb Ts1ppL7w1IbPWoLrV2sz4dtghmWJZAmV5zk7tmD91iOmcdfTd1jQrS502UW9jB56DegRAu/HJQkY 4YcfjUaaBOl8Lz7bEZQ27/j34zzzjd1 Y1u1x4qpTk17La2u/wCpUU phuW1nULNZtMmit4C00hu o1wW2lVXqc/fY/hWvDa29sWMEEURbrsQLn8qlorlu7WKCoLz/j1b6r/MVPUF5/x6t9V/mKFuJ7Ee of8AHuv /wD0NFGof8e6/wC//Q0Uhk//AC8f8A/rTIf Pm4/3l/9BFP/AOXj/gH9aZD/AMfNx/vL /wCgimuoiesbxH4jg8N2kNxPA8olk8sBZETnBP8AER6Vs1jeINOt9UjtbW4gMwaUlV84xgEKTkkA 56UkrjMpvH9iNOS7FrMwkaNFRCJDlmZeSmR/CT3/AArrI3EkSSAEBlBweozXLweELa2iRLexWIow KyJfyBhg5Azt6Z5x61ux/bookjW2ttqKFGbhug/4BTsK5doqp5mof8 1t/4EN/8AEUeZqH/Ptbf BDf/ABFFguW6KqeZqH/Ptbf BDf/ABFHmah/z7W3/gQ3/wARRYLluiqnmah/z7W3/gQ3/wARR5mo f8 1t/4EN/8AEUWC5boqp5mof8 1t/4EN/8AEUeZqH/Ptbf BDf/ABFFguW6KqeZqH/Ptbf BDf/ ABFHmah/z7W3/gQ3/wARRYLluiqnmah/z7W3/gQ3/wARR5mof8 1t/4EN/8AEUWC5boqtHNcidI5 4IkDg4KSluR7FRVmhqw7hRRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKr 28U8cszTT YjtmNcY2D0qxRQBxOqQ3J1r7THpVzLH5zGRY4idwC7R1wrZxnPb3qpe6U9xrs2pRWF ygkX7otCpyBkDO0nJYDJz0r0Giu GPlFKy2VieU8x1DQ9Ruru3vYop45bRlkjjNq53sF24yMf3VO fcireoaduuPMt9DvZh9raYjyEwUx0PmKeck9P6DHodFX/aU9LrYXINjYPEjBSoIB2kYI9sU6iivN LCiiigAqC8/49W q/wAxU9QXn/Hq31X YprcT2I9Q/491/3/AOhoo1D/AI91/wB/ hopDJ/ Xj/g H9aZD/x83H 8v/oIp/8Ay8f8A/rTIf8Aj5uP95f/AEEU11ET1SvTturKQg7FkbcQM4 RhV2ihOwM g 1wf89P0NH2uD/np hqeijQNSD7XB/z0/Q0fa4P en6Gp6KNA1IPtcH/PT9DR9rg/56foanoo0D Ug 1wf8APT9DR9rg/wCen6Gp6KNA1IPtcH/PT9DR9rg/56foanoo0DUg 1wf89P0NH2uD/np hqe ijQNSD7XB/z0/Q0fa4P en6Gp6KNA1KpmSa6h8s7sbieDxxVqiihggooopDCiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKgvP8Aj1b6r/MVPUF5 /wAerfVf5imtxPYj1D/j3X/f/oaKNQ/491/3/wChopDP/9lQSwECLQAUAAYACAAAACEAyOEzkhUB AABSAgAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAA IQCtMD/xwQAAADIBAAALAAAAAAAAAAAAAAAAAEYBAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAA IQD/2TJTawMAANQIAAAfAAAAAAAAAAAAAAAAADACAABjbGlwYm9hcmQvZHJhd2luZ3MvZHJhd2lu ZzEueG1sUEsBAi0AFAAGAAgAAAAhAJStDd/UAAAArAEAACoAAAAAAAAAAAAAAAAA2AUAAGNsaXBi b2FyZC9kcmF3aW5ncy9fcmVscy9kcmF3aW5nMS54bWwucmVsc1BLAQItABQABgAIAAAAIQDhUTcf zwYAAOYbAAAaAAAAAAAAAAAAAAAAAPQGAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnhtbFBLAQIt AAoAAAAAAAAAIQDbVWE0FT4AABU AAAbAAAAAAAAAAAAAAAAAPsNAABjbGlwYm9hcmQvbWVkaWEv aW1hZ2UxLmpwZWdQSwUGAAAAAAYABgCwAQAASUwAAAAA 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]--

图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]--

图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]--

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

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

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]--

图8-122 输入入站服务地址

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

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

Service的Struts客户端类

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

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

如下为入站服务的3类WSDL。

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]--

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

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

将上面的9个WSDL文件复制到相应的目录后 就可以创建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 即相应的输出

目标target为bindings1 其他的8个WSDL文件都进行类似的定义

--

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 As】→【Ant 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]--

图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]--

图8-125 “Ant Build”对话框

3 Ant 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]--

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

下面是所创建的exception、dto、Binding和BookStoreBus.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]--

图8-127 创建的exception、dto、Binding和BookStoreBus.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]--

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

客户端对SOA的Web 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 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);

}

}

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

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

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

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

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

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

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

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

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

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

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

5 saveUserInfo 存储用户信息。

调用SOA的Web Service接口saveUserInfo存储用户信息。

6 getUserList 得到所有用户信息。

l 创建一个ArrayList的实例。

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

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

l 返回ArrayList。

7 updateAccountBalance 更新用户账户资金。

调用SOA的Web Service接口updateAccountBalance更新用户账户资金。

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

调用SOA的Web Service接口getUserInfo通过用户名得到用户信息。

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

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

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

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

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

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

12 createOrderItem 创建图书订单明细。

调用SOA的Web Service接口createOrderItem创建图书订单明细。

13 createOrder 创建图书订单。

调用SOA的Web Service接口createOrder创建图书订单。

8.8.4 创建相应的Struts Action Bean类

Struts Action Bean类将模型层和视图JSP关联起来 在Action Bean的execute方法中调用上面的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]--

图8-129 创建相应的Struts Action Bean类

8.8.5 创建相应的JSP

用JSP来实现视图 页面显示 JSP是通过相应的Struts的tag lib和Form 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]--

图8-130 创建相应的JSP

8.9 运行本章的例子

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

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

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

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

3 在RAD上启动Server和Admin Console。

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

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

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

8.10 小结

本章首先介绍了SOA出现的原因在于其能够提供一个整合和监控各种松散耦合 或完全解耦 的各种服务的整合平台。然后详细介绍了如何创建基于Websphere 6.0 SIBus服务总线的SOA架构的企业服务系统。以一个网上书店系统的实例 详细介绍了SOA的实施过程。完成了在Websphere 6.0上建立SOA的网上书店服务体系。在WebLogic 9.1中应用Struts调用SOA Web Service客户端 实现基于SOA架构的Struts、EJB和Web Service的J2EE跨服务器平台整合应用开发。一个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项目实施起到帮助和借鉴作用。

本文链接: http://dtothewp.immuno-online.com/view-740317.html

发布于 : 2021-03-25 阅读(0)
公司介绍
品牌分类
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616
官网:http://