圖改日加上,公司上網(wǎng)速度讓人哪個(gè)漢阿

數(shù)據(jù)庫(kù)表用的是oracle的scott示范賬號(hào)下dept
創(chuàng)建一個(gè)EJB工程

1.        File > New > Project.

或在Package Explorer 中點(diǎn)右鍵,單擊new,選擇Project

ctrl+new 選擇 EJB Project

2.        選擇J2EE目錄下 EJB Project

3.        選擇 Next >.

輸入工程名稱,如dept ,單擊finish完成。

2    創(chuàng)建一個(gè)CMP EJB2 Entity Bean

1.        主界面選擇菜單File > New > Other,打開新建向?qū)А?/span>

或在Package Explorer 中點(diǎn)右鍵,單擊new,選擇Other

ctrl+new 選擇 MyEclipse > ejb>EJB2 Entity Bean

2.        展開MyEclipse > ejb 文件夾,選擇> EJB2 Entity Bean。

3.        選擇Next>,界面如下。這里要注意,package建議用.ejb后綴,因?yàn)?/span>XDoclet工具默認(rèn)ejb bean所在的文件夾以.ejb后綴,接口文件的文件夾以.interface為后綴,為了避免設(shè)置上的麻煩,建議按默認(rèn)情況取名。當(dāng)然你也可以通過(guò)設(shè)置XDoclet屬性改變,詳情請(qǐng)查看幫助文檔。

4.             輸入package : com.entity.cmp.ejb

5.             輸入ejb name: dept

6.             選擇是容器管理事務(wù)(CMP)還是bean自己管理事務(wù)(BMP),這里選擇CMP 2.x。

7.             選擇是遠(yuǎn)程(remote)還是本地(local),還是兩者皆是(both),這里選擇遠(yuǎn)程。

8.             選擇Finish 完成操作,生成Dept.java:

9.             添加自己的代碼:

第一步 添加實(shí)體bean與數(shù)據(jù)庫(kù)表映射字段的讀寫方法

    /**

       *@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:在每個(gè)方法前加@ejb.interface-methodview-type   ="remote"的作用是在自動(dòng)生成remote接口時(shí)生成相應(yīng)的方法,如:

      public java.lang.Integer getDeptNo( )

      throwsjava.rmi.RemoteException;

      publicvoid setDeptNo( java.lang.Integer deptno )

      throwsjava.rmi.RemoteException;

      你也可以自己手動(dòng)把這些方法加到remote接口里!

注解2:在某個(gè)方法前加@ejb.persistence      column-name="loc"的作用是在自動(dòng)生成weblogic-cmp-rdbms-jar.xmlejb-jar.xml兩個(gè)部署文件時(shí)生成如下紅色代碼部分,你也可以自己手寫紅色代碼部分。

<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屬性和數(shù)據(jù)庫(kù)列的映射-->

<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>應(yīng)一致-->

         <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

/**

     *用于實(shí)現(xiàn)數(shù)據(jù)持久化(插入數(shù)據(jù)庫(kù))

     * @ejb.create-method

    **/

   public Integer ejbCreate(Integer deptid,String deptName,String deptLoc )

{

       setDeptNo(deptid);

       setDName(deptName);

       setLoc(deptLoc);

       returnnull;

    }

第三步添加相應(yīng)的參數(shù)相同的ejbPostCreateejbCreate

    publicvoid ejbPostCreate(Integer deptid,String deptName,String deptLoc ){ }

3.     XDoclet自動(dòng)生成接口文件、部署描述文件

3.1.  為工程配置XDoclet

1.         右鍵單擊工程名字,打開工程的properties窗口。

選擇菜單Properties > MyEclipse > XDoclet。

2.        build選項(xiàng)卡中選擇 Use dynamic build specification jdk1.4.2

3.        單擊Add Standard,選擇Standard EJB。

4.        單擊Standard EJB,展開ejbdoclet樹菜單,取消dataobject,entitycmp,entitypkvalueobject選項(xiàng)如下圖:

5   為服務(wù)器配置XDoclet,該配置是為了自動(dòng)生成weblogic-ejb-jar.xmlweblogic-cmp-rdbms-jar.xml文件。

