DANCE WITH JAVA

          開發出高質量的系統

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          走近EJB Jboss 下 Hello World

          每次學習一些新的東西都是從Hello? World開始,這里感嘆一下。本來認為Hello World這樣的東西應該不必要再寫,只想發兩句牢騷,轉幾個鏈接了事,但接觸下來,發現網上的Hello World因為轉載太多,造成基本上都是不能用的版本.或多或少存在這樣那樣的問題,讓一個初學者去調試錯誤是好事,也是壞事,好事是可以鍛煉一下,壞事是容易打消積極性,呵呵。這里給出一個Hello World的例子和一些疑問.

          首先是Hello World的代碼,很簡單就幾個接口
          1,遠程接口
          package?eg;

          import?java.rmi.RemoteException;
          import?javax.ejb.EJBObject;

          public?interface?Hello?extends?EJBObject?{
          ????
          public?String?hello()?throws?RemoteException;
          }

          2,企業Bean
          package?eg;

          import?java.rmi.RemoteException;

          import?javax.ejb.EJBException;
          import?javax.ejb.SessionBean;
          import?javax.ejb.SessionContext;

          public?class?HelloBean?implements?SessionBean?{
          ????
          private?SessionContext?ctx;

          ????
          public?void?ejbActivate()?throws?EJBException,?RemoteException?{
          ????????
          //?TODO?Auto-generated?method?stub

          ????}


          ????
          public?void?ejbPassivate()?throws?EJBException,?RemoteException?{
          ????????
          //?TODO?Auto-generated?method?stub

          ????}


          ????
          public?void?ejbCreate()?throws?javax.ejb.CreateException?{
          ????????
          ????}


          ????
          public?void?ejbRemove()?throws?EJBException,?RemoteException?{
          ????????
          //?TODO?Auto-generated?method?stub

          ????}


          ????
          public?void?setSessionContext(SessionContext?ctx)?throws?EJBException,
          ????????????RemoteException?
          {
          ????????
          this.ctx?=?ctx;
          ????}


          ????
          public?String?hello()?{
          ????????System.out.println(
          "hello");
          ????????
          return?"Hello?World";
          ????}


          }

          3,Home接口
          package?eg;

          import?java.rmi.RemoteException;

          import?javax.ejb.CreateException;
          import?javax.ejb.EJBHome;

          public?interface?HelloHome?extends?EJBHome?{
          ????Hello?create()?
          throws?RemoteException,CreateException;
          }

          4,用來調用的Client類
          package?eg;

          import?java.util.Hashtable;

          import?javax.naming.Context;
          import?javax.naming.InitialContext;
          import?javax.rmi.PortableRemoteObject;

          public?class?HelloClient?{

          ????
          public?static?void?main(String[]?args)?throws?Exception?{
          ????????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");
          ?????????
          ????????Context?ctx?
          =?new?InitialContext(env);
          ????????Object?obj?
          =?ctx.lookup("Hello");
          ????????HelloHome?home?
          =?(HelloHome)?PortableRemoteObject.narrow(obj,
          ????????????????HelloHome.
          class);
          ????????Hello?hello?
          =?home.create();
          ????????System.out.println(hello.hello());
          ????????hello.remove();

          ????}


          }

          ejb-jar.xml文件
          <?xml?version="1.0"?encoding="UTF-8"?>
          <!DOCTYPE?ejb-jar?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?Enterprise?JavaBeans?2.0//EN"?"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
          <ejb-jar>
          <description>this?is?ejb?helloworld</description>
          <display-name>HelloBean</display-name>
          <enterprise-beans>
          ????
          <session>
          ????????
          <display-name>Hello</display-name>
          ????????
          <ejb-name>Hello</ejb-name>
          ????????
          <home>eg.HelloHome</home>
          ????????
          <remote>eg.Hello</remote>
          ?????????? <!--
          ????????
          <local-home>eg.HelloLocalHome</local-home>
          ????????
          <local>eg.HelloLocal</local>
          ??????????? -->
          ????????
          <ejb-class>eg.HelloBean</ejb-class>
          ????????
          <session-type>Stateless</session-type>
          ????????
          <transaction-type>Container</transaction-type>
          ????
          </session>
          </enterprise-beans>
          </ejb-jar>
          上邊代碼下載鏈接http://www.aygfsteel.com/Files/dreamstone/ejb.rar
          疑問一:細心的人會發現我的ejb-jar.xml中注釋掉了兩行,這兩行對應兩個本地接口
          package?eg;

          import?javax.ejb.EJBLocalObject;

          public?interface?HelloLocal?extends?EJBLocalObject?{
          ????
          public?String?hello();
          }

          package?eg;

          import?javax.ejb.CreateException;
          import?javax.ejb.EJBLocalHome;

          public?interface?HelloLocalHome?extends?EJBLocalHome?{
          ????HelloLocal?create()?
          throws?CreateException;
          }

          這兩個接口是用來本地調用的,這個解釋明白它的意思,但還是不知道如何才能實現這個本地調用,了解的人給個提示,如何才能在代碼中模擬出使用到這兩個接口的情況?;蛘哒f模擬出使用本地接口和遠程接口的區別?
          疑問二:為什么企業Bean類不實現組建接口(既不實現遠程接口也不實現本地接口),畢竟組建接口定義了企業Bean所有的業務方法,如果實現了,可以保證編譯期Check
          答案:這個答案是<<精通Ejb>>一書中給出的解釋:

          理由一:組件接口繼承于Sun定義的標準接口,比如javax.ejb.EJBObject和javax.ejb.EJBLocalObject。這些超級接口為客戶定義了其它方法。因此如果企業Bean類實現組件接口,則企業Bean類將需要為這些方法提供空的實現,顯然,在企業Bean類中不需要這些方法

          理由二:
          假定企業Bean (A)需要調用其它企業Bean(B)的方法,并且,如果需要傳遞當前企業Bean(A)的引用給B的方法(類似于Java中的this參數)。在Ejb中,如何傳遞和處理這種情形?
          請記住,所有的Ejb客戶都是調用Ejb對象而不是企業Bean類實例本身,因此如果A調用B,開發者必須將A的Ejb對象引用(而不是對A的引用)傳遞給B,B將操作A的EJB對象,而不是A中企業Bean實例本身,對于A而言,B是它的客戶,同所有的EJB客戶一樣,必須通過EJB對象調用企業Bean類實例。
          而且如果企業Bean類實現了EJB組件的遠程接口將存在潛在的危險,開發者可能不小心將企業Bean類的實例本身的引用傳遞,而不是EJB對象的引用,猶豫企業Bean類同EJB對象實現了同一接口,似的開發者能夠使用this參數,而實現對企業Bean本身的引用。這太不可思議了。
          看完這段解釋,朦朧的懂了為什么不這么做,但是對這么作帶來的后果還是不是很清楚,有經驗的給說說.謝謝.

          另外部署不說了,看這里吧http://www.uml.org.cn/j2ee/200702141.asp

          如果調用Client的時候拋出這個異常:
          Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
          ?at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
          ?at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
          ?at javax.naming.InitialContext.init(InitialContext.java:223)
          ?at javax.naming.InitialContext.<init>(InitialContext.java:197)
          ?at eg.HelloClient.main(HelloClient.java:17)
          Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
          ?at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
          ?at java.security.AccessController.doPrivileged(Native Method)
          ?at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
          ?at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
          ?at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
          ?at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
          ?at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
          ?at java.lang.Class.forName0(Native Method)
          ?at java.lang.Class.forName(Class.java:242)
          ?at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:42)
          ?at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
          ?... 4 more

          把Jboss Client目錄下的一些類庫加進來就好了

          最后提供一個簡單的做法:
          Eclipse+Myeclipse
          新建EJB工程-->新建SessionBean,名字叫HelloBean ,更改里邊的業務方法
          然后選擇工程的屬性-->Myeclipse xDoclet -->add Standard -->standard EJB -->確定
          右鍵工程-->Myeclipse-->run xDoclet,看看是不是和上邊的差不多,什么都有了,不過他的結構更好一點,借助工具能更快捷的完成任務。不過建議初學者還是自己手動來比較好。
          借助Eclipse+Myeclipse 部署調試也會變的方便.



          posted on 2007-03-05 20:02 dreamstone 閱讀(5878) 評論(3)  編輯  收藏 所屬分類: jdk相關

          評論

          # re: 走近EJB Jboss 下 Hello World[未登錄] 2007-03-05 22:01 ronghai

          你做的是ejb的哪個版本ejb3.0?  回復  更多評論   

          # re: 走近EJB Jboss 下 Hello World 2007-03-05 22:21 我為J狂

          @ronghai
          當然是EJB2.0了,因為在所有的EJB3.0規范中定義的EJB,都不必實現Home接口,而且也不用寫部署描述文件。如果樓主是剛剛學習EJB,建議樓主學習EJB3.0。  回復  更多評論   

          # re: 走近EJB Jboss 下 Hello World 2007-03-05 23:24 dreamstone

          恩,是2.0,平時的項目開發中很少用到EJB,學習一下用于備用吧。對于EJB熟悉的幫忙回答一下文中的一些疑問,謝謝了。  回復  更多評論   

          主站蜘蛛池模板: 和田县| 南丹县| 瓦房店市| 清水县| 临洮县| 揭阳市| 辽阳市| 古丈县| 新昌县| 昭平县| 嘉黎县| 平顺县| 海安县| 青阳县| 四会市| 神农架林区| 利辛县| 泸溪县| 开封县| 扶余县| 融水| 谢通门县| 河北区| 通渭县| 宁国市| 定结县| 彭水| 分宜县| 漾濞| 井冈山市| 漳平市| 盐边县| 和龙市| 白水县| 汉川市| 通海县| 青海省| 车致| 孝义市| 孝昌县| 无棣县|