Java綠地(~ming~)

          Java 草地

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          學(xué)習(xí)ejb的總結(jié)

           

          Enterprise JavaBean(EJB)

          a.Enterprise JavaBeans (EJBs) are a part of the Java 2 Enterprise Edition specifications

          b.Some Problems Within The Distribution Application

          (Distributed, Transactional ,Persistent)




           

          1.  Ejb主要包括:Session Bean(業(yè)務(wù)邏輯),Entity Bean(業(yè)務(wù)數(shù)據(jù)),Message Driven Bean

          2.  Ejb遠(yuǎn)程調(diào)用的核心:RMI—>Client –(RMI-IIOP)協(xié)議—ejb home

          3.  EjbBean遠(yuǎn)程訪問的基礎(chǔ):Seriliable,因?yàn)椴煌涌诶^承了Remote,所以bean要通過網(wǎng)絡(luò)傳播只能序列化才行,常見的數(shù)據(jù)類型如:String,Double都是已經(jīng)可以序列化的

          .wsadejb實(shí)例:

          1新建Enterprise Application Project—>選擇New Moduleejb+clientà創(chuàng)建Stateless SessionBeanà Finish。生成了三個(gè)類:Home Object,EJB Object,SessionBean

          2.代碼如下:a. Home Object :

          public interface SayHelloHome extends javax.ejb.EJBHome {

          public mypack.SayHello create()

                  throws javax.ejb.CreateException, java.rmi.RemoteException; }

            b. EJB Object

          import java.rmi.RemoteException;

          public interface SayHello extends javax.ejb.EJBObject {

                  public void sayHello()throws RemoteException;  }

          c. public class SayHelloBean implements javax.ejb.SessionBean {

             private javax.ejb.SessionContext mySessionCtx;

             public void sayHello(){  System.out.println("nihao");   }

             public javax.ejb.SessionContext getSessionContext() {

                 return mySessionCtx;    }

             public void setSessionContext(javax.ejb.SessionContext ctx) {

                 mySessionCtx = ctx; }

             public void ejbCreate() throws javax.ejb.CreateException {  }

             public void ejbActivate() { }      //交給緩沖池管理掛起和激活

             public void ejbPassivate() {    }

             public void ejbRemove() {   }  }

           

           c.Generate部署并生成遠(yuǎn)程代碼ejb-jar.xml,主要作用是產(chǎn)生stubSkeleton,產(chǎn)生的內(nèi)容:

          <?xml version="1.0" encoding="UTF-8"?>

          <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

          <ejb-jar id="ejb-jar_ID">

              <enterprise-beans>

                  <session id="SayHello">

            <ejb-name>SayHello</ejb-name>

                      <home>mypack.SayHelloHome</home>

                      <remote>mypack.SayHello</remote>

                      <ejb-class>mypack.SayHelloBean</ejb-class>

                      <session-type>Stateless</session-type>

                      <transaction-type>Container</transaction-type>

                  </session>

              </enterprise-beans>

          </ejb-jar>

          雙擊ejbModule可以得到jndi地址:ejb/mypack/sayHelloHome-----à運(yùn)行服務(wù)器


           

          3.編寫測(cè)試:a.new Client, EJB Module加到build path中:

            b.編寫測(cè)試類:public class HelloTest {

             public static void main(String args[])throws Exception{

             InitialContext ctx=new InitialContext();

          SayHelloHome home=(SayHelloHome) ctx.lookup("ejb/mypack/sayHelloHome");

             SayHello hello=home.create();   hello.sayHello();    }}

            c. 添加測(cè)試類運(yùn)行期依賴的EJB組件,右擊—>open with jar—>鉤選ejb.jarà找到main class

          d.運(yùn)行測(cè)試類(確定你的WebSphere已經(jīng)啟動(dòng)):即先要啟動(dòng)Servers下的服務(wù)器后才可以

            run as application client,在客戶端看到的是客戶端的內(nèi)容,服務(wù)器斷才能看到服務(wù)器結(jié)果

          (也可以將打包的jar導(dǎo)入到eclipse的進(jìn)行了封裝,然后調(diào)用測(cè)試)

           

           

          三.Entity bean RDBMS的視圖,分為CMPBMP兩種

          1.CMP實(shí)例:

          a.Create ejb to RDB mapping-à加載數(shù)據(jù)庫的驅(qū)動(dòng)—>根據(jù)數(shù)據(jù)庫表結(jié)構(gòu)生成CMP EntityBeanàbottom Upà填寫包名就可以自動(dòng)創(chuàng)建了entity bean

          映射方式一共有三種:
          bottom-up:通過數(shù)據(jù)庫表直接生成相應(yīng)的cmp
          top-down:通過已有的entity bean生成相應(yīng)的數(shù)據(jù)庫表
          meet-in-the-middle:前兩者匯合




           

          b.LocalHome:

          public interface AccountLocalHome extends javax.ejb.EJBLocalHome {

              public mypack.AccountLocal create(java.lang.String id)

                  throws javax.ejb.CreateException;

              public mypack.AccountLocal findByPrimaryKey(mypack.AccountKey primaryKey)

                  throws javax.ejb.FinderException;}

          c. public interface AccountLocal extends javax.ejb.EJBLocalObject { //業(yè)務(wù)方法

          public java.lang.String getOwername();

            public void setOwername(java.lang.String newOwername);

            public java.lang.Double getBalance();

             public void setBalance(java.lang.Double newBalance); }

          d. public abstract class AccountBean implements javax.ejb.EntityBean {

            private javax.ejb.EntityContext myEntityCtx;

            public void setEntityContext(javax.ejb.EntityContext ctx) {

                myEntityCtx = ctx;  }

            public javax.ejb.EntityContext getEntityContext() {return myEntityCtx;  }

            public void unsetEntityContext() {  myEntityCtx = null; }

            public mypack.AccountKey ejbCreate(java.lang.String id)

                throws javax.ejb.CreateException {  setId(id);  return null;    }

            public void ejbPostCreate(java.lang.String id)

                throws javax.ejb.CreateException {  }

            public void ejbActivate() { }

            public void ejbLoad() { }

            public void ejbPassivate() {    }

            public void ejbRemove() throws javax.ejb.RemoveException {  }

            public void ejbStore() {    }

            public abstract java.lang.String getOwername();

            public abstract void setOwername(java.lang.String newOwername);

            public abstract java.lang.Double getBalance();

            public abstract void setBalance(java.lang.Double newBalance);

            public abstract java.lang.String getId();

            public abstract void setId(java.lang.String newId);   }

           

          e. public class AccountKey implements java.io.Serializable { //一定要可序列化的

              static final long serialVersionUID = 3206093459760846163L;

              public java.lang.String id; public AccountKey() {   }

              public AccountKey(java.lang.String id) {    this.id = id;   }

              public boolean equals(java.lang.Object otherKey) {

                  if (otherKey instanceof mypack.AccountKey) {

                      mypack.AccountKey o = (mypack.AccountKey) otherKey;

                      return ((this.id.equals(o.id)));        }   return false;   }

              public int hashCode() { return (id.hashCode()); }  }

          f.部署generate,生成ejb-jar.xml對(duì)主鍵,由容器管理,對(duì)應(yīng)的字段映射進(jìn)行描述

          g. 打開server進(jìn)行配置security,添加用戶的訪問密碼和用戶名(jaas)

          h. 采用數(shù)據(jù)源的方式和數(shù)據(jù)庫進(jìn)行連接(websphere數(shù)據(jù)源):serveràdate source

            àadd listàdb2 jdbc Provideràdefine jdbcà改變數(shù)據(jù)源jndi地址-à改變databaseName

          i. 配置EJB組件訪問DataSource-àcmp open with Deployment Descriptionà改成自設(shè)jndi地址

           



          2.CMP
          方法詳述:

            a.context變量:將成員變量,安全信息和環(huán)境屬性等放在上下文中

            b.跟單行紀(jì)錄相關(guān)的業(yè)務(wù)邏輯方法,是abstract的,由容器去生成jdbc代碼,工具生成接口

            c.Home接口中的跟整個(gè)數(shù)據(jù)庫有關(guān)的業(yè)務(wù)邏輯方法,findAll不是單條記錄對(duì)應(yīng)的entity

            d.entity bean必須的方法,用于管理,load將數(shù)據(jù)庫中放到內(nèi)存,store相反

           f.容器自動(dòng)調(diào)用的方法,不含jdbc,entityBean中繼承來的

           

          3.CMPBMP的比較:

          a.cmp是模擬bmp的,cmp沒有持久化字段,沒有get.set方法,都是從ejb-jar.xml中讀取

          b.cmp bean classabstract,標(biāo)明由容器去實(shí)現(xiàn)

          c.cmp中對(duì)數(shù)據(jù)庫的操作可以寫成抽象方法,由容器去實(shí)現(xiàn)

           

           

           

          2. item添加EJBQL:打開EJB部署描述文件(ejb-jar.xml),找到Bean Item,添加Queriesà

             方法名為findAll-à返回為collection  即:select object(o) from item o



          3.
          entity bean配置Transaction:切換到“Assembly Descriptor”頁:為Requried

            事務(wù):一系列方法的集合,同時(shí)成功,不成功可以回滾同時(shí)失敗。相當(dāng)于jdbc時(shí)connectionrollback;類型如下:

          a.       supports:A事務(wù)運(yùn)動(dòng),B發(fā)現(xiàn)有就加入這一事務(wù)中,沒有就算

          b.     notSupported:A有沒有都不加入,B不一定是事務(wù),B執(zhí)行,A掛起,B重開啟事務(wù)

          c.     required:上下文中A有就加入,沒有就new一個(gè)事務(wù)

          d.     requiresNew:都自己去啟動(dòng)一個(gè)事務(wù), B要執(zhí)行,A掛起,B不加入別人事務(wù)

          e.     mandatory:強(qiáng)制獨(dú)裁,事務(wù)A必須有,沒有B就報(bào)錯(cuò)

          f.     never:有事務(wù)在B之前就拋異常,沒有就算



          4
          修改實(shí)體關(guān)系:切換到“Overview”頁,找到relationships關(guān)聯(lián)關(guān)系,編輯關(guān)系的導(dǎo)航性

             一般只是單導(dǎo)航性



           

          5.創(chuàng)建值對(duì)象(Value Objects):只要是傳遞entity bean對(duì)象,供sessionbean調(diào)用

          切換到“Project Navigator”頁,新建Java ProjectSalesValueObjects

          a.     ItemVo:Long id;String name; //setter/getter方法     //必須要實(shí)現(xiàn)Serialiable接口

          b.     LocationVoString city;String state;String zipcode;String areaCode;  //setter/getter

            

          6.
          SalesValueObjects project加到sales project中:整個(gè)應(yīng)用中

          打開“EAR Deployment Descriptor”(META-INF/application.xml),切換“Module”頁:

          --à 選中Project Utility JARs

           

          7創(chuàng)建業(yè)務(wù)層 ---- Stateless SessionBeanSalesFacade

            
          8.
          下面配置SessionBean訪問EntityBean的本地引用  sessionentity bean 關(guān)聯(lián)

          打開“EJB Development Descriptor”(META-INF/ejb-jar.xml),切換“References”頁

          ---àejb local reference,因?yàn)?/span>entity bean 都是local

             9.在EJB組件中添加對(duì)SalesValueObjects project的依賴àopen with jar dependency editor



           

          10. SalesFacade中添加三個(gè)業(yè)務(wù)方法(Remote接口的EJB OBJECT)

          public LocationVo getLocation(String zipCode)throws RemoteException;

          public ItemVo[] getAllItems()throws RemoteException;

          public boolean makePurchase(String zipCode,Long[] itemIds)throws RemoteException;

             11.為了業(yè)務(wù)方法能夠得到EntityBean ItemitemId,在ItemKey中添加get()方法:

            

          12SalesFacadeBean中實(shí)現(xiàn)業(yè)務(wù)方法:如:

          public LocationVo getLocation(String zipCode){

                      final String locRef="java:comp/env/ejb/Location";

                      LocationVo locationVo=new LocationVo();

                      try{    Context ctx=new InitialContext();

                      LocationLocalHome locationHome=(LocationLocalHome)ctx.lookup(locRef);

              LocationLocal location=locationHome.findByPrimaryKey(new LocationKey(zipCode));

              locationVo.setAreaCode(location.getAreacode());locationVo.setZipCode(zipCode);

          locationVo.setCity(location.getCity());locationVo.setState(location.getState());

              }catch(NamingException ne){throw new EJBException(ne);

              }catch(FinderException fe){     return locationVo;  }  return locationVo;}

           

          findByPrimaryKeyhome中為entity bean 創(chuàng)建的主鍵查找方法

          new LocationKey(zipCode)key中的一個(gè)構(gòu)造方法

           

          public ItemVo[] getAllItems(){

              final String itRef="java:comp/env/ejb/Item";  ItemVo[] itemVos=null;

                  try{    Context ctx=new InitialContext();

                      ItemLocalHome itemHome=(ItemLocalHome)ctx.lookup(itRef);

                      Collection items=itemHome.findAll();//home中添加查找這個(gè)數(shù)據(jù)庫的方法

                      if(items!=null){

                          itemVos=new ItemVo[items.size()];

                          int i=0;

                          for(Iterator it=items.iterator();it.hasNext();i++){

                              ItemLocal item=(ItemLocal)it.next();    ItemVo vo=new ItemVo();

                              vo.setItemId(((ItemKey)item.getPrimaryKey()).getItemid());

                              vo.setName(item.getName()); itemVos[i]=vo;} }

                  }catch(NamingException ne){ throw new EJBException(ne);

                  }catch(FinderException fe){return new ItemVo[0];}   return itemVos; }

           

          13創(chuàng)建Web:添加Web Module對(duì)SalesValueObjects projectEJB Module的依賴

          14.添加Web Module對(duì)EJB的引用:

          打開“Web Development Descriptor”(WEB-INF/web.xml),切換到“References


          絕大多數(shù)情況下web采用了struts,可以在action中l(wèi)ookup homeobject.

          posted on 2007-09-13 00:13 mrklmxy 閱讀(1272) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 定州市| 车致| 沂源县| 平安县| 黄梅县| 河西区| 吴旗县| 海门市| 大埔区| 巢湖市| 越西县| 辽阳县| 晋宁县| 扎鲁特旗| 福州市| 聊城市| 南澳县| 邹城市| 永靖县| 祁连县| 江达县| 晴隆县| 鹤山市| 东海县| 大同市| 广安市| 盖州市| 花莲市| 泌阳县| 七台河市| 久治县| 海阳市| 工布江达县| 含山县| 景宁| 高阳县| 洮南市| 政和县| 石渠县| 宾川县| 铁岭市|