SlideShare a Scribd company logo
– 另一個選擇



林信良, http://openhome.cc
議程
•   開發環境準備
•   實作進行方式
•   實作主題介紹
•   參考資源
開發環境準備
  Java Developer Killer…



         老
         梗
開發環境準備
•         Java SE Development Kit 6
    – http://java.sun.com/javase/downloads/index.jsp
               ?不!我們用不到。。XD

• NetBeans 6.5 Java Bundles
    – http://www.netbeans.org/downloads/index.html


• Apache OpenEJB 3.1
    – http://openejb.apache.org/download.html
開發環境準備
• 專案位置:
 – USER_HOME/workspace
 – 我的環境 c:/workspace
• OpenEJB 位置:
 – WORKSPACE/openejb-3.1
 – 我的環境 c:/workspace/openejb-3.1
開發環境準備
• 在 NetBeans 中新增 OpenEJB 程式庫
  – 開啟 NetBeans
  – 選單Tools LibrariesNew Library
    • Library Name: OpenEJB
    • Library Type: Class Libraries
    • OK
  – Add JAR/Folder…
    • 選取 OPENEJB_HOME/lib 下所有的 JAR
    • Add JAR/Folder
    • OK
  – OK
實作進行方式

50            可
分             作
鐘             啥
實作進行方式
• 每個實作 5 到 10 分鐘
• 觀念講解
• 講師示範
• Copy-and-Paste 實作
 - 複製程式片段(請留意檔名)
 - 貼到對應位置(請注意位置)


重點在組合。。XD
實作主題介紹
•   Hello! EJB!...Orz
•   EJB 單元測試
•   Resource 注入(以 MDB 為例)
•   Tomcat 與 EJB(一)
•   Tomcat 與 EJB(二)
•   Stand-alone Server(Optional)
Hello! EJB!…Orz
• 新建專案
 – 選單 FileNew ProjectJavaJava
   Application
 – Project Name: HelloEJB
 – Project Location: WORKSPACE
 – Finish
• 加入OpenEJB 程式庫
 – Libraries右鍵選單Add Library
   OpenEJB Add Library
Hello! EJB!…Orz
• 加入OpenEJB 程式庫
 – Libraries右鍵選單Add Library
   OpenEJB Add Library
Hello! EJB!…Orz
• 定義Session Bean Local介面
  – Source PackagesNewJava Interface
  – Class Name: HelloLocal
  – Package: helloejb(你的套件名)
• LAB_FILE/HelloEJB/HelloLocal.txt
Hello! EJB!…Orz
• 定義實作類別
  – Source PackagesNewJava Interface
  – Class Name: HelloImpl
  – Package: helloejb(你的套件名)
• LAB_FILE/HelloEJB/HelloImpl.txt
Hello! EJB!…Orz
• 接著是Glassfish?
Hello! EJB!…Orz
• EJB 也可以…

             輕量級
Hello! EJB!…Orz
• Local Server
   – OpenEJB can be embedded and treated as
     your very own personal EJB container.
• LAB_FILE/HelloEJB/Main-1.txt
Properties properties = new Properties();
properties.setProperty(
  Context.INITIAL_CONTEXT_FACTORY,
  "org.apache.openejb.client.LocalInitialContextFactory");
properties.put("openejb.home", "C:workspaceopenejb-3.1");
properties.put("openejb.configuration","openejb.conf");
Hello! EJB!…Orz
• openejb.conf
  – HelloEJBNewEmpty File
  – FileName: openejb.conf
• LAB_FILE/HelloEJB/openejb.conf.txt
  <openejb>
   <Deployments dir="C:workspaceHelloEJBbuildclasses" />
  </openejb>



  <openejb>
   <Deployments jar="C:workspaceSomewhereEJBModule1.jar" />
  </openejb>
Hello! EJB!…Orz
• LAB_FILE/HelloEJB/Main-2.txt
• 注意 JNDI 名稱
    – 本地介面:實作類別名稱附加Local名稱
    – 遠端介面:實作類別名稱附加Remote名稱

