投影片 1

Inprise Application Server 4
JBuilder 3.5
開發 Enterprise JavaBean

Agenda
Java 2 Platform Enterprise Edition ( J2EE ) 概觀
Enterprise JavaBean ( EJB ) 介紹
Inprise Application Server 簡介
Workshop 實作部分
EJB 實作基本觀念
以 JBuilder 3.5 實作 Session Bean
分發 Session Bean 至 Inprise Application Server 4
以 JBuilder 3.5 實作用戶端應用程式使用 Session Bean

Java 2 Platform
Java 2 Platform, Standard Edition ( J2SE )
提供基礎 Java 開發工具,執行環境與 API
JDK 1.2 , JDK 1.3 開發 Java Applet , Java Application 以及 JavaBean
Java 2 Platform, Micro Edition ( J2ME )
經過最佳化,適用於消費性電子產品,嵌入式系統所使用的 Java 開發工具,執行環境與 API

Java 2 Platform
Java 2 Platform, Enterprise Edition ( J2EE )
J2EE 是由 Sun Microsystems 公司所提出之一組技術規格,規劃企業用戶以 Java 2 技術開發,分發,管理多層式應用架構之伺服器端軟體平台
是多項技術規格,而非特定產品名稱
獲得眾多廠商支持
Inprise/Borland,BEA,IBM,Oracle,Sybase,IONA,SilverStream 等超過 25 廠商提供 J2EE 解決方案
Java 跨越作業平台執行優勢適合伺服器端應用

J2EE 主要技術規格

J2EE 主要技術規格
EJB ( Enterprise JavaBean )
EJB 1.1 規格定案於 1999 年 12 月
Java 伺服器端的軟體元件 ( Component ) 規格
提供軟體系統廠商與企業應用程式開發人員間共同遵循之 Java 軟體元件標準
J2EE 中核心規格,整合 J2EE 各項技術提供完整企業解決方案

J2EE 主要技術規格
RMI ( Remote Method Invocation )
Java 程式與程式間物件相互呼叫方法的機制
可以跨越網路間通訊
 RMI – IIOP
RMI – IIOP 是將 RMI 實作於 CORBA IIOP 通訊協定之上的延伸規格
提供了 Java 與 CORBA 規格間的整合能力

J2EE 主要技術規格
Servlets
類似 CGI 運用 Java 技術的 Web Server 端延伸模組,可透過 HTTP 通訊協定利用 HTML/XML 與 Web Browser 溝通
JSP ( Java Server Page )
簡化 Servlets 開發過程的 Scripting Language,執行時將轉換為 Servlets

J2EE 主要技術規格
JDBC ( Java Database Connectivity )
Java 存取資料庫標準與 Class API
定義 4 種類型 JDBC Driver
JDBC 2 增添 2 Phase commit 與 X/Open XA 支援
JNDI ( Java Naming and Directory Interface )
透過網路尋找 Java 元件或資源的介面

J2EE 主要技術規格
JTS ( Java Transaction Service )
Java 對應 CORBA OTS ( Object Transaction Service ) 規格的一組管理交易的服務,以確保不同廠商間的資料庫或交易伺服器能夠協同運作
JTA ( Java Transaction API )
提供開發人員使用 JTS 掌控交易的一組 API Class, 涵蓋了 X/Open XA 交易管理與開發人員自訂之交易管理

J2EE 主要技術規格
JMS ( Java Messaging Service )
定義 Java 程式間非同步 ( Asynchronous ) 傳遞的機制,提供類似 IBM MQ Series, Microsoft Queue 等產品對應服務.
EJB 1.1 規格尚未與 JMS 緊密整合
Java IDL
為 Java 提供 CORBA IDL 支援,以便透過 CORBA 與其它程式語言整合

J2EE 主要技術規格
XML ( Extensible Markup Language )
W3C 組織定義之資料交換格式,Sun Microsystems 提供存取此格式的 Java API Class
被運用於 J2EE 中多項技術 ( EJB , JSP … ) 中
Java Mail
不受限於通訊協定與伺服器平台,定義 Java 發送電子郵件的一組服務

