SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
– 另一個選擇



林信良, 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

Contenu connexe

Tendances

JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsHo Kim
 
Ecmascript
EcmascriptEcmascript
Ecmascriptjay li
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享zenyuhao
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法yiditushe
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Justin Lin
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘Liu Allen
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7Justin Lin
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错jeffz
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Justin Lin
 
深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)wang hongjiang
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmiyiditushe
 
Introduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDKIntroduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDK維佋 唐
 

Tendances (20)

JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
 
Java Thread
Java ThreadJava Thread
Java Thread
 
Ecmascript
EcmascriptEcmascript
Ecmascript
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Node way
Node wayNode way
Node way
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 
Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法Jni攻略之八――操作对象的构造方法
Jni攻略之八――操作对象的构造方法
 
Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答Java SE 7 技術手冊 - 課後練習解答
Java SE 7 技術手冊 - 課後練習解答
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
 
深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
六步教你学会简单Rmi
六步教你学会简单Rmi六步教你学会简单Rmi
六步教你学会简单Rmi
 
Introduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDKIntroduction to Parse JavaScript SDK
Introduction to Parse JavaScript SDK
 

Similaire à OpenEJB - 另一個選擇

Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011Ching Yi Chan
 
02.web sphere培训 应用websphere
02.web sphere培训 应用websphere02.web sphere培训 应用websphere
02.web sphere培训 应用webspherelittlecong
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料yiditushe
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a databaseted-xu
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorialazole Lai
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩Wen-Tien Chang
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定Shengyou Fan
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用Jerry Lin
 
test
testtest
testxieyq
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
Fat War使用說明
Fat War使用說明Fat War使用說明
Fat War使用說明傑克 江
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管Will Huang
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定Shengyou Fan
 
FHIR Server 安裝與使用
FHIR Server 安裝與使用FHIR Server 安裝與使用
FHIR Server 安裝與使用Lorex L. Yang
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJustin Lin
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後Shengyou Fan
 

Similaire à OpenEJB - 另一個選擇 (20)

Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
 
02.web sphere培训 应用websphere
02.web sphere培训 应用websphere02.web sphere培训 应用websphere
02.web sphere培训 应用websphere
 
OPM
OPMOPM
OPM
 
Lucene实践
Lucene实践Lucene实践
Lucene实践
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
2, OCP - installing and creating a database
2, OCP - installing and creating a database2, OCP - installing and creating a database
2, OCP - installing and creating a database
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorial
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
 
啟動 Laravel 與環境設定
啟動 Laravel 與環境設定啟動 Laravel 與環境設定
啟動 Laravel 與環境設定
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用
 
test
testtest
test
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
Fat War使用說明
Fat War使用說明Fat War使用說明
Fat War使用說明
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定
 
FHIR Server 安裝與使用
FHIR Server 安裝與使用FHIR Server 安裝與使用
FHIR Server 安裝與使用
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後
 

Plus de Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 

Plus de Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 

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