InitialContext context = new InitialContext(properties);
Object obj = context.lookup("HelloImplLocal");
Hello! EJB!…Orz
• 執行結果
 – XD......OK!
• 完成實作
 – SOLUTIONHelloEJB
EJB 單元測試
• 輕量級幹嘛?
                 單元
                 測試
EJB 單元測試
• 開啟專案PREPARED_PRJEJBUnitTest
 – (相依問題?你的OpenEJB位置可能不同!)
 – (如果你對NetBeans不熟,先把OpenEJB放
   到c:workspaceopenejb-3.1下)
• (建立測試案例)
 – (Test PackagesNewJUnit Test)
EJB 單元測試
• 建立測試案例
 – LAB_FILE/EJBUnitTest/HelloLocalTest-1.txt
 – LAB_FILE/EJBUnitTest/HelloLocalTest-2.txt
 – LAB_FILE/EJBUnitTest/HelloLocalTest-3.txt
• 執行測試案例
 – Test Packagestest.helloejb.HelloLocalTest
   Run File
EJB 單元測試
• 執行結果
 – Tests run: 1, Failures: 0, Errors: 0
• 完成實作
 – SOLUTIONEJBUnitTest
Resource 注入
             EntityManager
DataSource
   依選擇啟用資源
  Topic
                Queue
Resource 注入
• 以 Message-Driven Bean(MDB) 為例
• 開啟專案PREPARED_PRJResourceInjection
• 使用@Resource
  – 開啟Source Packageshelloejb.HelloImpl
  – LAB_FILEResourceInjectionHelloImpl-1.txt
  – LAB_FILEResourceInjectionHelloImpl-2.txt
• 定義Message-Driven Bean
   – 開啟Source Packageshelloejb.HelloMessage
   – LAB_FILEResourceInjectionHelloImpl-1.txt
   – LAB_FILEResourceInjectionHelloImpl-1.txt
Resource 注入
• 複製 openejb.conf
  – 切換 NetBeans 至 Files
  – 將LAB_FILEResourceInjectionopenejb.conf
    拖放至 ResourceInjection
• openejb.conf 中<Resource>
  – 用來定義 DataSource、JMS…
  – 本範例使用 ActiveMQ
 <Resource id=“XXX" provider=“OOO">
   ….
 </Resource>
Resource 注入
public class HelloImpl implements HelloLocal {
  @Resource(name="JmsConnectionFactory")
  private ConnectionFactory connectionFactory;
  …



<Connector id="JmsConnectionFactory“      …>
  ….
</Connector>
Resource 注入
• 執行測試案例
 – Test Packagestest.helloejb.HelloLocalTest
   Run File
• 執行結果
 – Tests run: 1, Failures: 0, Errors: 0
• 完成實作
 – SOLUTIONResourceInjection
Tomcat 與 EJB

JSP/Servlet

              +   EJB
Tomcat 與 EJB(一)
• Tomcat 上也可以用 EJB
• 將 openejb.war 部署至 Tomcat 上
  – NetBeans 會為使用者建 Cataline_Base
  – USER_HOMEnetbeans6.5apache-tomcat-
    6.0.18_basewebapps
• 在NetBeans 中啟動Tomcat
  – 切換至ServicesServersApache Tomcats右鍵
    Start
• 現在你可以在 Tomcat 中部署 EJB 了
  – http://localhost:8084/openejb/

