国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

EJB實(shí)質(zhì)問題

2019-11-18 12:36:18
字體:
供稿:網(wǎng)友

  為什么要使用EJB?
  ================
  
  EJB最大的誘人之處是她把應(yīng)用程序和服務(wù)器分開了,我們?cè)僖膊挥煤湍切┓?wù)器上的復(fù)雜的資源打交道了,什么數(shù)據(jù)庫,什么進(jìn)程,線程,什么安全權(quán)限,什么套接字,都見鬼去吧,我們只需要專著于我們的商業(yè)邏輯的實(shí)現(xiàn)了.
  
  ==========
  EJB的實(shí)質(zhì)?
  ==========
  
  EJB實(shí)際上是SUN的J2EE中的一套規(guī)范,并且規(guī)定了一系列的API用來實(shí)現(xiàn)把EJB概念轉(zhuǎn)換成EJB產(chǎn)品.EJB是BEANS,BEANS是什么概念,那就是得有一個(gè)容納她,讓她可勁造騰的地方,就是得有容器.EJB必須生存在EJB容器中.這個(gè)容器可是功能強(qiáng)大之極!她首先要包裝你BEAN,EJB的客戶程序?qū)嶋H上從來就不和你編寫的EJB直接打交道,他們之間是通過HOME/REMOTE接口來發(fā)生關(guān)系的.它負(fù)責(zé)你的BEAN的所有的吃喝拉薩睡,比如BEAN的持續(xù)化,安全性,事務(wù)治理...
  
  =============
  EJB服務(wù)器產(chǎn)品
  =============
  
  各個(gè)WEB服務(wù)器開發(fā)商基本上都在他們WEB服務(wù)器中新捆綁了EJB容器,或者叫EJB服務(wù)器.其中最簡(jiǎn)單也是最根本的是J2EE開發(fā)環(huán)境帶的J2EE的EJB容器,它很好的和J2EE的HTTP服務(wù)器和Servlet引擎一起構(gòu)筑了一個(gè)很好的運(yùn)行環(huán)境,由于配置簡(jiǎn)單,功能強(qiáng)大,因此成為我的最愛.另外象BEA的Weblogical是值得推薦的一個(gè)產(chǎn)品,它的WEB服務(wù)器功能相當(dāng)強(qiáng)大,是當(dāng)今很多網(wǎng)站構(gòu)筑的理想WEB服務(wù)器,它也已經(jīng)加入了EJB的行列,在EJB方面有著不俗的表現(xiàn).InPRise的IAS更是一個(gè)功能強(qiáng)大的WEB服務(wù)器,同樣,也嵌入了EJB容器,加之與本公司的JBuilder的無接縫結(jié)合,更使它人氣攀升.
  還有象IBM的WebSphere也不錯(cuò),不過Apache是否已經(jīng)搭載了EJB容器,我不太清楚.
  另外,推薦一個(gè)EJBoss,是一個(gè)完全免費(fèi)的EJB服務(wù)器,而且是原代碼公開的.
  
  ========================
  EJB容器如何包裝你的BEAN.
  ========================
  
  這年頭沒有天上掉餡餅的好事情,EJB也不例外,你想讓EJB容器替你治理你編寫的EJB的吃喝拉薩睡,憑什么?!憑xml描述子,你通過一個(gè)XML文件告訴EJB容器BEAN的相關(guān)配置信息,比如我的EJB的HOME接口和REMOTE接口是哪一個(gè)類,比如我的EJB的別名(實(shí)際上是JNDI名稱)叫什么,比如我的EJB是否是實(shí)體類型的EJB還是對(duì)話類型的EJB,比如告訴容器替我治理我的實(shí)體EJB中哪些自段,......總之,你得跟咱們的EJB大總管----EJB容器把所有都交代清楚.這樣,剩下的,就看EJB容器的了!!!
  你是不是總共寫過3個(gè)文件,BEAN定義,HOME接口定義,ROMOTE接口定義,
  當(dāng)你DEPLOY他們時(shí),容器會(huì)
  (1).首先根據(jù)HOME和REMOTE接口生成他們的實(shí)現(xiàn)代碼,我們不妨叫做HOME_IMPL和REMOTE_IMPL,
  (2).然后,利用RMIC產(chǎn)生HOME_IMPL和REMOTE_IMPL的STUB和SKELETON文件,2X2一共生成4個(gè)文件.
  (STUB和SKELETON請(qǐng)參見RMI的相關(guān)概念)
  如此這般,最后,在服務(wù)器上,一共有
  BEAN
  HOME_IMPL
  REMOTE_IMPL
  HOME_STUB
  HOME_SKELETON
  REMOTE_STUB
  REMOTE_SKELETON
  7文件,才能讓EJB工作起來.
  (3).生成實(shí)體EJB對(duì)應(yīng)的數(shù)據(jù)庫的庫表
  (4).注冊(cè)你的EJB到JNDI服務(wù)
  
  ===============================================================
  為什么除了寫B(tài)EAN,還得寫接口文件,而且干嘛要HOME和REMOTE兩個(gè)接口.
  ===============================================================
  
  我攪著吧,這兩個(gè)接口完全是可以合并成一個(gè)接口的,其實(shí)他們的作用都只是一個(gè)接口,為了讓那人家SUN干嗎還拆成兩個(gè)呢?我想,正如SUN所說的,為了將一些容器相關(guān)操作和客戶商業(yè)方法分開,什么意思?說開了吧,HOME用來規(guī)范容器相關(guān)的操作方法,REMOTE負(fù)責(zé)專心致志的定制商業(yè)方法,而我們的BEAN才是最終的邏輯實(shí)現(xiàn)者.
  還是不明白?沒關(guān)系,我在說的細(xì)些,
  舉例說明:
  把我想象成一個(gè)BEAN,HOME接口就是我們家人的命令,REMOTE接口就是我們單位的領(lǐng)導(dǎo)的命令,我們家人的命令決定了我如何吃喝拉薩睡,領(lǐng)導(dǎo)的命令決定了我如何做一些真正的工作,請(qǐng)注重這里我使用了"決定"這個(gè)字眼,
  我并沒有說我們家人,而是說了我們家人的命令,這個(gè)命令的含義就是接口,不是類,而我這個(gè)BEAN卻是個(gè)類!還有,BEAN類不實(shí)現(xiàn)REMOTE和HOME接口,記住!記住!
  
  =========
  EJB的分類
  =========
  
  EJB分為實(shí)體(Entity)EJB和對(duì)話(session)EJB,
  
  >>>>>>實(shí)體EJB:>>>>>>對(duì)話EJB<<<<<<<
  
  對(duì)話EJB根本根本不和數(shù)據(jù)庫打交道,為什么,因?yàn)樗静挥眯蛄谢?他只負(fù)責(zé)來完成一些邏輯操作,比如算個(gè)帳什么的.
  為了和實(shí)體EJB較勁,他也一口氣生了兩個(gè)兒子,
  a.有狀態(tài)(sessionful)對(duì)話EJB
  他就跟servlet中的session對(duì)象似的,可以保存用戶的session相關(guān)信息,而且他僅僅被一個(gè)用戶的一次session所使用,不和別人共享,我管他叫對(duì)話,不過這"對(duì)話"翻出來這是夠難聽的,還不如就叫他session呢!
  b.無狀態(tài)(sessionless)對(duì)話EJB
  這個(gè)東東是最簡(jiǎn)單的EJB,他是可以被多個(gè)用戶共享,注重!我所說的共享是指實(shí)例的共享!
  
  
  ======================================
  一個(gè)BEAN治理持續(xù)化的實(shí)體EJB(BMP)小例子
  ======================================
  
  說了半天了,大家珍貴的腦資源恐怕被我消耗的差不多了,好,讓我們來剖析一個(gè)BEAN治理持續(xù)化的實(shí)體EJB(BMP)吧.
  
  -----------------------看看REMOTE接口------------------------------
  public interface Account extends EJBObject {//必須從EJBObject繼續(xù)
  //這些都是商業(yè)方法,而且這里寫了的,必須在BEAN中都實(shí)現(xiàn)
  public void deposit(double amt) throws RemoteException;
  public double withdraw(double amt) throws AccountException, RemoteException;
  public double getBalance() throws RemoteException;
  public String getOwnerName() throws RemoteException;
  public void setOwnerName(String name)throws RemoteException;
  }
  
  -------------------------看看HOME接口---------------------------------
  public interface AccountHome extends EJBHome {
  //這聲明了create函數(shù),由于是BMP,所以必須在BEAN中實(shí)現(xiàn)一個(gè)叫ejbCreate的對(duì)應(yīng)函數(shù)
  Account create(String accountID, String ownerName) throws CreateException, RemoteException;
  
  //按主鍵查詢
  //由于是BMP,所以必須在BEAN中實(shí)現(xiàn)一個(gè)叫ejbFindByPrimaryKey的對(duì)應(yīng)函數(shù)
  public Account findByPrimaryKey(AccountPK key) throws FinderException, RemoteException;
  
  //按其中的Name字段查詢
  //由于是BMP,所以必須在BEAN中實(shí)現(xiàn)一個(gè)叫ejbFindByOwnerName的對(duì)應(yīng)函數(shù)
  public Account findByOwnerName(String name) throws FinderException, RemoteException;
  }
  
  ---------------------------看看BEAN-----------------------------------
  public class AccountBean implements EntityBean {
  //三個(gè)PUBLIC字段,他們將來對(duì)應(yīng)庫表的三個(gè)字段
  public String accountID
  public String ownerName;
  public double balance;
  
  //----HOME中聲明的create方法的影射實(shí)現(xiàn)
  //由于是BMP,所以必須自己來負(fù)責(zé)實(shí)例創(chuàng)建時(shí)實(shí)例到數(shù)據(jù)庫的影射
  public AccountPK ejbCreate(String accountID, String ownerName) throws CreateException, RemoteException {
  PreparedStatement pstmt = null;
  Connection conn = null;
  try {
  this.ownerName = ownerName;
  this.balance = 0;
  conn = getConnection();
  pstmt = conn.prepareStatement("insert into accounts (id, ownerName, balance) values (?, ?, ?)");
  pstmt.setString(1, accountID);
  pstmt.setString(2, ownerName);
  pstmt.setDouble(3, balance);
  //看這里,看這里!插進(jìn)去了...
  pstmt.executeUpdate();
  return new AccountPK(accountID);
  }catch (Exception e) {
  throw new CreateException(e.toString());
  }finally {
  try {
  pstmt.close();
  conn.close();
  }catch (Exception e) { }
  }
  }
  
  //----HOME中聲明的findByOwnerName方法的影射實(shí)現(xiàn)
  //由于是BMP,所以必須自己來完成按照Name字段查找的工作
  public AccountPK ejbFindByOwnerName(String name) throws FinderException, RemoteException {
  PreparedStatement pstmt = null;
  Connection conn = null;
  try {
  conn = getConnection();
  pstmt = conn.prepareStatement("select id from accounts where ownerName = ?");
  pstmt.setString(1, name);
  //看看看!找上了,根據(jù)名稱...
  ResultSet rs = pstmt.executeQuery();
  rs.next();
  String id = rs.getString("id");
  pstmt.close();
  conn.close();
  return new AccountPK(id);
  }catch (Exception e) {
  throw new FinderException(e.toString());
  }finally {
  try {
  pstmt.close();
  conn.close();
  }catch (Exception e) { }
  }
  }

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 赤壁市| 县级市| 潼关县| 汉寿县| 绥中县| 曲靖市| 新兴县| 临汾市| 沈丘县| 临夏市| 绥德县| 广平县| 乐至县| 梅州市| 常宁市| 凉山| 兰西县| 庆安县| 通江县| 兰坪| 安庆市| 略阳县| 岳阳县| 灵台县| 铁力市| 威远县| 大荔县| 肇庆市| 咸丰县| 靖江市| 商河县| 鄂伦春自治旗| 易门县| 德化县| 海门市| 吉林省| 枝江市| 钟山县| 老河口市| 老河口市| 招远市|