圖改日加上,公司上網速度讓人哪個漢阿
數據庫表用的是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 閱讀(2865)
評論(5) 編輯 收藏