图改日加上,公司上网速度让人哪个汉阿
数据库表用的是oracle的scott示范帐号下dept
1 创建一个EJB工程
1. File > New > Project.
或在Package Explorer 中点右键,单击new,选择Project
或ctrl+new 选择 EJB Project
2. 选择J2EE目录下 EJB Project
3. 选择 Next >.
输入工程名称,如dept ,单击finish完成。
2 创建一个CMP EJB2 Entity Bean
1. 主界面选择菜单File > New > Other,打开新建向导。
或在Package Explorer 中点右键,单击new,选择Other
或ctrl+new 选择 MyEclipse > ejb>EJB2 Entity Bean
2. 展开MyEclipse > ejb 文件夹,选择> EJB2 Entity Bean。
3. 选择Next>,界面如下。这里要注意,package建议用.ejb后缀,因为XDoclet工具默认ejb bean所在的文件夹以.ejb后缀,接口文件的文件夹以.interface为后缀,为了避免设置上的麻烦,建议按默认情况取名。当然你也可以通过设置XDoclet属性改变,详情请查看帮助文档。
4. 输入package : com.entity.cmp.ejb
5. 输入ejb name: dept
6. 选择是容器管理事务(CMP)还是bean自己管理事务(BMP),这里选择CMP 2.x。
7. 选择是远程(remote)还是本地(local),还是两者皆是(both),这里选择远程。
8. 选择Finish 完成操作,生成Dept.java:
9. 添加自己的代码:
第一步 添加实体bean与数据库表映射字段的读写方法
/**
*@ejb.interface-methodview-type ="remote"
*@ejb.persistence column-name="deptNo"
*/
publicabstract Integer getDeptNo();
/**
*@ejb.interface-methodview-type ="remote"
*/
publicabstractvoid setDeptNo(Integer deptno);
/**
*@ejb.interface-methodview-type ="remote"
*@ejb.persistence column-name="dName"
*/
publicabstract String getDName();
/**
*@ejb.interface-methodview-type ="remote"
*/
publicabstractvoid setDName(String name);
/**
*@ejb.interface-methodview-type ="remote"
*@ejb.persistence column-name="loc"
*/
publicabstract String getLoc();
/**
*@ejb.interface-methodview-type ="remote"
*/
publicabstractvoid setLoc(String loc) ;
注解1:在每个方法前加@ejb.interface-methodview-type ="remote"的作用是在自动生成remote接口时生成相应的方法,如:
public java.lang.Integer getDeptNo( )
throwsjava.rmi.RemoteException;
publicvoid setDeptNo( java.lang.Integer deptno )
throwsjava.rmi.RemoteException;
你也可以自己手动把这些方法加到remote接口里!
注解2:在某个方法前加@ejb.persistence column-name="loc"的作用是在自动生成weblogic-cmp-rdbms-jar.xml和ejb-jar.xml两个部署文件时生成如下红色代码部分,你也可以自己手写红色代码部分。
<weblogic-rdbms-jar>
<weblogic-rdbms-bean>
<ejb-name>Dept</ejb-name>
<data-source-name></data-source-name>
<table-name>Dept</table-name>
<field-map> <!--bean属性和数据库列的映射-->
<cmp-field>deptNo</cmp-field>
<dbms-column>deptNo</dbms-column>
</field-map>
<field-map>
<cmp-field>dName</cmp-field>
<dbms-column>dName</dbms-column>
</field-map>
<field-map>
<cmp-field>loc</cmp-field>
<dbms-column>loc</dbms-column>
</field-map>
</weblogic-rdbms-bean>
<weblogic-rdbms-jar>
<ejb-jar >
<enterprise-beans>
<entity >
<description><![CDATA[Description for Dept]]></description>
<display-name>Name for Dept</display-name>
<ejb-name>Dept</ejb-name>
<home>com.entity.cmp.interfaces.DeptHome</home>
<remote>com.entity.cmp.interfaces.Dept</remote>
<ejb-class>com.entity.cmp.ejb.Dept</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>com.entity.cmp.interfaces.DeptPK
</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Dept</abstract-schema-name>
<!--bean属性定义,上面<cmp-field>和这里的<field-name>应一致-->
<cmp-field >
<description><![CDATA[]]></description>
<field-name>deptNo</field-name>
</cmp-field>
<cmp-field >
<description><![CDATA[]]></description>
<field-name>dName</field-name>
</cmp-field>
<cmp-field >
<description><![CDATA[]]></description>
<field-name>loc</field-name>
</cmp-field>
</entity>
</ejb-jar >
</enterprise-beans>
第二步添加自己的 ejbCreate
/**
*用于实现数据持久化(插入数据库)
* @ejb.create-method
**/
public Integer ejbCreate(Integer deptid,String deptName,String deptLoc )
{
setDeptNo(deptid);
setDName(deptName);
setLoc(deptLoc);
returnnull;
}
第三步添加相应的参数相同的ejbPostCreateejbCreate
publicvoid ejbPostCreate(Integer deptid,String deptName,String deptLoc ){ }
3. 用XDoclet自动生成接口文件、部署描述文件
3.1. 为工程配置XDoclet
1. 右键单击工程名字,打开工程的properties窗口。
选择菜单Properties > MyEclipse > XDoclet。
2. 在build选项卡中选择 Use dynamic build specification 和 jdk1.4.2
3. 单击Add Standard,选择Standard EJB。
4. 单击Standard EJB,展开ejbdoclet树菜单,取消dataobject,entitycmp,entitypk和valueobject选项如下图:
5 为服务器配置XDoclet,该配置是为了自动生成weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml文件。
右击ejbdoclet 选择 Add 。
我这里用的是weblogic8.1,所以选择weblogic。
l 设置属性destDir = src/META-INF。 (weblogic-ejb-jar.xml和weblogic-cmp-rdbms-jar.xml生成位置)
l 设置属性datasoruce =你在weblogic中配置的数据源jndi名称。
生成weblogic-cmp-rdbms-jar.xml中的:
<data-source-name>aptechJNDI</data-source-name>
5.3. 运行XDoclet生成文件
在工程上右键MyEclipse->Run XDoclet
生成前后工程目录应该类似为:
同时增加了weblogic-ejb-jar.xml,weblogic-cmp-rdbms-jar.xml,和ejb-jar.xml三个部署文件
生成远程接口,home接口和实用类。
l 注意:DeptHome.java即home接口前有个红色的叉,我们需要修改它,把com.entity.cmp.interfaces.DeptPK改成Integer,因为我们的bean的主键很简单就是deptno,在数据库中是个number(2)类型的,所以用Integer就可以了,而不用在定义一个com.entity.cmp.interfaces.DeptPK。
public com.entity.cmp.interfaces.Dept findByPrimaryKey(com.entity.cmp.interfaces.DeptPK pk)
throws javax.ejb.FinderException,java.rmi.RemoteException;
l 修改ejb-jar.xml:
1. 在<entity >中添加红色代码部分,指定某列为主键;把<prim-key-class>的值改成java.lang.Integer和主键的类型一致。
<entity >
<description><![CDATA[Description for Dept]]></description>
<display-name>Name for Dept</display-name>
<ejb-name>Dept</ejb-name>
<home>com.entity.cmp.interfaces.DeptHome</home>
<remote>com.entity.cmp.interfaces.Dept</remote>
<ejb-class>com.entity.cmp.ejb.Dept</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Integer</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Dept</abstract-schema-name>
<cmp-field >
<description><![CDATA[]]></description>
<field-name>deptNo</field-name>
</cmp-field>
<cmp-field >
<description><![CDATA[]]></description>
<field-name>dName</field-name>
</cmp-field>
<cmp-field >
<description><![CDATA[]]></description>
<field-name>loc</field-name>
</cmp-field>
<primkey-field>deptNo</primkey-field>
</entity>
2.在<assembly-descriptor >中添加红色部分,配置事务属性
<assembly-descriptor >
<container-transaction>
<method>
<ejb-name>Dept</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor >
5.4. 部署EJB
1. MyEclipse >Add and Remove Project Deployments
2. 点击add,添加部署服务器weblogic。
Entity Bean编写到此结束
编写客户端程序
1. 新建一个java project。
2. 为工程配置classpath
l 右键单击该工程名 > build path > configer builder path > add class folder 选择
上面创建的ejb工程的classes目录点击ok。
或
右击上面创建的ejb工程的src目录 > 选择export(导出)> 选择jar file >如下图单击select the export destination 栏目的browse选择存储地址。然后右键单击该工程名 > build path > configer builder path > add external jars 选择你刚导出的jar文件,加入到classpath
l 然后右键单击该工程名 > build path > configer builder path > add external jars 选择D:"Program Files"bea"weblogic81"server"lib"weblogic.jar,加入到java class path中
3. 创建一个class:Client.java
publicclass Client {
protected String serverUrl;
protected String jndiName;
protected DeptHome home;
/**
*构造方法:根据服务器地址端口和ejb部署的jndiname初始化类域,获得EJBHome
*@paramurl
*@paramjndiName
*@throwsNamingException
*/
public Client(String url, String jndiName) throws NamingException {
this.jndiName = jndiName;
this.serverUrl = url;
home = lookupHome();
}
/**
*获得初始化上下文环境(javax.naming.Context)实例从服务器JNDItree.
*/
private Context getInitialContext() throws NamingException {
try {
// Get an InitialContext
Hashtable h = new Hashtable();
h.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, serverUrl);
returnnew InitialContext(h);
} catch (NamingException ne) {
log("我们无法通过该地址:"
+ serverUrl
+ "获得一个到 WebLogic server 的连接!/"
+ "We were unable to get a connection to the WebLogic server at "
+ serverUrl);
log("请确保该服务器是启动的。/Please make sure that the server is running.");
throw ne;
}
}
/**
*通过JNDI服务查找bean的home接口,并返回/Lookupthebean'shomeinterfaceusingJNDI.
*/
private DeptHome lookupHome() throws NamingException {
Context ctx = getInitialContext();
try
{
Object home = (DeptHome) ctx.lookup(jndiName);
return (DeptHome) PortableRemoteObject.narrow(home, DeptHome.class);
} catch (NamingException ne) {
log("客户端无法获得EJBHome。"
+ "请确保你已经用"""+ jndiName+"""这个JNDI name在"
+ serverUrl
+ "的WebLogic server上部署了此ejb");
log("The client was unable to lookup the EJBHome. Please make sure " +
"that you have deployed the ejb with the JNDI name " +
"ejb/DeptHome on the WebLogic server at "+serverUrl);
throw ne;
}
}
/**
*打印日志
*
*@params
*/
privatestaticvoid log(String s) {
System.out.println(s);
}
publicstaticvoid main (String args[])
{
log("开始客户端测试:");
String url = "t3://localhost:7001";
String jndi = "ejb/Dept"; // 来自weblogic-ejb-jar.xml的<jndi-name>ejb/Dept</jndi-name>
Client client = null;
// 如果给了main参数则用main方法的参数
if(args.length==1)
{
url = args[0];
}
try
{
client = new Client(url,jndi);
DeptHome home = client.home;
log("获得DeptHome!");
PortableRemoteObject.narrow(home.create(new Integer(1),"java","zhengzhou"), Dept.class);
log("成功创建编号为1的部门!");
log("开始执行home.findByPrimaryKey根据主键(部门编号)1执行部门查询!");
Dept dept;
dept = (Dept) PortableRemoteObject.narrow(home.findByPrimaryKey(new Integer(1)),Dept.class);
Integer no = dept.getDeptNo();
String name = dept.getDName();
String loc = dept.getLoc();
log("部门编号"t部门名字"t位置");
log(no +""t"+name +""t"+loc);
log("game over");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassCastException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CreateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FinderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
posted on 2008-04-08 19:13
whistler 阅读(2828)
评论(5) 编辑 收藏