您的位置:首页 > 其它

我的EJB学习历程(八)

2004-07-15 15:43 405 查看




































我爱北京天安门



天安门上太阳升



伟大领袖毛主席



指引我们向前进






































<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这个礼拜发生了好多事情啊。所以一直没有时间写。不过好多人问我怎么不写了啊?我是要写的,现在就开始写。(五)里边有个弟兄问我的<span
lang="EN">IBM的网站在哪儿,我的收藏夹被DEL了,在GOOGLE上找了好久也没找到,等我找到了,再发上去!<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none"
align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p> </o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left;
mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">不过我以后会把我所有引用网址都给打上去。<span lang="EN"><o:p></o:p></span></span></p> <p class="MsoNormal"
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">好了,现在进入我的第<span
lang="EN">4章咯。<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family:
宋体; mso-font-kerning: 0pt">开发<span lang="EN">EJB1.1实体BEAN,好象关于EJB实体BEAN还要分版本的,不过现在我也不清楚为什么分版本。<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE:
12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">由于数据库<span lang="EN">BEAN这个地方的部署我也没有搞清楚,所以我找了LOMBOZ上边有个示例程序,咱们先把这个实验好了,然后再照书做,OK?<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN:
0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p> </o:p></span></p> <p class="MsoNormal"
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">摘自:<span lang="EN">http://www.objectlearn.com/support/docs/cmp.jsp<o:p></o:p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1-9步和我以前写的一样,是如何建立J2EE项目的,这在我以前的我文章里有写。<o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">从第<span lang="EN">10步开始写吧:<o:p></o:p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><?xml:namespace
prefix = v ns = "urn:schemas-microsoft-com:vml" /><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:stroke><v:formulas><v:f eqn="if lineDrawn
pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f
eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><img alt=""
hspace="0" src="/images/blog_csdn_net/sinapaper/24486/r_ejb1.jpg" align="baseline" border="0" /></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY:
宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">现在选中<span lang="EN">CMP这一项。 然后打上你自己中意的名字和包名,做NEXT。<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align:
none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">然后就会进入到<span lang="EN">CMP这个界面了:其实这个界面一看就知道是怎么回事:<o:p></o:p></span></span></p> <p class="MsoNormal"
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p><img
alt="" hspace="0" src="/images/blog_csdn_net/sinapaper/24486/r_ejb2.jpg" align="baseline" border="0" /> </o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE:
12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">写上表名,加上字段,一切简单的<span lang="EN">OK了。记得啊,这里DATASOURCE一定要和表里边的字段一样。<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;
TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">还有对应的数据类型。可以加好多的字段,但是这个例子里边就给了两个字段,我们也姑且用他这两个字段。<span lang="EN"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">对对了,还有就是设置一个<span
lang="EN">PRIMARY KEY。搞定。FINISH。<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times
New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p> </o:p></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family:
'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这个时候<span lang="EN">ECLIPSE会自己就把你刚才建立的AddressBean给打开。<o:p></o:p></span></span></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">然后你照着这个例子改代码,其实不讲为什么这么改大家也都能明白:<span lang="EN"><o:p></o:p></span></span></p> <p><b><span lang="EN" style="BACKGROUND: white;
COLOR: #7f0055; FONT-FAMILY: Courier">package</span></b><span lang="EN" style="BACKGROUND: white; FONT-FAMILY: Courier"> com.testing.cmp;</span><span lang="EN"><o:p></o:p></span></p> <p><b><span lang="EN" style="BACKGROUND: white; COLOR: #7f0055; FONT-FAMILY:
Courier">import</span></b><span lang="EN" style="BACKGROUND: white; FONT-FAMILY: Courier"> javax.ejb.EntityBean;</span><span lang="EN"><o:p></o:p></span></p> <p><font face="宋体"><span lang="EN" style="COLOR: #3399ff">/**<br />* @ejb.bean name="Address"<br />*
jndi-name="AddressBean"<br />* type="CMP"<br />* primkey-field="name"<br />* schema="addressSchema" <br />* cmp-version="2.x"<br />* <br />* @ejb.persistence <br />* table-name="address" <br />* <br />* @ejb.finder <br />* query="SELECT OBJECT(a) FROM addressSchema
as a" <br />* signature="java.util.Collection findAll()"

*