J2EE 主要技術規格
Connectors
提供 Java 整合 mainframe 上現有系統 ( 例如 IBM CICS ) 或企業內大型 ERP 應用系統 ( 例如 SAP ) 能力
將納入 EJB 2.0 規格中

J2EE 多層應用之軟體架構

EJB 定義
“The Enterprise Java Beans Architecture
is a component architecture for the development
 and deployment of object oriented distributed
 enterprise-level applications”

EJB 與 CORBA 間的關係
皆是分散式軟體元件的標準
EJB 許多觀念衍生自 CORBA
Sun Microsystems 是 OMG 組織重要成員
EJB 規格可以與 CORBA 相容
CORBA 用戶端應用程式透過 RMI-IIOP 使用 EJB
RMI-IIOP 用戶端應用程式可以使用 CORBA 物件
主要 CORBA 系統廠商皆已經進入 EJB 市場
Inprise/Borland,IBM,IONA,BEA …

EJB 與 CORBA 間的關係
CORBA 相較於 EJB 優勢之處
規格制定掌控於 OMG 組織而非單一公司
支援多種程式語言
完備 CORBA COS Service
CORBA 相較於 EJB 弱勢之處
新規格形成速度緩慢
學習難度較高,開發成本高
不同廠商間伺服器端解決方案未必完全相容

EJB 架構中各角色之分工
Bean Provider
了解特定領域或行業別專業知識,熟悉 Java 分散式物件技術,提供可重複使用的 EJB 元件的廠商或專家
Application Assembler
組合運用 EJB 元件撰寫應用程式之 Java 開發人員
Deployer
規劃,配置,分發 EJB 元件至網路上多台 EJB Server/Container 中的技術人員
System Administrator
日常  EJB Server/Container 系統管理人員
EJB Server/Container Provider
提供 EJB Server/Container 專業系統廠商

EJB 架構及角色

EJB 開發流程

EJB 開發流程

EJB 類型

Session Beans
定義
a Session Bean is an extension of the Client that creates it
Session Bean 生命週期即為應用程式叫用此 EJB 所建立之 Session 的生命週期,當 EJB Server/Container 關閉或當機即喪失所有資料及狀態
適合實作 Business Logic , Business Rule 的 EJB
能夠具備狀態 ( Stateful ) 或不具狀態 ( Stateless )
具備交易 ( Transactional ) 處理能力

Stateless Session Beans
最單純的 EJB 類型
EJB 不維護應用程式與 EJB 間方法呼叫往返時任何狀態 ( State )
應用程式必須自行負責維護狀態
單一 EJB 可被多個應用程式共用,任何時刻此類 EJB 皆可被應用程式叫用
具備延展性,可重複使用性佳, EJB 在 Container 中易於被 Pooled

Stateful Session Beans
EJB 會維護應用程式與 EJB 間方法呼叫往返時任何狀態 ( State )
狀態 ( State ) 被儲存於 EJB Server 端
邏輯上 EJB 與應用程式間採 1 對 1 的服務方式
EJB Container 可將記憶體中久未被使用的 EJB 自動鈍化 ( Passivated ),並依照 Java Object Serialization 規則將狀態儲存至磁碟, 當該 EJB 再被叫用時 EJB Container 自動活化 ( Activated ) 此 EJB 並載入之前儲存的狀態

Entity Beans
以物件形式展現永續類型 ( Persistent Data ) 資料的一種 EJB, 資料可能儲存於資料庫,檔案系統或其它永續類型儲存媒體
可被多個應用程式所共享共用
Entity Bean 生命週期與叫用之應用程式或 EJB Server/Container 無關,當 Server/Container 關閉或當機不會喪失資料
具備交易 ( Transactional ) 處理能力
每個 Entity Bean 都必須有一個主鍵物件 ( Primary Key Object ) 以便辨識與使用

Bean Managed Entity Beans
Bean Provider 必須負責為此類 Entity Bean 實作下列四個方法
ejbCreate ( 相當於 SQL 之 insert )
ejbLoad ( 相當於 SQL 之 select )
ejbRemove ( 相當於 SQL 之 delete )
ejbStore ( 相當於 SQL 之 update )