右擊ejbdoclet 選擇 Add

我這里用的是weblogic8.1,所以選擇weblogic

l         設(shè)置屬性destDir = src/META-INF。 (weblogic-ejb-jar.xmlweblogic-cmp-rdbms-jar.xml生成位置)

l         設(shè)置屬性datasoruce =你在weblogic中配置的數(shù)據(jù)源jndi名稱。

生成weblogic-cmp-rdbms-jar.xml中的:

<data-source-name>aptechJNDI</data-source-name>

5.3.  運(yùn)行XDoclet生成文件

在工程上右鍵MyEclipse->Run XDoclet

生成前后工程目錄應(yīng)該類似為:

同時(shí)增加了weblogic-ejb-jar.xml,weblogic-cmp-rdbms-jar.xml,和ejb-jar.xml三個(gè)部署文件

生成遠(yuǎn)程接口,home接口和實(shí)用類。

l         注意:DeptHome.javahome接口前有個(gè)紅色的叉,我們需要修改它,把com.entity.cmp.interfaces.DeptPK改成Integer,因?yàn)槲覀兊?/span>bean的主鍵很簡(jiǎn)單就是deptno,在數(shù)據(jù)庫(kù)中是個(gè)number(2)類型的,所以用Integer就可以了,而不用在定義一個(gè)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 >中添加紅色部分,配置事務(wù)屬性

<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.        點(diǎn)擊add,添加部署服務(wù)器weblogic

Entity Bean編寫到此結(jié)束

編寫客戶端程序

1.         新建一個(gè)java project。

2.         為工程配置classpath

l         右鍵單擊該工程名 > build path > configer builder path > add class folder 選擇

上面創(chuàng)建的ejb工程的classes目錄點(diǎn)擊ok。

右擊上面創(chuàng)建的ejb工程的src目錄選擇export(導(dǎo)出)> 選擇jar file >如下圖單擊select the export destination 欄目的browse選擇存儲(chǔ)地址。然后右鍵單擊該工程名 > build path > configer builder path > add external jars 選擇你剛導(dǎo)出的jar文件,加入到classpath

l         然后右鍵單擊該工程名 > build path > configer builder path > add external jars 選擇D:"Program Files"bea"weblogic81"server"lib"weblogic.jar,加入到java class path

3.         創(chuàng)建一個(gè)classClient.java

publicclass Client {

    protected String serverUrl;

    protected String jndiName;

    protected DeptHome home;

    /**

     *構(gòu)造方法:根據(jù)服務(wù)器地址端口和ejb部署的jndiname初始化類域,獲得EJBHome

     *@paramurl

     *@paramjndiName

     *@throwsNamingException

     */

    public Client(String url, String jndiName) throws NamingException {

       this.jndiName = jndiName;

       this.serverUrl = url;

       home = lookupHome();

    }

    /**

     *獲得初始化上下文環(huán)境(javax.naming.Context)實(shí)例從服務(wù)器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("我們無(wú)法通過(guò)該地址:"

                  + serverUrl

                  + "獲得一個(gè)到 WebLogic server 的連接!/"

                  + "We were unable to get a connection to the WebLogic server at "

                  + serverUrl);

           log("請(qǐng)確保該服務(wù)器是啟動(dòng)的。/Please make sure that the server is running.");

           throw ne;

       }

    }

    /**

     *通過(guò)JNDI服務(wù)查找beanhome接口,并返回/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("客戶端無(wú)法獲得EJBHome。"

                  + "請(qǐng)確保你已經(jīng)用"""+ jndiName+"""這個(gè)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("開始客戶端測(cè)試:");

      

       String url = "t3://localhost:7001";

       String jndi = "ejb/Dept"// 來(lái)自weblogic-ejb-jar.xml<jndi-name>ejb/Dept</jndi-name>

       Client client = null;

        // 如果給了main參數(shù)則用main方法的參數(shù)

       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("成功創(chuàng)建編號(hào)為1的部門!");

           log("開始執(zhí)行home.findByPrimaryKey根據(jù)主鍵(部門編號(hào))1執(zhí)行部門查詢!");

           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("部門編號(hào)"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();

       }

      

    }