用 WSAD5.0和SQLServer2K采用Meet-in-Middle模式开发CMP实体Bean及其完整客户端(上篇:CMP的开发)

无标题文档

用 WSAD5.0和SQLServer2K采用Meet-in-Middle模式
开发CMP实体Bean及其完整客户端
(上篇:CMP的开发)

abnerchai( 柴政 ) 2004 年 6 月

说明: 在许多情况下,我们现在还常常使用 CMP 实体 Bean ,而 IBM 的 WebSphere Studio Application Developer5.0 (中文版)简称 wsad5 是我们常用的开发工具,同时,我们也常使用 MS SQL Server2k 作为我们的数据库服务器,由于 WSAD5.0 在默认情况下对 DB2 和 Oracle 的 JDBC 支持的较好,但对 SQL Server 支持的不是那么的完美。在这篇文章中,我用详细的文字和清晰的图片给大家演示了如何用 WSAD5 和 SQL Server2k ,采用 Meet-in-Middle 模式来开发一个完整的 CMP 实体 Bean 及其客户端测试程序。本文档由 abnerchai( 柴政 ) 编写,任何人可以发布传播做学习之用,不得用作商业用途。

一、内容介绍

•  WSAD 中 CMP 的开发方法

•  WSAD 中的 SessionBean 的开发方法

•  WSAD 中 JavaBean 和 JSP 页面的开发方法

•  配置简易的 JDBC 开发环境

•  优化 EJB 的调用。

二、 WSAD5中CMP开发方法简述:

在 WSAD5 中,有三种方法开发 CMP 实体 Bean ,一种是采用 Bottom-up 方式:即和实体 Bean 对应的数据库表巳经设计好了,并存在于数据库中,根据数据库表结构来自动生成我们的我 CMP 实体 Bean 。二是采用 Top-Down 模式,即我们在 WSAD 中设计好我们的实体 Bean ,然后让 WSAD 自动根据实体 Bean 中的设置来生成数据库表。三是采用 Meet-in-Middle 方式,就是数据库表己经设计好了,我们先把需要的实体 Bean 设计好,然后连接数据库,把实体 Bean 和数据库表人工映射起来。在本文中我们就采用这种方式,这也是一种常用的开发 CMP 实体 Bean 的方式。

三、开发 CMP实体Bean的详细过程

•  先创建数据库,在 SQLServer 中创建一个名为 HelloWorld 的库,并创建一个用户 abner ,密码为 abner ,并为其指定默认数据库 Helloworld ,然后用以下脚本创建一个表:

create table abner.employee

(

id int primary key,

name varchar(30),

email varchar(50)

)

注意:这个 SQL 语句指定了 employee 表属于 abner ,而不是 dbo 所有。

•  新建一个空目录,用作工作区,如:

D:/chai/myworkspace/wsad5_HelloWorld_all_j2ee_module

•  启动 WSAD5 ,选择上面的目录进入工作区

•  新建一个 EJB 项目,选择文件 -> 新建 EJB 项目,如下图:

选择创建 2.0EJB 项目。点下一步。

按图中所示填写,一个 EJB 项目对应于一个 EAR 项目。点完成。

•  在 J2ee 视图中的 j2ee 层次结构中,选择 HelloWorldEJBProject ,点右键,新建企业 Bean ,如下图所示:

然后在弹出的对话框中, EJB 项目一栏选择 HelloWorldEJBProject ,并点下一步:如下图所示:

然后,在出现的框中填入如下图所示的:

然后点下一步。按如下图所示的选择只创建远程视图

接着在上图中的 CMP 属性框右边点 ” 添加 ” ,如下图所示:

增加以下三个属性:其中把 id 字段选择为 ” 键字段 ” ,以做为主键。

id

int

name

java.lang.String

email

java.lang.String

然后回到上一个图示中,点下一步:在出现的框中,什么也不做,点“完成”。

过一会儿, WSAD 为我们创建了一个实体 Bean.

6 、下面我们来创建数据库表和实体 Bean 之间的映射。

在 J2ee 视图的层次结构中,点中 HelloWorldEJBProject ,点右键,选择生成 EJB 到 RDB 的映射。如下图所示:

在出现的对话框中,选择“创建新的后端文件夹“,点下一步,如下图:

然后,再在出现的对话框中,选择中间相遇:如下图所示:

然后点下一步,如下图所示:

在上图中,我们创建一个 JDBC 连接,这个 JDBC 连接用于 WSAD5 的实体 Bean 创建器和数据库表之间的映射连接。这个连接不提供以后由容器负责的实体 Bean 和数据库之间的同步使用的数据库连接,那个连接需要在测试服务器中去配置一个连接池。

上图中的配置说明如下:

连接名:这是这个临时 JDBC 连接的名字。

数据库:这个实体 Bean 要映射到哪一个数据库中

