<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    DANCE WITH JAVA

    開(kāi)發(fā)出高質(zhì)量的系統(tǒng)

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    好友之家

    最新評(píng)論

    走近EJB Jboss 下 Hello World

    每次學(xué)習(xí)一些新的東西都是從Hello? World開(kāi)始,這里感嘆一下。本來(lái)認(rèn)為Hello World這樣的東西應(yīng)該不必要再寫(xiě),只想發(fā)兩句牢騷,轉(zhuǎn)幾個(gè)鏈接了事,但接觸下來(lái),發(fā)現(xiàn)網(wǎng)上的Hello World因?yàn)檗D(zhuǎn)載太多,造成基本上都是不能用的版本.或多或少存在這樣那樣的問(wèn)題,讓一個(gè)初學(xué)者去調(diào)試錯(cuò)誤是好事,也是壞事,好事是可以鍛煉一下,壞事是容易打消積極性,呵呵。這里給出一個(gè)Hello World的例子和一些疑問(wèn).

    首先是Hello World的代碼,很簡(jiǎn)單就幾個(gè)接口
    1,遠(yuǎn)程接口
    package?eg;

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

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

    2,企業(yè)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,用來(lái)調(diào)用的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://m.tkk7.com/Files/dreamstone/ejb.rar
    疑問(wèn)一:細(xì)心的人會(huì)發(fā)現(xiàn)我的ejb-jar.xml中注釋掉了兩行,這兩行對(duì)應(yīng)兩個(gè)本地接口
    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;
    }

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

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

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

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

    如果調(diào)用Client的時(shí)候拋出這個(gè)異常:
    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目錄下的一些類庫(kù)加進(jìn)來(lái)就好了

    最后提供一個(gè)簡(jiǎn)單的做法:
    Eclipse+Myeclipse
    新建EJB工程-->新建SessionBean,名字叫HelloBean ,更改里邊的業(yè)務(wù)方法
    然后選擇工程的屬性-->Myeclipse xDoclet -->add Standard -->standard EJB -->確定
    右鍵工程-->Myeclipse-->run xDoclet,看看是不是和上邊的差不多,什么都有了,不過(guò)他的結(jié)構(gòu)更好一點(diǎn),借助工具能更快捷的完成任務(wù)。不過(guò)建議初學(xué)者還是自己手動(dòng)來(lái)比較好。
    借助Eclipse+Myeclipse 部署調(diào)試也會(huì)變的方便.



    posted on 2007-03-05 20:02 dreamstone 閱讀(5879) 評(píng)論(3)  編輯  收藏 所屬分類: jdk相關(guān)

    評(píng)論

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

    你做的是ejb的哪個(gè)版本ejb3.0?  回復(fù)  更多評(píng)論   

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

    @ronghai
    當(dāng)然是EJB2.0了,因?yàn)樵谒械腅JB3.0規(guī)范中定義的EJB,都不必實(shí)現(xiàn)Home接口,而且也不用寫(xiě)部署描述文件。如果樓主是剛剛學(xué)習(xí)EJB,建議樓主學(xué)習(xí)EJB3.0。  回復(fù)  更多評(píng)論   

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

    恩,是2.0,平時(shí)的項(xiàng)目開(kāi)發(fā)中很少用到EJB,學(xué)習(xí)一下用于備用吧。對(duì)于EJB熟悉的幫忙回答一下文中的一些疑問(wèn),謝謝了。  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 日亚毛片免费乱码不卡一区| 中文字幕亚洲一区二区三区| 美女18毛片免费视频| 亚洲AV一区二区三区四区| 亚洲中文字幕乱码熟女在线| 中文字幕乱码亚洲精品一区| selaoban在线视频免费精品| 一级日本高清视频免费观看 | 性做久久久久免费观看| 在线看片v免费观看视频777| 波多野结衣在线免费视频| 亚洲AV无码乱码在线观看裸奔| 国产亚洲自拍一区| 日韩色日韩视频亚洲网站| 国产精品hd免费观看| 亚洲A∨精品一区二区三区| 亚洲成人免费网址| 91亚洲国产成人精品下载| 亚洲综合在线一区二区三区| 国产最新凸凹视频免费| 拨牐拨牐x8免费| 一级毛片免费观看| 午夜免费福利小电影| 亚洲AV无码乱码国产麻豆穿越| 久久精品无码专区免费| 免费人成视频在线| 亚洲国产成人无码AV在线影院| 羞羞的视频在线免费观看| 久久久久亚洲AV成人网人人软件| 国产亚洲视频在线| 亚洲视频在线精品| 亚洲av色香蕉一区二区三区蜜桃| 日韩免费高清视频网站| 老司机午夜性生免费福利| 亚洲精品无码AV中文字幕电影网站| 亚洲av无码专区在线电影| 亚洲国产精品成人久久蜜臀 | 成全视成人免费观看在线看| 亚洲欧洲免费视频| 在线免费观看亚洲| 中字幕视频在线永久在线观看免费 |