Container Managed Entity Beans
EJB container 必須負責為此類 Entity Bean 實作 ejbLoad,ejbRemove,ejbCreate,ejbStore 四個方法
Entity Bean 儲存於資料庫或其它儲存媒體時, Container 提供物件與關聯式資料對應 (object-to-relational mapping ) 能力

Inprise Application Server 4
同時支援 J2EE 與 CORBA 的企業級 Application Server
可承載 Java/C++ CORBA 元件與 Java EJB 元件
具備容錯能力
自由規劃配置軟體元件所在位置
具備延展性
高執行效能
支援多種作業平台
支援 Windows NT/2000,Solaris,Linux
陸續推出 HP-UX 與 AIX 平台版本
與 Borland JBuilder 3.5 Enterprise 緊密整合

Inprise Application Server 4
以 CORBA 為基礎,完整實作 J2EE 主要規格
內建 VisiBroker 4.0 CORBA ORB
實作 Java IDL 與 RMI-IIOP
完整支援 EJB 1.1 規格之 EJB Server/Container
內建支援 Java Servlets 與 JSP 之 Java Web Server
實作 JNDI 於 CORBA COS Naming Service
實作 JTS/JTA 於 CORBA Object Transaction Service
陸續推出 JMS 以及 Security Service
圖形化 EJB 元件管理及分發工具
提供 JDataStore 可儲存 Entity Bean

Inprise Application Server 4
所涵蓋之 J2EE 技術規格

Workshop 實作部分
EJB 實作基本觀念
以 JBuilder 3.5 實作 Session Bean
分發 Session Bean 至 Inprise Application Server 4
以 JBuilder 3.5 實作用戶端應用程式使用 Session Bean

Enterprise Bean Class
必須實作 EJB interface 的 Java Class
EJB interface 可能為下列兩者之一:
javax.ejb.SessionBean
javax.ejb.EntityBean
此 Java Class 提供實作 Business Logic 於 public methods 中供應用程式叫用
命名慣例
您欲撰寫之元件名稱 + ‘Bean’
例如 . Ping 元件即為 PingBean

Enterprise Bean Class
Enterprise Bean Class 內除了您自訂實作 Business Logic 之 public method 外另有下列供 Container 叫用 call back method :
public void ejbCreate ( )
public void ejbRemove ( )
public void ejbActivate ( )
public void ejbPassivate ( )
public void setSessionContext ( SessionContext ctx )

Enterprise Bean Class

EJB Remote Interface
Remote Interface 繼承自 javax.ejb.EJBObject
Remote Interface 定義一個提供用戶端應用程式叫用 Interface
必須包含 Enterprise Bean 中實作 Business Logic 之 public method 的宣告
所有方法都將產生 Remote Exception 以預防網路間通訊發生非預期之狀況
可由 JBuilder 3.5 自動產生介面程式碼或自行撰寫
命名慣例
Enterprise Bean 名稱去掉 ‘Bean’
例如. 若 Enterprise Bean 名為 PingBean 則對應之 Remote Interface 命名為 Ping

EJB Remote Interface

EJB Home Interface
Home Interface 繼承自 javax.ejb.EJBHome
用戶端應用程式使用 EJB 的機制採用 Design Pattern 中常見的 Factory Pattern
Home Interface 中提供一個重要的方法 – create 來建立 Enterprise Bean
Home Interface 中的 create method 會回傳對應之 Remote Interface 的型態
可由 JBuilder 3.5 自動產生介面程式碼或自行撰寫
命名慣例
Remote Interface 名稱加上 ‘Home’
例如 Remote Interface 名為 Ping  則對應之 Home Interface 名為PingHome

EJB Home Interface

EJB Object
EJB Object 實作了 Remote Interface
Interface 內 Method 實作程式碼由 EJB Container 產生
EJB Object 由 Container 所產生,扮演 Proxy 角色,用戶端應用程式透過它來使用您所實作 Enterprise Bean
您所實作 Enterprise Bean 之 public method 永遠不會被用戶端應用程式直接呼叫