     獲得資源注入的好��
Tomcat 與 EJB (一)
• 來寫個Tomcat上的Hello!EJB!。。Orz
• 新建專案
 – 選單 FileNew ProjectJava WebWeb
   Application
 – Project Name: HelloEJBTomcat
 – Project Location: WORKSPACE/
 – Next
 – Server: Apache Tomcat
 – Finish
Tomcat 與 EJB (一)
• 加入Java EE API 程式庫
 – Libraries右鍵選單Add JAR/Border
 – 選取OPENEJB_HOME/lib/javaee-api-5.0-1.jar
• 建立package
 – Source PackagesNewJava Package
 – Package Name: hellloejb
 – Finish
Tomcat 與 EJB (一)
• 複製先前寫好的Stateless Session Bean至
  helloejb中
  – SOLUTIONHelloEJBsrchelloejbHelloLocal.java
  – SOLUTIONHelloEJBsrchelloejbHelloImpl.java
• 寫個HelloServlet
  – Source PackageshelloejbNewServlet
  – Class Name: HelloServlet
  – Finish
Tomcat 與 EJB (一)
• 注入 EJB
public class HelloServlet extends HttpServlet {
  @EJB
  private HelloLocal hello;
  …




• 清空processRequest()方法
Tomcat 與 EJB (一)
• 使用 Stateless Session Bean
  – HelloServlet-2.txt
 ...
 out.println("<h1>" + hello.doHello("Orz...") + "</h1>");
 ...

• 執行 Web 應用程式
  – HelloEJBTomcatClear and Bulid
  – HelloEJBTomcatDeploy
  – Source Packageshelloejb.HelloServletRun
Tomcat 與 EJB (一)




• 完成實作
 – SOLUTIONHelloEJBTomcat
Tomcat 與 EJB (二)
• 可以定義遠端介面
• 讓 Session Bean 實作遠端介面
• 非 Tomcat 客戶端可以存取 Session Bean
 – INITIAL_CONTEXT_FACTORY
 – PROVIDER_URL
• 繼續上一個實作
 – (SOLUTIONHelloEJBTomcat)
Tomcat 與 EJB (二)
• 定義遠端介面
@Remote
public interface HelloRemote {
  public String doHello(String message);
}


• 讓 Session Bean 實作遠端介面
public class HelloImpl implements HelloLocal, HelloRemote {
  …
}
Tomcat 與 EJB (二)
• 在Services中關掉Tomcat,重新Clean、Build、
  Deploy
• 新建專案
  –   選單 FileNew ProjectJavaJava Application
  –   Project Name: HelloClient
  –   Project Location: WORKSPACE
  –   Finish
• 加入OpenEJB 程式庫
  – Libraries右鍵選單Add Library
    OpenEJB Add Library
Tomcat 與 EJB (二)
• 建立package
 – Source PackagesNewJava Package
 – Package Name: hellloejb
 – Finish
• 複製HelloEJBTomcat中的HelloRemote至
  HelloClient的helloejb中
Tomcat 與 EJB (二)
• 撰寫Main
    – LAB_FILEHelloClientMain.txt
• 對客戶端而言,EJB 現在部署在遠端
  Server 上
Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
   "org.apache.openejb.client.RemoteInitialContextFactory");
properties.put(Context.PROVIDER_URL,
   "http://127.0.0.1:8084/openejb/ejb");
InitialContext context = new InitialContext(properties);

Object obj = context.lookup("HelloImplRemote");
Tomcat 與 EJB (二)
• 執行結果
 – XD……OK!
• 完成實作
 – SOLUTIONHelloEJBTomcat2
Stand-alone Server(Optional)
Stand-alone Server(Optional)
• 可將 OpenEJB 作為 Stand-alone Server
• 設定環境變數
 set OPENEJB_HOME=c:workspaceopenejb-3.1
 set PATH=%OPENEJB_HOME%/bin;%PATH%

• 啟動
 openejb start
Stand-alone Server(Optional)
• 部署
 openejb deploy yourejb.jar

• 手動部署
 – 在 OpenEJB 目錄下建立 apps 資料夾
 – 將 EJB JAR 複製至 apps 資料夾
 – 啟動 OpenEJB
Stand-alone Server(Optional)
• Session Bean 必須是遠端介面
 @Remote
 public interface HelloRemote {
  …

• 客戶端
 Properties properties = new Properties();
 properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
    "org.apache.openejb.client.RemoteInitialContextFactory");
 InitialContext context = new InitialContext(properties);