用户标识及密码:连接数据库用到的用户名及密码

数据库供应商:选择 MS SQL Server 2000

JDBC 驱动请选择: WebSphere Connect JDBC Driver

主机请选择:你的 SQL Server 装在哪个主机上的 IP 地址或主机名。

端口号: SQL Server 默认的 1433

类位置:这是选择 SQL Server2k 的 JDBC 驱动程序的位置, WSAD5.0 自己带的有 SQL SERVER 2k 的 JDBC 驱动,它于:

D:/Program Files/IBM/WebSphere Studio/runtimes/base_v5/lib/spy.jar;

D:/Program Files/IBM/WebSphere Studio/runtimes/base_v5/lib/base.jar;

D:/Program Files/IBM/WebSphere Studio/runtimes/base_v5/lib/sqlserver.jar;

D:/Program Files/IBM/WebSphere Studio/runtimes/base_v5/lib/util.jar

以上 D:/Program Files/IBM/ 是 WSAD5 安装的位置 .

点击浏览,把在以上文件夹中的四个驱动 jar 文件全部选择中。

然后点击下一步。 WSAD 会读出你的 SQLServer 中 Helloworld 数据库下非 dbo. 的数据表,在这里,就是我们开头创建的一个表 employee 。选中它,点下一步,如下图所示:

然后,点下一步,进入如下图所示部分:

在上图中, WSAD 让我们选择如何将实体 Bean 中的域和数据表字段之间映射,我们自己来映射它们之间的关系,我们选择“无”后,点完成,即可。过一会,我们的 WSAd 工作区即出现如下图所示的情况:

•  接着,我们在上图中设置 CMP 实体 Bean 和 employee 之间的对应关系,我们看到在 HelloWorldEJBProject 和 HelloWorld 数据库之间是对应的,因为它们的头上都有一个小的箭头,一个向左,一个向右。接着,我们让 Employee 实体 Bean 和 employee 表映射起来,先选中右的 employee 表,拖动它到左边 Employeep 实体 Bean 上,可以看到鼠标上出现一个小的圆,此时松开鼠标,可以看到 Employee 和 employee 上都出现了两个小三角箭头,表时己经映射了。用同样的方法,将 employee 表的 id,name,email 映射到实体 BeanEmployee 的对应的字段上。此时,我们的工作区将是如下所示:

•  此时,我们需要设置我们的实体 Bean 的一些部署属性,在上图中,双击 ejb 模块下的 Employee 实体 Bean ,将在右边工作区中出现“ EJB 部署描述符”,在下面选中“概述”页面,将拉到最下方,按下图所示选择:

将:后端标识,选择 MSSQLSERVER_V7_1

将 JNDI-CMP 生成器连接绑定下的 jndi 名输入为: jdbc/SQLSERVER2KJDBC ,表示我们我们的所有的 CMP 实体 Bean 在受容器管理时采用 jdbc/SQLSERVER2KJDBC 这个 jndi 数据库连接池中的数据库连接与数据库保持同步。这个数据库连接池我们呆会在创建测试服务器时创建,在这里设置好以后,我们的所有的实体 Bean 在受容器管理时,容器均会采用这里设置的 jndi 从数据库连接池中获取数据库连接。如果我们的每个 CMP 实体 Bean 需要采用单独的对应于不同的数据库连接池的连接,我们需要为每个实体 Bean 单独设置数据库连接池的 jndi 名字。设置方法如下:打开一个实体 Bean 的部署描述符编写器,并选中下面的 Bean 页面,滚动页面到 ”WebSphere 绑定 ” 处,如下图所示:

我们可以在上面的 CMP 容器生成器 JNDI 名称处填写你想用的单独的数据库连接池的 jndi 名字,并选择容器授权类型。

同时,将 JNDI-CMP 生成器连接绑定下的容器授权类型选择为: Container ,表示由容器来管理我们的数据库连接的一些属性。

选择好后,点保存。

•  下面我们就来创建一个测试服务器,用来测试我们的 EJB 。方法如下:

在 J2ee 视图的 j2ee 层次结构视图中,选择服务器,然后点右键,在弹出的菜单中选择“新建” -> “服务器和服务器配置”如下图所示:

将弹出如下图所示的页面:

按上图所示填写,然后点击“下一步”并在弹出的对话框中选择“是”,进入如下图所示页面:

不更改端口,直接点“完成”即可。然后左边 j2ee 视图中出现如下图所示情况:

在上图双击服务器下的第一个 myWebsphereServer 项,在右边工作区中出现服务器配置页面。选择“安全性页面”,并在 JAAS 条目下面选择“添加”,弹出如下图所示的对话框:

在弹出的对话框中填写连接数据库用户的信息,如上图所示。

然后保存,并点击“数据源页面”,出现如下图所示页面:

