JBOSS――第一個EJB

JBOSS――第一個EJB


  JBOSS是一個開放源碼的免費EJB服務器,它實現了其它J2EE所規定的大多數功能,現在sun公司已經把JBOSS作爲J2EE1.4的標準實現服務器了,本文就帶領大家從Jboss3.2.6的安裝開始,一直到開發出一個完整的”hello,world”的ejb爲止。

  JBOSS的安裝與啓動

  如果你是第一次使用JBOSS,你一定會感到很沮喪,因爲它雖然是開放源碼,並可以免費下載,但是它的文檔或技術培訓卻是收費的,而且對於國人來說高不可及(幾天的培訓大約要10000美元,文檔也要幾十至幾百美一份)!如果你試圖在網上找一些關於JBOSS下簡單入門的文章,可只是那麼寥寥可數的幾篇,而且很少有菜鳥級的文章。相反,對其核心設計等高深理論性的文章倒是居多,這樣反倒讓你越看越糊塗。因此,本文的目的就是:讓你的JBOSS儘快地跑起來,並馬上可以在其之上開發出簡單的EJB!

  在安裝JBOSS之前,首先要確定你已經安裝了jdk1.3或以上版本,由於JBOSS不像weblogic等其它應用服務器捆綁了JDK,因此JBOSS非要jdk的支持才能運行。然後在 http://www.jboss.org網站上下載一個jboss的發行版(我下載的是jboss-3.2.6.zip),在本文中我使用的其穩定的發行版JBOSS3.2.6 (集成了tomcat4.1),需要附帶一句的是tomcat是apache基金會旗下著名的開源jsp/servlet服務器,如果要更多的瞭解tomcat,請訪問http://jakarta.apache.org 以獲得更詳細的信息。

  當你把jboss-3.2.6.zip下載之後,下一步就是將它解壓縮,如果你是在windows上,可以用winzip或winrar;如果是在linux下,就用unzip命令,以我自己爲例,假設我將它解壓到了如下目錄

c:/ jboss-3.2.6

  相對於weblogic,websphere等j2ee服務器來說,JBOSS的啓動是簡單得出乎意料,如果你是windows用戶,只需要進入c:/ jboss-3.2.6/bin下面,輸入run.bat命令,JBOSS就跑起來啦;如果是linux用戶的話,只需要進入c:/ jboss-3.2.6/bin下面,輸入run.sh,那麼JBOSS也同樣運行。怎麼樣?是挺簡單的吧?

    

  當你輸入run.bat或run.sh後,你會發現屏幕上會不斷地滾動一些提示信息,過大約1分鐘之後(依賴於你機器的配置,我的是P4 1.7G,128M),提示信息就會停止滾動,如下圖所示:

 

  (注意:如果你是在windows下,那麼請讓這個DOS窗口一直保持這種狀態,千萬不可將其中止!)

  這樣,JBOSS就已經處於運行狀態了。和其它J2EE服務器一樣,JBOSS也提供了一個WEB方式控制檯,使用方法是在IE瀏覽器中輸入http://127.0.0.1:8080/web-console/,這樣你就會看到如下圖所示的一個控制檯:


 

  怎麼樣?這個界面絲毫不比weblogic的差吧?通過這個控制檯,你可以動態地對JBOSS的服務進行管理和監控。

編寫第一個EJB:”hello,world”

  下面我們正式開始EJB編程。在編寫我們的第一個EJB之前,你應該對EJB有一個大致的瞭解,如果沒有的話,建議你先到網上找一些這方面的文章來看,否則你將無法理解下面要講述的內容。

  遠程接口

  遠程接口是指對於客戶端而言所能看到了調用接口

//HelloWorld.java
package sample;
/*這是一個遠程接口,客戶端調用這個接口來使真正的ejb工作*/
public interface HelloWorld extends javax.ejb.EJBObject
{
 public String hello() throws java.rmi.RemoteException;
}

  Home接口

  我們可以把Home接口看做是一個製造EJB的工廠,Home接口告訴EJB容器:“嗨,我的客戶要我生成一個EJB,現在我把這個任務交給你啦!”

//HelloWorldHome.java
package sample;
/*Home接口告訴EJB容器怎樣生成或銷燬EJB的實例*/
public interface HelloWorldHome extends javax.ejb.EJBHome
{
 HelloWorld create() throws java.rmi.RemoteException,javax.ejb.CreateException;
}

  EJB的實現

  這裏纔是真正的EJB的實現