Home Object
Home Object 實作了 Home Interface
Interface 內 Method 實作程式碼由 EJB Container 產生
Home Object 透過 JNDI 取得 Home Object Reference
Home Object 之 create method 負責通知 Container 準備建立您所實作之 Enterprise Bean 以及 EJB Object,並且回傳 EJB Object 之 reference
您所實作 Enterprise Bean 永遠不會被用戶端應用程式直接建立

EJB Object 與 Home Object

為什麼用戶端應用程式不直接呼叫 Enterprise Bean ?
運用 Factory , Proxy 等 Design Pattern 讓 EJB Container/Server 有機會提供
伺服器系統資源管控 ( 例如 Object Pooling )
EJB 生命週期管控
EJB 狀態 ( State ) 管控
交易管理
權限管制
………….

啟動 EJB Container 以及 JNDI 伺服器

分發 EJB 至 EJB Container 中

Container 實作 Home Object 並向 JNDI 伺服器註冊

用戶端應用程式在 JNDI 伺服器中找到 Home Object 位置

用戶端應用程式呼叫 Home Object 的 create 方法

用戶端應用程式呼叫 EJB Object 所提供的方法

Workshop 實作部分所牽涉之J2EE 技術規格

基本環境設定
( Windows Platform )
先安裝 JBuilder 3.5 Enterprise 版於 C:\JBuilder35
接著安裝 Inprise Application Server 4 於 C:\inprise\appserver 並執行中文環境修補程式
為 JBuilder 3.5 加上 Enterprise JavaBean Wizard
關閉 JBuilder 3.5
以編輯器開 C:\JBuilder35\bin\jbuilder.config
加上 addjars C:\inprise\appserver\lib

基本環境設定
( Windows Platform )
為 JBuilder 3.5 設定妥 VisiBroker CORBA ORB
啟動 JBuilder 3.5 並
選取功能表 Tools | CORBA Setup …
Select a configuration:
    選取 VisiBroker 並按下
    右方的 Set … 按鈕

基本環境設定
( Windows Platform )
鍵入 VisiBroker ORB 相關工具所在路徑,由於 Inprise Application Server 4 內建了 VisiBroker 4.0 for Java , 可直接鍵入 C:\inprise\appserver\bin
依序按下 OK 按鈕確認動作

基本環境設定
( Windows Platform )
為 JBuilder 3.5 設定妥 Inprise Application Server 相關 Library
選取功能表
Project | Default project properties …
選取 Require Libraries 頁次
按下 Add … 按鈕準備加入
相關函式庫,按下按鈕後將出
現 Select one or more libraries 對
話方塊,按下右方 New… 按鈕,
準備為 Inprise Application Server
定義一個新的函式庫

基本環境設定
( Windows Platform )
按下右方 New… 按鈕後將出現 Edit Library 對話方塊,請在 Name : 編輯方塊中為此函式庫定義一個識別名稱,例如 “ Inprise Application Server 4” 並以右方 Add … 按鈕將位於 C:\inprise\appserver\lib 內的所有 .jar 檔案加入清單方塊中
依序按下 OK 按鈕確認動作

以 JBuilder 開發 Session Bean
選取功能表 File | New project… 建立一個名為 simple.jpr 的專案檔
選取功能表 File | New …
      出現右圖的 Object Gallery
      對話方塊,在 Enterprise 頁
      次選取 Enterprise JavaBean
      並按下 OK 按鈕

以 JBuilder 開發 Session Bean
按下 OK 按鈕後出現如圖所示的 Enterprise JavaBean Wizard 對話方塊,依照前述命名建議,將 Class Name 編輯方塊內建入PingBean
並在 Options 選項
按鈕選取
Session Bean 完成
後按下 OK 按鈕
此精靈將產生
PingBean.java 程式
碼骨架