在上图中,我们针对“服务器设置”设置我们的数据库连接池。首先在“ JDBC 提供程序列表”框右边点“添加”进入如下图所示对话框:

在上图中,选择数据库类型为 MS SQL Server ,并请将 JDBC 提供程序类型选择为:

WebSphere embedded ConnectJDBC driver for MS SQL Server ,一项,

选择其它的 SQL Server 驱动在 WSAD5.0 中将会出错!

然后点击下一步,出现如下图所示画面:

在名称一栏中输入一个名字如 SQLJDBC1 ,为这个 JDBC 驱动起个名字。其它的不变。点“完成”回到主页面。然后,选中我们上面定义的 SQLJDBC1 ,在定义数据源栏中选择“添加”出现如下图所示画面:

选择第一个驱动,并选择 V5.0 数据源,点击下一步,进入如下图所示:

在上图中,填入我们的 JDBC 数据源信息,按如下填写:

名称: SQLJDBCDATASOURCE   为给这个数据源起的名字

JNDI 名称: jdbc/SQLSERVER2KJDBC ,这是我们 EJB 容器使用的数据库连接池的 jndi 名字

在“组件管理的认证别名”和“容器管理的认证别名”均选择我们在安全属性中创建的别名,用它来指定连接数据库的用户和密码。

并将“在容器管理的持久性( CMP )中使用此数据源”选中,使我们的 CMP 实体 Bean 使用此 JDBC 和数据库保持同步。

其它的不用更改,点击下一步,进入下一步,进入如下图所示画面:

在上图中,选择上面的一些属性,在下面填写属性的值:需要填写以下几个:

databaseName : helloworld 数据库名

serverName : 10.0.0.18 SQL Server 所在的服务器 IP 或名字

portNumber : 1433 默认的 SQL Server 的端口号

其它的不用更改,点“完成”回到服务器配置页面。并保存配置。同时关闭服务器配置页面。

•  将我们的 HelloWorldEARPorjcet 添加到服务器中,方法如下:

在 J2ee 视图中左边的 j2ee 层次结构处选择“服务器配置”下的“ MyWebsphereServer ”,用右键点开,在弹出的菜单中,选择“添加”- > 将我们的项目加入到测试服务器中。如下图所示:

•  生成实体 Bean 的部署代码,在 J2ee 视图中选中我们的 Employee 实体 Bean ,然后点击右键中的生成部署代码,如下图所示:

等一会即可。

•  初步测试我们的实体 Bean ,在 J2ee 视图中,点击“ Employee 实体 Bean ”,右键“在服务器上运行”,系统会自动启动我们的服务器,然后,我们即可在通用测试客户机上测试我们的实体 Bean 。如下图所示:

•  下面我们来修改我们的 CMP 实体 Bean ,增加一些方法:

首先,修改我们的 Create 方法,使其支持多个参数创建对象,打开 EmployeeHome.java 文件,把其中的 Create 方法改为以下所示的情况:

public com.employee.com.Employee create( int id,String name,String email)

throws javax.ejb.CreateException, java.rmi.RemoteException;

同时,将 EmployeeBean.java文件中的ejbcreate和 ejbPostCreate 也修改为如下所示:

public com.employee.com.EmployeeKey ejbCreate( int id,String name,String email)

throws javax.ejb.CreateException {

setId(id);

setName(name);

setEmail(email);

return null ;

}

public void ejbPostCreate( int id,String name,String email) throws javax.ejb.CreateException {

}

保存。

下面新增加两个查找方法。在 J2ee视图中打开Employee部署描述符文件编辑器,打开 ” Bean页面 ” ,找到“查询”处,如下图所示:

点击“添加”如下图所示:

新增一个 findByName 的方法。然后点击下一步,进入如下图所示:

在图中 query 语句中输入:

select object(o) from Employee o where o.name = ?1

然后点完成。

用同样的方法创建一个 findByEmail 的查找方法如下:

接着,用同样的方法再一个 findAllEmployees 的方法:

select object(o) from Employee o where o.id is not null

完成后的如下图所示:

同时,我们需要将我们的实体 Bean 中的 getId () 方法提供给远程接口 , 使用远程方法可以引用 。 方法是 : 打开 EmployeeBean, 然后在屏幕左下角 “轮廓”窗口中,选中getId()方法,点右键->“企业BEAN”->提升至远程接口,如下图(36b)所示:

•  保存我我们设置。对 Employee 实体 Bean 重新生成部署代码。启动通用客户测试机即可测试我们的这个 CMP 实体 Bean 。

由于文章太长,我分成了上、下篇。在下篇中我们将编写CMP的客户端,并提供一种EJB调用的优化策略.

你可能感兴趣的:(用 WSAD5.0和SQLServer2K采用Meet-in-Middle模式开发CMP实体Bean及其完整客户端(上篇:CMP的开发))