//HelloWorldBean.java
package sample;
import javax.ejb.SessionContext;
/*這個類具體實現的遠程接口HelloWorld*/
pubic class HelloWorldBean implements javax.ejb.SessionBean
{
 private SessionContext ctx;
 public void setSessionContext(SessionContext ctx)
 {
  this.ctx = ctx;
 }
 pubic void ejbRemove()
 {
  System.out.println(“ejbRemove()”);
 }
 public void ejbActivate()
 {
  System.out.println(“ejbActivate()”);
 }
 public void ejbPassivate()
 {
  System.out.println(“ejbPassivate()”);
 }
 /*hello方法是實際的業務邏輯,它可以在客戶端顯示“hello,world”這個字符串*/
 public String hello()
 {
  System.out.println(“hello()”);
  return “hello,world”;
 }
}

  好了,這個會話EJB的全部代碼編寫完畢,下一步我們要做的是編寫它的部署文件:

  ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
 <description>JBoss Hello World Application</description>
 <display-name>Hello World EJB</display-name>
 <enterprise-beans>
 <session>
  <ejb-name>Hello</ejb-name>
  <home>sample.HelloHome</home>
  <remote>sample.Hello</remote>
  <ejb-class>sample.HelloBean</ejb-class>
  <session-type>Stateless</session-type>
  <transaction-type>Bean</transaction-type>
 </session>
</enterprise-beans>
</ejb-jar>

  這個ejb-jar.xml文件應放在當前項目的META-INF目錄下,在本例中我將其放在
F:/projects/jbss-tutorial目錄下了,當然你應該根據需要來將它放在你自己的項目目錄中,爲了能更清楚地讓你瞭解ejb-jar.xml文件的位置,以下我列出了這個示例的整個目錄結構:


 

  這樣我們就完成了一個簡單的會話EJB的編寫,但其實JBOSS還提供了一個額外的配置文件:JBoss.xml,利用它可以對JBOSS服務器進行更多的定製,但由於本例實在是太簡單了,因此我們可以將它省略不寫。

  雖然我們完成了這個會話EJB的編寫,但還有最後的一步工作要做:打包。首先我們進入當前項目的根目錄:

cd F:/project/jboss-tutorial

  然後執行jar命令將所有的類及ejb-jar.xml打包:

jar cf HelloWorld.jar sample META-INF

  這時你會發現,在當前目錄下多了一個名爲HelloWorld.jar的文件,這就是我們的最終成品。

部署我們的EJB

  部署EJB在JBOSS中是一件非常容易的事,你只需簡單將HelloWorld.jar拷貝到c:/ jboss-3.2.6/server/default/deploy目錄下就可以了。

 

  這時,你可以切換到JBOSS運行的那個DOS窗口下,你會發現屏幕上會新出現如下提示信息:

15:09:21,184 INFO [MainDeployer] Starting deployment of
package: file:/F:/jboss
-3.2.3/server/default/deploy/HelloWorld.jar
15:09:21,324 INFO [EjbModule] Creating
15:09:21,354 INFO [EjbModule] Deploying HelloWorld
15:09:21,464 INFO [EjbModule] Created
15:09:21,484 INFO [EjbModule] Starting
15:09:21,555 INFO [EjbModule] Started
15:09:21,555 INFO [MainDeployer] Successfully completed
deployment of package: file:/F:/jboss-3.2.6/server/default/deploy/HelloWorld.jar

  客戶端代碼

  如果沒有客戶端代碼的話,那麼EJB對我們來說幾乎毫無用處。以下我們將編寫客戶端代碼來調用這個HelloWorld。

  如果你在同一臺機器上運行客戶端代碼和JBOSS服務器的話,那以下代碼無須任何修改就可以運行,但你的客戶端在另一臺機器上運行的話,那你要將源碼中的相應行改變一下:

/*以下是客戶端源碼中需要修改的行*/
env.put(Context.PROVIDER_URL, "localhost:1099");

  假設EJB部署在一臺IP地址爲192.168.0.1的機器上,那麼就應該將以上源碼改爲如下:

/*以下是客戶端源碼中修改後的行*/
env.put(Context.PROVIDER_URL, "192.168.0.1:1099");

/*HelloWorldClient.java*/
package sample;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
public class HelloWorldClient
{
 public static void main( String [] args )
 {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
  env.put(Context.PROVIDER_URL, "localhost:1099");
  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
  try
  {
   Context ctx = new InitialContext(env);
   Object obj = ctx.lookup( "HelloWorld" );
   HelloWorldHome home =(HelloWorldHome)javax.rmi.PortableRemoteObject.narrow(
obj, HelloWorldHome.class );
   HelloWorld helloWorld = home.create();
   System.out.println( helloWorld.hello());
   helloWorld.remove();
  }
  catch ( Exception e )
  {
   e.printStackTrace();
   System.out.println( "Exception: " + e.getMessage() );
  }
 }
}

 

  好了,下面我就就可以編譯並運行這個客戶端了,如果你在編譯的時候JVM報告找不到某些類的話,則可能是你沒有將j2ee.jar這個包放在CLASSPATH這個路徑變量中。客戶端的執行結果雖然只是簡單的在屏幕上打印一行“hello,world”,但它是來自於另一個世界
——JBOSS的聲音!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章