如您所知,Enterprise JavaBeans(EJB)是一种功能强大而又灵活的技术,这种技术在开发过程中赋予开发人员非常大的优势。但是它并不容易掌握,特别是在应用程序的设计和准备工作的初期。对于容器管理关系(Container-Managed Relationship,CMR)和容器管理持久性(Container-Managed Persistence,CMP)也是如此。当然,一旦经过配置并正常运行起来,运用这些技术进行开发就变得得心应手了。
即使是创建小型应用程序也需要关注并了解应用服务器的配置,还有EJB本身。当前市场上有很多可以自动生成配置文件和导出数据库现有结构的图形化工具;但是为了在整个过程中更有把握,也为了解决问题,有必要用纯文本编辑器创建所有相关代码,这也正是我们将在本文中讨论的内容。
采取一种清晰的方法
在实际编程中,从JSP中直接访问EJB组件是一种很不好的做法。但在我们的代码例子中,我们仍严格遵循这一惯例,因为它让我们可以达到代码通俗易懂的目的。我认为不是每个人都是熟练的EJB开发人员,因此最好采用一种通用的方法来保持代码通俗易懂。这里的目的是解释如何创建和使用CMP/CMR bean以及如何设计和构架可伸缩的、灵活的和可靠的应用程序。勿庸置疑,我们在实际中可以轻松地添加更多的类、 Struts框架和DAO层。如果我们想要在 CMP和BMP之间切换的话,这将最终带给我们更多的灵活性。然而,所有这些功能将只是项目的“绊脚石”。在 BEA WebLogic中,开发CMP/CMR bean将会是非常易于理解的。 |
|
在开始之前,您最好对EJB编程应该有一定的了解。这一点非常很重要,因为本文的目的是描述如何将CMR/CMP技术应用到实践中,以及应用程序如何在BEA Weblogic服务器上工作。因为正在讨论简单的实体beans,所以我们不会对代码进行讲解,但肯定会提到自行开发代码过程中容易出现缺陷的地方。为了完成本文中描述的过程,有一点很重要,那就是需要按照下面的“准备开发环境”中的描述设置了开发环境。
准备开发环境
要应用本文讨论的 CMR/CMP技术,需要安装 BEA WebLogic 8.1应用服务器,并保证其正常运行,还要安装 MySQL 4.0.16数据库服务器,并带有 MySQL Connector/J 3.0.11。要构建代码,还需 Apache Ant 1.6.2,另外当然还需要 Java 2 SDK 1.4.1或更高版本。这里讨论的过程还假设您的 PATH 和CLASSPATH环境变量配置正确。
如果您看过前面提及的所有软件组件的安装指南,就能够正确配置好任何内容。安装指南是值得一读的。在我们的例子中,阅读安装指南就足以配置好 ANT_HOME,让 ANT_HOME 指向Ant的安装目录,将 mysql-connector-java-3.0.11-stable-bin.jar放入 CLASSPATH变量中,将 WebLogic 的 J2SE SDK目录放入 PATH变量中。环境开始工作之后,注意不要跳过阅读软件供应商的官方文档,因为这些信息可帮助您确保设置正确。
就如这里描述的一样,编写的过程适用于 Windows平台;然而,这里提到的技术也可用于任何支持 BEA WebLogic 和 MySQL的平台。 |
|
从数据库开始
让我们从创建MySQL的用户和数据库开始。假设MySQL已正确安装,配置了root用户并设置了密码,那么您需要运行:
C:\mysql\bin\mysql.exe -u root -p
然后输入密码。如果跳过配置root用户(在安装MySQL服务器时),那么只要运行:
C:\mysql\bin\mysql.exe
CREATE DATABASE zzzdb;
INSERT INTO mysql.db VALUES (
'localhost','zzzdb','zzzuser',
'Y','Y','Y','Y','Y','Y','N','Y',
'Y','Y','Y','Y');
INSERT INTO mysql.user VALUES (
'localhost','zzzuser',password(
'zzzpassword'),'N','N','N','N',
'N','N','N','N','N','N','N','N',
'N','N','N','N','N','N','N','N',
'N','','','','',0,0,0);
您会看到图1所示的例子:
图1输入这些命令来创建一个MySQL数据库和root用户及其凭证。
用下面的命令重新加载MySQL服务器:
C:\mysql\bin\mysqladmin.exe -uroot -p reload
或:
C:\mysql\bin\mysqladmin.exe reload
(具体用到的命令取决于root用户配置。)此命令会使变化生效。确保牢记这些值——用户名(zzzuse)、用户密码(zzzpassword)和数据库名称(zzzdb)——后续在BEA WebLogic服务器上配置MySQL连接池和数据源时将需要这些内容。
现在我们需要在WebLogic中创建一个新的配置来与项目协同工作。出于这个目的,我们将使用BEA的配置向导,它指导我们通过必要的步骤生成新的配置。配置向导创建一个特殊的服务器,以及所有工作目录和其他必需的目录。运行之后,我们就可以配置它,部署应用程序和做我们想做的其他事情——它将成为我们自己的WebLogic服务器。首先运行:
C:\bea\weblogic81\common\bin\config.cmd
(这里看到的WebLogic应该是安装在缺省目录中;否则就需要修改路径以匹配您的配置)。您也可以单击开始>程序> BEA WebLogic Platform 8.1> Configuration Wizard,运行配置向导。接着选择Create a new WebLogic configuration,单击Next,选择Basic WebLogic Server Domain template(屏幕左侧),单击Next,选择Express,然后单击Next。
输入管理员凭证。选择所有需要的选项,但不要遗忘,因为每次想更改服务器配置时都需要登录并输入密码。输入凭证后单击Next。下一屏选择Development Mode和位于C:\bea\jdk142_04的(BEA提供的SDK)Sun SDK 1.4.2_041。单击Next。现在您将看到下一屏的右侧底部可以为配置输入一个名称。任意选择一个想要的名称(这个例子中我们输入的是zzzdomain)。单击Create(参见图2)
图2 使用WebLogic Platform 8.1配置向导生成配置
单击Done完成工作区域的准备工作。我们可以用这条命令启动服务器:
C:\bea\user_projects\domains\zzzdomain\startWebLogic.cmd
或者,您也可以这样启动,单击开始>程序>BEA WebLogic Platform 8.1>User Projects>zzzdomain>Start Server。停止服务器只需运行下面的命令:
C:\bea\user_projects\domains\zzzdomain\stopWebLogic.cmd
此时屏幕上的显示应该类似于图3。
图3当启动服务器的时候,屏幕上的显示应该类似于这样。
配置服务器
我们接下来的任务是配置服务器以创建MySQL连接池和数据源,这二者是CMR/CMP所需要的。从运行服务器的管理控制台开始。为此,打开浏览器并输入:
http://localhost:7001/console您将看到图4中显示的网页。登录并输入密码(先前创建的)。单击Sigh In,看到分成两个框架的屏幕。右面的框架中,找到Services Configurations-JDBC部分,并单击Connection Pools。在同一个框架内单击Configure a new JDBC Connection Pool。接下来,选择Database Type-MySQL,以及Database Driver-MySQL's Driver (Type 4) Versions:using com.mysql.jdbc.Driver。单击Continue,看到图5显示的屏幕。接着输入zzzdb作为数据库名称,localhost作为主机名,zzzuser作为数据库用户名,zzzpassword作为密码。回想一下,先前加入这个MySQL用户的时候就已经创建了这些内容。
图4服务器的管理控制台以基于浏览器的网页形式显示
图5 用这个表单来配置JDBC连接池。
屏幕上所有其他栏都保留缺省值。单击Continue,在下一屏单击Test Driver Configuration。如果一切正常,应该看到图6显示的屏幕。
图6成功配置JDBC连接池后会生成本页。
现在单击Create and deploy,接着查看左侧框架,选择zzzdomain>Services>JDBC>Data Sources。在右侧框架中单击Configure a new JDBC Data Source。这一屏中唯一需要设置的一栏就是JNDI Name - MySqlDS。它将在应用程序配置文件中用到。不要更改其他栏;保留它们的缺省值。单击Continue。设置(或者保留原样)Pool Name - MyJDBC Connection Pool(这是先前创建的连接池名称)。单击Continue。在下一屏中单击Create。这样就完成了;现在服务器准备好接受代码了。
将本文的代码下载zip文件(在www.WebLogicPro.com网站上可以获得)解压缩到任意目录。进入此目录,但特别要注意的是,因为您需要用一个文本编辑器打开build.xml,并把文件开头的C:\bea改成自己的BEA WebLogic安装目录。现在保存文件并输入ant all。等待几秒钟,此时正在编译,打包和准备好各种文件。在这个目录中就可以找到名为testcmr.ear的应用程序包,我们将把它部署在WebLogic服务器上。如果每一步都操作正确,您会看到如图7所示的屏幕。
图7 编译和打包完成后工作环境就建立起来了。
回到WebLogic的管理控制台,登录,然后在右侧框架找到Domain Configuration-Your Deployed Resources部分。单击Applications,再单击Deploy a new Application…,然后选择testcmr.ear(参见图8)。单击continue,在下一屏中单击Deploy。
图8 从Weblogic管理控制台选择需要部署的应用程序。
如果每一步都操作正确,应该能看到两个表,每个表里面的Status of Last Action应该显示“Success.”。这种状态说明实体beans已被成功部署,我们来看一下它是如何工作的。您也许有疑问为什么我们没有在数据库里面准备表格。答案很简单——容器会自动生成这些表格。
浏览结果
现在是检查所有工作正确完成的时候了。打开浏览器,输入这个网址:
http://localhost:7001/testcmr
您会看到屏幕上有三个选择:create records、view current和delete records(但首先需要创建好)。我们正在写入记录;在数据库表中的所有内容都会成为记录。从技术角度来看,我们将要创建的是实体beans,而不是直接创建数据库记录。
这个应用程序由两个实体beans组成:Vendor和Model。在示例中我们将以汽车供应商为例,比如丰田、宝马等等。勿需多言,每个供应商可能有多种产品型号,但每一种型号只有一个供应商,所以这种关系是一对多。我们也会使用级联删除,就是说如果删除了供应商bean,所有与之有关的Model bean也将同样被删除。我们的实体bean使用CMP,所以当您监控数据库表的变动时,将能看到一切如何运作。
关于“数据库”还有一点需要注意:每个供应商有一个ID和名称。而且每一个型号也会有自己的ID和名称,还有一个所谓供应商ID,其中包含与此型号相关的供应商的ID。这种结构很简单。
回到“visual”部分,创建一个选项,它将随之创建几个供应商和型号,并把型号和供应商联系起来。View选项显示当前的供应商和型号。Remove选项删除供应商,同时这个选项会自动删除和供应商相关联的型号。单击一个选项之后可以查看数据库表的状态,这将帮助您更好地理解它的工作方式。
工作即将完成,但要注意到代码和配置文件中的几个部分,不然开发自己的代码时可能会产生问题。在Model.java这个组件接口中我们公开getVendorName()方法,但不公开getVendor()方法,而后者是CMR字段的getter方法。我们不能对远程客户端公开CMP字段(不仅是不允许),所以我们用getVendorName()方法为客户端提供获取供应商名称的getter方法。同样的理由也适用于Vendor.java;它的getAllModels()方法把CMR字段getModels()方法的getter方法公开给远程客户。
ModelBean.java中的setVendorid()方法永远不应该被调用!甚至当创建Model字段时也不要在create()方法中使用它,Model字段会在您将型号与供应商联系起来时由容器自动设置。
关于配置文件weblogic-cmp-rdbms-jar.xml,在<weblogic-rdbms-relation>项和<column-map>子项里有两个字段:<foreign-key-column>和<key-column>。请意识到对于这些key-column字段,我们是根据数据库中的列确定标题的,并不是从ejb-jar文件的<cmp-field>字段获得。并请注意,因为我们的<relationship-role-name>是“型号对应供应商”的,所以<foreign-key-column>是型号表中的一列,而<key-column>是供应商表中的一列。型号与供应商是通过这一列关联起来的。
最后剩下的就只有建议了:玩转我们的代码,作些自己的改动,但要确保自己了解所有事情是如何运作的。如果有问题,请联系我们。只要能做到,我们很高兴帮忙。EJB有很多优点,但这项技术上需要耐心地去准备、设计和构建,熟练以后我们就可以享受使用EJB开发的乐趣了。CMP/CMR是一个很好的特性,没有理由不尽量利用它。同样也要记得除了一对多之外,还有一对一和多对多的关系,我们工作中也会遇到这些情况,但不用担心;一旦懂得了基础,您就会懂得其余全部东西。
关于作者
Olexiy Prokhorenko是J2EE软件开发人员和SUN认证Java程序员、SUN认证Web组件开发人员,而且目前正在考取Sun认证企业架构师。Alexander Prohorenko是Unix系统和Oracle数据库管理员,同时也是Sun认证的系统管理员。联系Olexiy请发电子邮件到green@prohorenko.com,联系Alexander请发电子邮件到white@prohorenko.com。
原文出处
http://www.ftponline.com/weblogicpro/2005_03/magazine/features/oprokhorenko/
|