 Object obj = context.lookup("HelloImplRemote");
Stand-alone Server(Optional)
• 試試看…
 – LAB_FILEOptional
參考資源
• 如果你想學習 EJB3
 – http://doc.openhome.cc
 – http://www.manning.com/panda/
 – http://oreilly.com/catalog/9780596009786/
• 如果想學習更多 OpenEJB
 – http://openejb.apache.org/
• 你可以從這邊開始…
 – http://openejb.apache.org/examples.html
Thank You
                            林信良
                             http://openhome.cc

                              http://openhome.cc,
                              caterpillar@openhome.cc

   林信良
       caterpillar@openhome.cc

More Related Content

OpenEJB - 另一個選擇

  • 2. 議程 • 開發環境準備 • 實作進行方式 • 實作主題介紹 • 參考資源
  • 3. 開發環境準備 Java Developer Killer… 老 梗
  • 4. 開發環境準備 • Java SE Development Kit 6 – http://java.sun.com/javase/downloads/index.jsp ?不!我們用不到。。XD • NetBeans 6.5 Java Bundles – http://www.netbeans.org/downloads/index.html • Apache OpenEJB 3.1 – http://openejb.apache.org/download.html
  • 5. 開發環境準備 • 專案位置: – USER_HOME/workspace – 我的環境 c:/workspace • OpenEJB 位置: – WORKSPACE/openejb-3.1 – 我的環境 c:/workspace/openejb-3.1
  • 6. 開發環境準備 • 在 NetBeans 中新增 OpenEJB 程式庫 – 開啟 NetBeans – 選單Tools LibrariesNew Library • Library Name: OpenEJB • Library Type: Class Libraries • OK – Add JAR/Folder… • 選取 OPENEJB_HOME/lib 下所有的 JAR • Add JAR/Folder • OK – OK
  • 7. 實作進行方式 50 可 分 作 鐘 啥
  • 8. 實作進行方式 • 每個實作 5 到 10 分鐘 • 觀念講解 • 講師示範 • Copy-and-Paste 實作 - 複製程式片段(請留意檔名) - 貼到對應位置(請注意位置) 重點在組合。。XD
  • 9. 實作主題介紹 • Hello! EJB!...Orz • EJB 單元測試 • Resource 注入(以 MDB 為例) • Tomcat 與 EJB(一) • Tomcat 與 EJB(二) • Stand-alone Server(Optional)
  • 10. Hello! EJB!…Orz • 新建專案 – 選單 FileNew ProjectJavaJava Application – Project Name: HelloEJB – Project Location: WORKSPACE – Finish • 加入OpenEJB 程式庫 – Libraries右鍵選單Add Library OpenEJB Add Library
  • 11. Hello! EJB!…Orz • 加入OpenEJB 程式庫 – Libraries右鍵選單Add Library OpenEJB Add Library
  • 12. Hello! EJB!…Orz • 定義Session Bean Local介面 – Source PackagesNewJava Interface – Class Name: HelloLocal – Package: helloejb(你的套件名) • LAB_FILE/HelloEJB/HelloLocal.txt
  • 13. Hello! EJB!…Orz • 定義實作類別 – Source PackagesNewJava Interface – Class Name: HelloImpl – Package: helloejb(你的套件名) • LAB_FILE/HelloEJB/HelloImpl.txt
  • 15. Hello! EJB!…Orz • EJB 也可以… 輕量級
  • 16. Hello! EJB!…Orz • Local Server – OpenEJB can be embedded and treated as your very own personal EJB container. • LAB_FILE/HelloEJB/Main-1.txt Properties properties = new Properties(); properties.setProperty( Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); properties.put("openejb.home", "C:workspaceopenejb-3.1"); properties.put("openejb.configuration","openejb.conf");
  • 17. Hello! EJB!…Orz • openejb.conf – HelloEJBNewEmpty File – FileName: openejb.conf • LAB_FILE/HelloEJB/openejb.conf.txt <openejb> <Deployments dir="C:workspaceHelloEJBbuildclasses" /> </openejb> <openejb> <Deployments jar="C:workspaceSomewhereEJBModule1.jar" /> </openejb>
  • 18. Hello! EJB!…Orz • LAB_FILE/HelloEJB/Main-2.txt • 注意 JNDI 名稱 – 本地介面:實作類別名稱附加Local名稱 – 遠端介面:實作類別名稱附加Remote名稱 InitialContext context = new InitialContext(properties); Object obj = context.lookup("HelloImplLocal");
  • 19. Hello! EJB!…Orz • 執行結果 – XD......OK! • 完成實作 – SOLUTIONHelloEJB
  • 21. EJB 單元測試 • 開啟專案PREPARED_PRJEJBUnitTest – (相依問題?你的OpenEJB位置可能不同!) – (如果你對NetBeans不熟,先把OpenEJB放 到c:workspaceopenejb-3.1下) • (建立測試案例) – (Test PackagesNewJUnit Test)
  • 22. EJB 單元測試 • 建立測試案例 – LAB_FILE/EJBUnitTest/HelloLocalTest-1.txt – LAB_FILE/EJBUnitTest/HelloLocalTest-2.txt – LAB_FILE/EJBUnitTest/HelloLocalTest-3.txt • 執行測試案例 – Test Packagestest.helloejb.HelloLocalTest Run File
  • 23. EJB 單元測試 • 執行結果 – Tests run: 1, Failures: 0, Errors: 0 • 完成實作 – SOLUTIONEJBUnitTest
  • 24. Resource 注入 EntityManager DataSource 依選擇啟用資源 Topic Queue
  • 25. Resource 注入 • 以 Message-Driven Bean(MDB) 為例 • 開啟專案PREPARED_PRJResourceInjection • 使用@Resource – 開啟Source Packageshelloejb.HelloImpl – LAB_FILEResourceInjectionHelloImpl-1.txt – LAB_FILEResourceInjectionHelloImpl-2.txt • 定義Message-Driven Bean – 開啟Source Packageshelloejb.HelloMessage – LAB_FILEResourceInjectionHelloImpl-1.txt – LAB_FILEResourceInjectionHelloImpl-1.txt
  • 26. Resource 注入 • 複製 openejb.conf – 切換 NetBeans 至 Files – 將LAB_FILEResourceInjectionopenejb.conf 拖放至 ResourceInjection • openejb.conf 中<Resource> – 用來定義 DataSource、JMS… – 本範例使用 ActiveMQ <Resource id=“XXX" provider=“OOO"> …. </Resource>
  • 27. Resource 注入 public class HelloImpl implements HelloLocal { @Resource(name="JmsConnectionFactory") private ConnectionFactory connectionFactory; … <Connector id="JmsConnectionFactory“ …> …. </Connector>
  • 28. Resource 注入 • 執行測試案例 – Test Packagestest.helloejb.HelloLocalTest Run File • 執行結果 – Tests run: 1, Failures: 0, Errors: 0 • 完成實作 – SOLUTIONResourceInjection
  • 30. Tomcat 與 EJB(一) • Tomcat 上也可以用 EJB • 將 openejb.war 部署至 Tomcat 上 – NetBeans 會為使用者建 Cataline_Base – USER_HOMEnetbeans6.5apache-tomcat- 6.0.18_basewebapps • 在NetBeans 中啟動Tomcat – 切換至ServicesServersApache Tomcats右鍵 Start • 現在你可以在 Tomcat 中部署 EJB 了 – http://localhost:8084/openejb/ 獲得資源注入的好處
  • 31. Tomcat 與 EJB (一) • 來寫個Tomcat上的Hello!EJB!。。Orz • 新建專案 – 選單 FileNew ProjectJava WebWeb Application – Project Name: HelloEJBTomcat – Project Location: WORKSPACE/ – Next – Server: Apache Tomcat – Finish
  • 32. Tomcat 與 EJB (一) • 加入Java EE API 程式庫 – Libraries右鍵選單Add JAR/Border – 選取OPENEJB_HOME/lib/javaee-api-5.0-1.jar • 建立package – Source PackagesNewJava Package – Package Name: hellloejb – Finish
  • 33. Tomcat 與 EJB (一) • 複製先前寫好的Stateless Session Bean至 helloejb中 – SOLUTIONHelloEJBsrchelloejbHelloLocal.java – SOLUTIONHelloEJBsrchelloejbHelloImpl.java • 寫個HelloServlet – Source PackageshelloejbNewServlet – Class Name: HelloServlet – Finish
  • 34. Tomcat 與 EJB (一) • 注入 EJB public class HelloServlet extends HttpServlet { @EJB private HelloLocal hello; … • 清空processRequest()方法
  • 35. Tomcat 與 EJB (一) • 使用 Stateless Session Bean – HelloServlet-2.txt ... out.println("<h1>" + hello.doHello("Orz...") + "</h1>"); ... • 執行 Web 應用程式 – HelloEJBTomcatClear and Bulid – HelloEJBTomcatDeploy – Source Packageshelloejb.HelloServletRun
  • 36. Tomcat 與 EJB (一) • 完成實作 – SOLUTIONHelloEJBTomcat
  • 37. Tomcat 與 EJB (二) • 可以定義遠端介面 • 讓 Session Bean 實作遠端介面 • 非 Tomcat 客戶端可以存取 Session Bean – INITIAL_CONTEXT_FACTORY – PROVIDER_URL • 繼續上一個實作 – (SOLUTIONHelloEJBTomcat)
  • 38. Tomcat 與 EJB (二) • 定義遠端介面 @Remote public interface HelloRemote { public String doHello(String message); } • 讓 Session Bean 實作遠端介面 public class HelloImpl implements HelloLocal, HelloRemote { … }
  • 39. Tomcat 與 EJB (二) • 在Services中關掉Tomcat,重新Clean、Build、 Deploy • 新建專案 – 選單 FileNew ProjectJavaJava Application – Project Name: HelloClient – Project Location: WORKSPACE – Finish • 加入OpenEJB 程式庫 – Libraries右鍵選單Add Library OpenEJB Add Library
  • 40. Tomcat 與 EJB (二) • 建立package – Source PackagesNewJava Package – Package Name: hellloejb – Finish • 複製HelloEJBTomcat中的HelloRemote至 HelloClient的helloejb中
  • 41. Tomcat 與 EJB (二) • 撰寫Main – LAB_FILEHelloClientMain.txt • 對客戶端而言,EJB 現在部署在遠端 Server 上 Properties properties = new Properties(); properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory"); properties.put(Context.PROVIDER_URL, "http://127.0.0.1:8084/openejb/ejb"); InitialContext context = new InitialContext(properties); Object obj = context.lookup("HelloImplRemote");
  • 42. Tomcat 與 EJB (二) • 執行結果 – XD……OK! • 完成實作 – SOLUTIONHelloEJBTomcat2
  • 44. Stand-alone Server(Optional) • 可將 OpenEJB 作為 Stand-alone Server • 設定環境變數 set OPENEJB_HOME=c:workspaceopenejb-3.1 set PATH=%OPENEJB_HOME%/bin;%PATH% • 啟動 openejb start
  • 45. Stand-alone Server(Optional) • 部署 openejb deploy yourejb.jar • 手動部署 – 在 OpenEJB 目錄下建立 apps 資料夾 – 將 EJB JAR 複製至 apps 資料夾 – 啟動 OpenEJB
  • 46. Stand-alone Server(Optional) • Session Bean 必須是遠端介面 @Remote public interface HelloRemote { … • 客戶端 Properties properties = new Properties(); properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory"); InitialContext context = new InitialContext(properties); Object obj = context.lookup("HelloImplRemote");
  • 48. 參考資源 • 如果你想學習 EJB3 – http://doc.openhome.cc – http://www.manning.com/panda/ – http://oreilly.com/catalog/9780596009786/ • 如果想學習更多 OpenEJB – http://openejb.apache.org/ • 你可以從這邊開始… – http://openejb.apache.org/examples.html
  • 49. Thank You 林信良 http://openhome.cc http://openhome.cc, caterpillar@openhome.cc  林信良  caterpillar@openhome.cc