以 JBuilder 開發 Session Bean
欲使用 Inprise Application Server 4 開發 EJB 至少必須包含之前自行定義函式庫
Inprise Application Server 4
以及 JBuilder 預先定義妥之
Enterprise JavaBeans

以 JBuilder 開發 Session Bean
在 PingBean.java 程式碼加上自訂的方法 getTime
public class PingBean implements SessionBean {
private SessionContext sessionContext;
// 加入自訂的方法並實作
public long getTime( ) {
    return ( System.currentTimeMillis ( ) ) ; // 回傳系統時間
}
  ……………..
}

以 JBuilder 開發 Session Bean
選取功能表 Wizards | EJB Interfaces … 出現如圖的對話方塊此精靈將依據 PingBean.java 內容自動產生
Remote Interface
Home Interface
的原始程式碼

以 JBuilder 開發 Session Bean
勾選欲公開給用戶端應用程式使用的方法並按下 Finish 按鈕, JBuilder 3.5 將依照命名慣例產生名為
Ping.java
以及
PingHome.java
兩個介面原始
程式碼檔案

以 JBuilder 開發 Session Bean
此時 simple.jpr 專案檔中包含了下列檔案
ejb-jar.xml
通用的 EJB Deployment descriptor
Ping.java
Remote Interface 程式碼
PingBean.java
真正實作封裝應用邏輯的 Enterprise Bean 程式碼
PingHome.java
Home Interface 程式碼
Simple.html
說明專案檔的 HTML 檔案 ( 非必要檔案 )

以 JBuilder 開發 Session Bean
編譯及儲存整個專案檔 simple.jpr
選取功能表
Wizards | Deployment
出現如圖所示對話方
塊,我們將所產生的
主要檔案打包成名為
simple.jar 的檔案,完成
後按下 Next 按鈕

以 JBuilder 開發 Session Bean
按下 Next 按鈕出現如圖所示的對話方塊
由於支援 Java 2 的 Inprise Application Server 4 已經內建 javax package
,不必勾選分發 javax
package 以節省空間,接
著按下 Finish 按鈕完成
分發動作產生 simple.jar

分發 Session Bean 至 Inprise Application Server 4
啟動 Inprise Application Server 4
執行 Inprise EJB Deployment Descriptor Editor
選取功能表 File | Open 開啟將前述步驟產生的 simple.jar

分發 Session Bean 至 Inprise Application Server 4
選取左方清
單方塊中
Ping 項目並
在 JNDI
Bean Name
的編輯方塊
中鍵入辨識名稱 “LaLaLa” , 未來 JNDI 將以此名稱代表該 EJB

分發 Session Bean 至 Inprise Application Server 4
如圖選取左方清單方塊中 Container Transaction 項目,接著按下滑鼠右鍵選取 New Container Transaction 以設定此 EJB 交易支援狀態

分發 Session Bean 至 Inprise Application Server 4
選取功能表 File | Verify 檢查 EJB Deployment Descriptor  由於未產生 RMI-IIOP Stub 會有 8 個警告訊息,可
以暫時忽略,接
著選取功能表
File | Save 儲存
全部編修內容,
全部動作完成後
結束此程式

分發 Session Bean 至 Inprise Application Server 4
執行 Inprise Application Server Console
選取功能表 Tools | Deployment Wizard 出現如圖的對話方塊,運用 Browse 按鈕選取之前已經編修過的simple.jar 檔案,
由於之前並未
產生 RMI-IIOP
Stub 請勾選
Generate Stub
核取方塊,完成後
按下 Deploy Jar To
Container 按鈕

分發 Session Bean 至 Inprise Application Server 4
分發完成後可在 Inprise Application Server Console
看到
Ping 這個
EJB

分發 Session Bean 至 Inprise Application Server 4
選取功能表 Tools | Generate Client Jar 出現如圖的對話方塊, Source Jar File 編輯方塊請鍵入 simple.jar 而 Save Client As 編輯方塊則鍵入名為 simpleclient.jar 可供用戶端應用程式叫用的函式庫
,按下 Generate
按鈕後即開始
產生該檔案