**/
public
abstract class AddressBean
implements EntityBean {

...

Modify the ejbCreate and ejbPostcreate methods to accepts two parameters:

/**

* The ejbCreate method.

*

* @ejb.create-method

*/

public java.lang.String ejbCreate(String name, String phone)

throws javax.ejb.CreateException {

setName(name);

setPhone(phone);

return null;

}

/**

* The container invokes this method immediately after it calls ejbCreate.

*

*/

public void ejbPostCreate(String name, String phone) throws javax.ejb.CreateException {

}

必须改POST和CREATE方法的内容啊。等下再告诉你们为什么要这样做,对了,他里边还都帮你写好了
setName();
setPhone();方法。直接用就好了。

然后SAVE,把刚才写的BEAN加到EJB里边,就是用J2EE->Add
Ejb to Modules ,然后选择你刚才建立的EJB就好了。

下边是最讨厌的东西了,就是写个EJBDOCLET,示例给的是要改ejbGenerate.xml,NND,我根本就没有这个文件,后来查了好多的资料,才知道,原来他那个是旧版本,郁闷~~~~~~旧版本还要往上贴。

我们3.X要改的是xdoclet.xml这个文件,这个文件保证有,大家找到之后就能看见,他里边有好多种配置服务器的数据库的XML,我用的是JBOSS,所以就改这块了。
< jboss

version="3.0"

unauthenticatedPrincipal="nobody"

xmlencoding="UTF-8"

destdir="${ejb.dd.dir}"

validatexml="false"

datasource="java:/MySqlDS"

datasourcemapping="mySQL"

preferredrelationmapping="PLEASE_MODIFY_THIS"
/ >

对了对了,说到这我找到了文章也不错,是个小J写的。给你们地址:
http://nemuneko.com/jboss/lomboz_cmp.html 因为我最近在学日语,所以能看明白点,看不明白的就看图理解咯~~~~~

注意啊,这里是最关键的地方,我觉得,可能是因为我比较的笨。呵呵。

这里的MySqlDS是我在(7)里边写的在JBOSS里边配置的DEFUALT DATASOUCE,对了,我按照7里边写的把mysql-service.xml这个配置文件放的位置好象不可以,我查了好久才找到,原来是你的EJB部署到哪个文件夹下,这个mysql-service.xml文件就要跟着放到那个文件夹下,我机器上的是:D:/jboss-3.0.8/server/default/deploy
这个文件夹。最后就是把你的DB DRIVER放在和这个文件夹对应的LIB里边。
我机器上是这个:
D:/jboss-3.0.8/server/default/lib

我用的是Mysql 的driver,没有问题的。

这样配置就应该是没问题了。
对了,把建表的语句也给你们:create table
address (
name
varchar(40) , phone
varchar(40));

然后SAVE你的XDOCLET.XML。做GENERATE EJB FILES,和DEPLOY。
假如你成功的话,就能看见这么一段的输出:

22:50:11,031 INFO [MainDeployer] Starting deployment of package: mybeans.jar

22:50:11,302 INFO [EjbModule] Creating

22:50:11,342 INFO [EjbModule] Deploying Address

22:50:11,392 INFO [EjbModule] Created

22:50:11,392 INFO [EjbModule] Starting

22:50:11,822 INFO [Address] Table 'ADDRESS' already exists

22:50:11,842 INFO [EjbModule] Started

22:50:11,842 INFO [MainDeployer] Deployed package: mybeans.jar

一定要看输出啊!很关键的地方。

这样就完成了我们的EJB CMP的BEAN了。再写个CLIENT测试他就OK了。

把我的CLIENT程序给你们。

public
void testBean() {

try {

Address address = getHome().create("John Smith", "+212 223 4455");

Collection all = getHome().findAll();

Iterator it = all.iterator();

while (it.hasNext()) {

Address element = (Address) it.next();

System.out.println("Name:" +

element.getName() + " Phone: " +element.getPhone() );

}

}
catch (Exception e) {

e.printStackTrace();

}

}

IMPORT自己记得加啊~哈哈。
运行,成功!!!!!!

下次又的写些理论上的东西,说实话,我最讨厌理论的东西,因为看上去真的很头大!~~

http://nemuneko.com/jboss/lomboz_cmp.html

下边这段文字是在CN-JAVA下COPY过来的。(http://www.cn-java.com/target/news.php?news_id=2174)
一、entity Bean
代表了以持久存储机制保存的一个实体,通常为一个DB。客户机通过entity
bean的remote接口访问它,实现该remote接口的对象被称为EJB对象。每一个

entity 对象都有一个标识符。

Entity Bean的特征:持久的(分为BMP和CMP),允许共享访问,并且有一个主键。

二、编写规则:

 

 1.(1)实现EntityBean的接口。

  (2).类定义为PUBLIC。

  (3).类不能定义为abstract
和final。

  (4).实现finaler方法(仅用于BMP)。

  (5).实现商业方法。

(6).含有一个空构造器。

(7).不能实现finalize方法。

 2.ejbCreate应满足的规则:

  (1).访问控制修饰符必须为public


(2).返回类型必为主键(仅对于BMP)。

(3).参数必须为佥的JAVA RMI类型。

(4).方法修饰符不能为final或static。

(5).throws子句可以包括CreateException以及应用程序中指定的其它异常。

3.ejbPostCreate:每一个ejbCreate必须对应一个ejbPostCreate方法,通常为空。

(1).参数的数量和类型必与相应ejbCreate方法匹配。

(2).访问控制修饰符必须为public。

(3).方法修饰符不能为final和 static。

(4).返回类型必须为void。

(5).throws子句包括CreateException以及应用程序中指定的其它Exception。

  4.ejbRemove方法:当EJB客户调用此方法时,将删除DB中该实体的状态或EntityBean

    被一个DB删除直接移走。

  5.ejbLoad方法:利用DB刷新实体变量。

   ejbStore方法:将变量写到DB中。

这两个方法用于同步与存贮在DB中的值所对应的EntityBean实体变量。

  6.finder方法的规则:

(1).必须ejbFindByPrimaryKey方法。

(2).finder方法务必须以ejbFind为前缀。

(3).访问控制修饰符必须为public。

(4).方法修饰符不能为final和 static。

(5).参数必须是合法的Java RMI类型。

(6).返回类型必须为主键或主键的集合。

(7).throws子句包括FinderException以及应用程序中指定的其它Exception。

  7.商业方法

(1).方法名不能与EJB结构定义的方法名冲突。

(2).访问控制修饰必为public.

(3).方法修饰不能final
或static。

(4).参数必须为合法的Java RMI类型。

三.Home接口的编写规则:

1.Create方法的编写规则:

(1).它与enterprise Bean类中对应的方法一样,含有相同的参数。

(2).返回Remote接口类型。

(3).throws子句包括对应的ejbCreate和
ejbPostCreate方法的异常。

2.finder讲法的编写规则:

(1).Remote接口中的每一个方法必须与enterpriseBean类中的方法匹配。

(2).每个方法命名规则与enterprise Bean类中的方法的命名规则一样。

(3).参数和返回类型必须是合法的Java RMI类型。

(4).throws子句包括RemoteException。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: