跳到主要內容

Hello EJB 3.1!!

EJB 全名 Enterprise JavaBean,在 Java 平臺版圖中屬於 Java EE 的範疇,EJB 3.1 則包含在 2009 年 12 月 9 日 發佈的 Java EE 6 [1] 中。雖然 Java EE 6 已經發佈有一段時間了,截至目前為止能完整支援的只有 GlassFish [2],不過這是現在進行式,我相信很快就會有各廠的支援。
  1. Java EE 平臺有許多不同功能的套件,如:負責商業邏輯的 EJB、負責訊息服務的 JMS、負責顯示的 JSF... 等。在 EJB 3.0 後,除了提供新特性,更改進開發流程,原本必須使用 XML 進行設定的繁複作業,改以 Annotations 簡化。更多資料可參考 Wikipedia - Java EE 和 Wikipedia - EJB
  2. GlassFish 原為 Sun 發佈的 Open Source 專案,後來 Sun 被 Oracle 併購,現為 Oracle 所擁有。目前完整支援 Java EE 6 的平臺僅有 GlassFish,其它 Server,如:JBoss、WebLogic 僅有部份支援。

先說說 EJB 的種類吧!


在 EJB 3.1 的世界裡,EJB 分為兩類,一類是用來處理 request 的 Session Bean,另一類則是處理 message 的 Message-Driven Bean。而 Session Bean 又因功能、目的不同分成三種,個別為 Stateless Session Bean、Stateful Session Bean 及 Singleton Session Bean。這些 EJB 都運行 Server 的 EJB Container 中。

那麼,該如何撰寫 EJB 呢?


基本上和撰寫一般的 Java Bean 沒太多不同,差異在於必須以 Annotations 加註 EJB 的種類,Session Bean 必須 implements [1] 供其它 Java Code 呼叫時所使用的 Business Interface [2],而 Message-Driven Bean 則必須事先定義好對應的訊息,EJB Container 會在收到對應的訊息時自動觸發 Message-Driven Bean。
  1. 依照運行的 JVM 相同與否,Session Bean 必須去實作 Local(同 JVM,加註 @Local)或 Remote(不同 JVM,加註 @Remote)Interface。EJB 3.1 中,在同 JVM 運作的 Session Bean 可不必提供 Local Interface。
  2. Business Interface 其實就是加註了 @Local 或 @Remote 的 Java Interface。被稱為 Business Interface 的理由是 Session Bean 並非透過 new 來取得 Object,而是向 Server 查詢取得對應的 Proxy Object,該 Proxy Object 只能執行定義在 Interface 中的 Business Method,而非 Session Bean 中所有的 Public Method,故稱為 Business Interface。

看了這麼多定義,只能說模糊還是模糊,抽象還是抽象,不如直接動手做!就選最基礎的 Stateless Session Bean 作為今天的範例!
package idv.marsping.practice;

import javax.ejb.Remote;

@Remote
public interface MyFirstSLSBRemote {
    String hello();
}
這就是所謂的 Business Interface 了!
加註了 @Remote 代表實作此 interface 的 Session Bean,可被運作於不同的 JVM 上的 Java Code 呼叫。在這個 interface 之中只宣告了一個方法 hello,沒有輸入的參數,回傳的資料型態為 String。

package idv.marsping.practice;

import javax.ejb.Stateless;

@Stateless
public class MyFirstSLSB implements MyFirstSLSBRemote {
    public String hello() {
        return "Hello EJB 3.1!";
    }
}
叮咚~!這就是傳說中的 EJB 啦!!
加註了 @Stateless 代表這個類別被定義為 EJB 中的 Stateless Session Bean。承前所述,Session Bean 必須去實作 Business Interface,所以 MyFirstSLSB 實作了 MyFirstSLSB,並定義了 hello 方法,簡單的回傳字串 "Hello EJB 3.1!"。

看了例子應該清楚很多,其實 EJB 3.1 並沒有想像中的那麼難!
如果有興趣的話,可以去找找在 EJB 3.1 之前的 Code 是長什麼樣子,我唯一的感想是
=> 難怪沒有人想用!

什麼是 Stateless Session Bean?


講了這麼多,到底什麼是 Stateless Session Bean(以下簡稱 SLSB)?這邊的 State 代表狀態,而 Stateless 就是沒有狀態。這是什麼意思呢?對一個 Java Bean "A" 而言,在某個時間點所有 A 擁有的變數所存之數值,即代表 A 在該時間點的狀態,所以 Stateless 對 Java Bean 來說,就是不保證有這樣的狀態。
簡單來說,每次呼叫 SLSB 的方法,都應該把這個 SLSB 當成全新的 SLSB,因為 SLSB 並不保證其狀態。理由是雖然我們使用是同一個變數進行呼叫,但實際上底層在呼叫方法時,會到 EJB Container 中取回一個 SLSB,但是誰能保證這個 SLSB 就是我之前呼叫過的那個 SLSB 呢?這也就是為什麼會有另一種 EJB - Stateful Session Bean。

怎麼使用 Stateless Session Bean?


說來說去,終於輪到說怎麼用的時刻啦!
直接來看個範例!
package sampleejbtest;

import idv.marsping.practice.MyFirstSLSBRemote;
import javax.naming.InitialContext;

public class SampleEJBTest {
    public static void main(String[] args) throws Exception {
        InitialContext context = new InitialContext();
        MyFirstSLSBRemote ejb = (MyFirstSLSBRemote) context.lookup("idv.marsping.practice.MyFirstSLSBRemote");
      
        System.out.println(ejb.hello());
    }
}
為了向 GlassFish 的 EJB Container 查找我們要使用的 SLSB,我們必須先取得 InitialContext,由於 GlassFish 是跑在本機上,所以並沒有做額外的屬性設定(小提醒:記得要把 gf-client.jar 加入 classpath 中)。
接著,透過 lookup,查詢要使用的 SLSB。這個字串 "idv.marsping.practice.MyFirstSLSBRemote" 就是所謂的 JNDI Name,你問為什麼我會知道喔?給一個小提示,在部屬 EJB 時,可以看一下 GlassFish 的 Console,裡頭會出現關鍵字 JNDI,那些字串就是啦,雖然有好幾種不同的格式,但是效果都相同!
依照先前所說明的,我們只能透過 Business Interface 去操作 Session Bean,於是我們呼叫 hello 並印出來!

那麼結果到底如何呢?
Hello EJB 3.1!
如同預期!!真開心~終於結束了 Orz...

以上,就是我對 EJB 3.1 一點小小的心得分享~
什麼?你問我是用什麼開發的?喔喔!請愛用 NetBeans

留言

這個網誌中的熱門文章

引數?! 參數??!! 什麼鬼啊!!

我想這個不僅是只有我會遇到的問題, 大概也是所有 Programming 的人都有的疑惑 (應該是吧?) 什麼引數?? 什麼參數?? 天啊... 到底是誰翻譯的呀!!!! 就字面上來看... 講句實在話, 我真的不了解, 大概是學藝不精所致. 也許有些人認為 => 管它那麼多!! 寫得出來就好了!! 不過龜毛如我, 我還是想搞清楚定義是什麼!

Mac OS X 10.6 同步收取 Gmail, how?

在 Apple 官方的 Mac OS X 10.6 介紹網頁中, 雖然並沒有在內建的郵件軟體 - Mail 著墨太多. 但是實際上 Mail 也做了一些改善, 讓使用可以更方便, 而這篇文主要目的就是說明怎麼讓 Mail 與 Gmail 進行同步. 在過去使用郵件軟體收取電子郵件的使用經驗中, 往往都需要輸入很多資料, 什麼 "寄件伺服器" "收件伺服器" "通訊協定"... 等等等, 這對一般用戶來說, 只能說是災難. 畢竟沒學過那些專有名詞, 天曉得那是些什麼東西!? 而 Mac OS X 10.6 中的 Mail 不同了, 現在只需要輸入 Email 帳號及密碼, 軟體自動搞定細部設定! 有沒有這麼簡單!? 手邊有 Hotmail 的朋友可以試試看, 只要輸入帳號密碼, 10.6 的 Mail 就會幫你設定好其它需要設定的資料. 不過今天的主角是 Gmail 啦! 而要使用的是 Gmail 提供的 IMAP 的功能, 在使用前得先到 Gmail 中進行一些簡單的設定, 當然小弟也會說明這樣設定的理由 :) OK! Here we go!!!

世界第一! 臺灣的驕傲! iPod 全球最貴 XD!!??

2009 年 9 月 10 日 凌晨 1 點鐘, Apple 於美國舉行了 Apple Special Event September 2009 . 先說點題外話, 這場演說對 Apple 迷而言, 是久違的一場, 也不知道還能有幾場像這場一樣, 由 Steve Jobs 親自站臺. 這場演說的主題, 除了 iTunes 9, iPhone (iPod touch) OS 更新為 3.1 外, 就是 iPod 產品線的更新. 在看完發表會之後, 我去研究了一下新 iPod 的全球售價, 這也是這篇文章的重點, 蘋果臺灣的定價創下了新的紀錄- 套用一下最近常聽到的 Slogan 世界第一, 臺灣的驕傲, iPod 全球最貴!!??