以 JBuilder 實作用戶端應用程式使用 Session Bean
啟動 JBuilder 3.5 選取功能表 File | New project… 建立名為 simpleclient.jpr 的專案檔
選取功能表 File | New …
出現右圖的 Object Gallery
     對話方塊,在 New 頁
     次選取 Application 並按下
OK 按鈕

以 JBuilder 實作用戶端應用程式使用 Session Bean
依照 Application Wizard 指示設定用戶端應用程式基本外觀

以 JBuilder 實作用戶端應用程式使用 Session Bean
為 JBuilder 3.5 設定妥使用 PingBean 這個 EJB 所需要的 Library
選取功能表
Project | project properties …
選取 Require Libraries 頁次
按下 Add … 按鈕準備加入
相關函式庫,按下按鈕後將出
現 Select one or more libraries 對
話方塊, 按下 New… 按鈕,為
叫用 PingBean 這個 EJB 定義
一個新的函式庫

以 JBuilder 實作用戶端應用程式使用 Session Bean
按下右方 New… 按鈕後將出現 Edit Library 對話方塊,請在 Name : 編輯方塊中為此函式庫定義一個識別名稱,例如 “ PingBean Client” 並以右方 Add … 按鈕將之前所產生的 simpleclient.jar 加入清單方塊中
依序按下 OK 按鈕確認動作

以 JBuilder 實作用戶端應用程式使用 Session Bean
欲使用 Ping 這個 EJB 至少必須包含之前自行定義的兩個函式庫
PingBean Client
Inprise Application Server 4
以及 JBuilder 預先定義妥之
Enterprise JavaBeans

以 JBuilder 實作用戶端應用程式使用 Session Bean
設計用戶端應用程式使用者介面
   Frame1.java

以 JBuilder 實作用戶端應用程式使用 Session Bean
開啟 Frame1.java 原始程式碼
欲使用 Ping 這個 EJB 請在程式碼中加入
import simple.*;
準備撰寫按鈕 jButton1 被按下後之處理程式碼
void jButton1_actionPerformed ( ActionEvent e ) {
// 叫用 Ping EJB 的程式碼將寫在此處
}

以 JBuilder 實作用戶端應用程式使用 Session Bean
try {
// 建立 JNDI 的 naming context
javax.naming.Context ctx = new javax.naming.InitialContext();
// 利用 JNDI Bean Name “LaLaLa” 取得 Home Object Reference
PingHome home = (PingHome) javax.rmi.PortableRemoteObject.narrow
( ctx.lookup( “LaLaLa“ ), PingHome.class ) ;
// 取得 EJB Object Reference
Ping ping = home.create ( ) ;
// 呼叫自訂方法 getTime 並將回傳值顯示於 jLabel1 內
      jLabel1.setText ( String.valueOf ( ping.getTime( ) ) ) ;
}
catch (Exception ex) {  //  撰寫錯誤處理程式碼
}

以 JBuilder 實作用戶端應用程式使用 Session Bean
執行用戶端應用程式,按下 Get Time 按鈕,呼叫 Ping EJB 的 getTime 方法取得系統時間

EJB 如何除錯 ?
完整步驟
http://www.inprise.com/devsupport/appserver/faq/jbuilder/DebuggingEJBsInStandaloneContainers.htm
簡易方法
EJB 程式碼中運用 System.out.print (“Debug Message”); 將除錯訊息及變數值輸出
輸出之訊息可利用 Inprise Application Server Console 開啟 EJB Containers | Logs | Event 直接觀看

參考資料
White Paper : EJB Development Using JBuilder 3.5 & Inprise Application Server 4.0
Copyright 2000 by Todd Spurling,Inprise/Borland Corp
Mastering Enterprise JavaBeans and the Java 2 Platform,Enterprise Edition
Copyright 1999  by Ed Roman,Wiley Computer Publishing
Enterprise JavaBeans™ Specification, v1.1
Copyright 1999 by Sun Microsystems, Inc.
Inprise Application Server Enterprise JavaBeans Programmer’s Guide
Copyright 2000 by Inprise/Borland Corp

投影片 84