这个礼拜发生了好多事情啊。所以一直没有时间写。不过好多人问我怎么不写了啊?我是要写的,现在就开始写。(五)里边有个弟兄问我的IBM的网站在哪儿,我的收藏夹被DEL了,在GOOGLE上找了好久也没找到,等我找到了,再发上去!
不过我以后会把我所有引用网址都给打上去。
好了,现在进入我的第4章咯。
开发EJB1.1实体BEAN,好象关于EJB实体BEAN还要分版本的,不过现在我也不清楚为什么分版本。
由于数据库BEAN这个地方的部署我也没有搞清楚,所以我找了LOMBOZ上边有个示例程序,咱们先把这个实验好了,然后再照书做,OK?
摘自:http://www.objectlearn.com/support/docs/cmp.jsp
1-9步和我以前写的一样,是如何建立J2EE项目的,这在我以前的我文章里有写。
从第10步开始写吧:
现在选中CMP这一项。然后打上你自己中意的名字和包名,做NEXT。
然后就会进入到CMP这个界面了:其实这个界面一看就知道是怎么回事:
写上表名,加上字段,一切简单的OK了。记得啊,这里DATASOURCE一定要和表里边的字段一样。
还有对应的数据类型。可以加好多的字段,但是这个例子里边就给了两个字段,我们也姑且用他这两个字段。
对对了,还有就是设置一个PRIMARY KEY。搞定。FINISH。
这个时候ECLIPSE会自己就把你刚才建立的AddressBean给打开。
然后你照着这个例子改代码,其实不讲为什么这么改大家也都能明白:
package com.testing.cmp;
import javax.ejb.EntityBean;
/**
* @ejb.bean name="Address"
* jndi-name="AddressBean"
* type="CMP"
* primkey-field="name"
* schema="addressSchema"
* cmp-version="2.x"
*
* @ejb.persistence
* table-name="address"
*
* @ejb.finder
* query="SELECT OBJECT(a) FROM addressSchema as a"
* 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。