JAVA编程:robbin写的EJB挪用的道理剖析
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流.一个远程对象最少要包含4个class文件:远程对象;远程对象的接口;完成远程接口的对象的stub;对象的skeleton这4个class文件。在EJB中则最少要包含10个class:Bean类,特定AppServer的Bean完成类Bean的remote接口,特定AppServer的remote接话柄现类,特定AppServer的remote接口的完成类的stub类和skeleton类Bean的home接口,特定AppServer的home接话柄现类,特定AppServer的home接口的完成类的stub类和skeleton类和RMI分歧的是,EJB中这10个class真正必要用户编写的只要3个,分离是Bean类和它的remote接口,home接口,至于别的的7个class究竟是怎样天生,被打包在甚么中央,大概是不是必要更多的类文件,会依据分歧的AppServer体现出对照年夜的差别,不克不及混为一谈。拿我最熟习的Weblogic的来讲吧,Weblogic的Bean完成类,和两个接口的Weblogic的完成类是在ejbc的时分被打包到EJB的jar包内里的,这3个class文件能够看到。而home接口和remote接口的Weblogic的完成类的stub类和skeleton类是在EJB被部署到Weblogic的时分,由Weblogic静态天生stub类和Skeleton类的字节码,因而看不到这4个类文件。关于一次客户端远程挪用EJB,要经由两个远程对象的屡次RMI轮回。起首是经由过程JNDI查找Home接口,取得Home接口的完成类,这个历程实在相称庞大,起首是找到Home接口的Weblogic完成类,然后创立一个Home接口的Weblogic完成类的stub类的对象实例,将它序列化传送给客户端(注重stub类的实例是在第1次RMI轮回中,由服务器静态发送给客户真个,因而不必要客户端保留Home接口的Weblogic完成类的stub类),最初客户端取得该stub类的对象实例(一般的RMI必要在客户端保留stub类,而EJB不必要,由于服务器会把stub类的对象实例发送给客户端)。客户端拿到服务器给它的Home接口的Weblogic完成类的stub类对象实例今后,挪用stub类的create办法,(在代码上就是home.create(),可是背景要做良多事变),因而经由第2次RMI轮回,在服务器端,Home接口的Weblogic完成类的skeleton类收到stub类的挪用信息后,由它再往挪用Home接口的Weblogic完成类的create办法。在服务端,Home接口的Weblogic完成类的create办法再往挪用Bean类的Weblogic完成类的ejbCreate办法,在服务端创立大概分派一个EJB实例,然后将这个EJB实例的远程接口的Weblogic完成类的stub类对象实例序列化发送给客户端。客户端收到remote接口的Weblogic完成类的stub类的对象实例,对该对象实例的办法挪用(在客户端代码中实践上就是对remote接口的挪用),将传送给服务器端remote接口的Weblogic完成类的skeleton类对象,而skeleton类对象再挪用响应的remote接口的Weblogic完成类,然后remote接口的Weblogic完成类再往挪用Bean类的Weblogic完成类,云云就完成一次EJB对象的远程挪用。看了一遍帖子,感到仍是没有说太分明,既然写了帖子,就想完全把它说分明。先拿一般RMI来讲,有4个class,分离是远程对象,对象的接口,对象的stub类和skeleton类。而对象自己和对象的stub类同时都完成了接口类。而我们在客户端代码挪用远程对象的时分,固然在代码中利用接口,本色上是在利用stub类,比方:接口类:Hello远程对象:Hello_Serverstub类:Hello_Stubskeleton类:Hello_Skeleton客户端代码要如许写:Helloh=newHello_Stub();h.getString();我们不会这些写:Hello_Stubh=newHello_Stub();h.getString();由于利用接口合用性更广,就算改换了接话柄现类,也不必要变动代码。因而客户端必要Hello.class和Hello_Stub.class这两个文件。可是关于EJB来讲,就不必要Hello_Stub.class,由于服务器会发送给它,可是Hello.class文件客户端是省不了的,必需有。外表上我们的客户端代码在利用Hello,但别健忘了Hello只是一个接口,笼统的,本色上是在利用Hello_Stub。拿Weblogic上的EJB举例子,10个class分离是:Bean类:HelloBean(用户编写)Bean类的Weblogic完成类:HelloBean_Impl(EJBC天生)Home接口:HelloHome(用户编写)Home接口的Weblogic完成类HelloBean_HomeImpl(EJBC天生)Home接口的Weblogic完成类的stub类HelloBean_HomeImpl_WLStub(部署的时分静态天生字节码)Home接口的Weblogic完成类的skeleton类HelloBean_HomeImpl_WLSkeleton(部署的时分静态天生字节码)Remote接口:Hello(用户编写)Remote接口的Weblogic完成类HelloBean_EOImpl(EJBC天生)Remote接口的Weblogic完成类的stub类HelloBean_EOImpl_WLStub(部署的时分静态天生字节码)Remote接口的Weblogic完成类的skeleton类HelloBean_EOImpl_WLSkeleton(部署的时分静态天生字节码)客户端只必要Hello.class和HelloHome.class这两个文件。HelloHomehome=(Home)PortableRemoteObject.narrow(ctx.lookup("Hello"),HelloHome.class);这一行代码是从JNDI取得Home接口,可是请记着!接口是笼统的,那末home这个对象究竟是甚么类的对象实例呢?很复杂,用toString()输入看一下就分明了,上面一行是输入了局:HelloBean_HomeImpl_WLStub@18c458这标明home这个经由过程从服务器的JNDI树上查找取得的对象实践上是HelloBean_HomeImpl_WLStub类的一个实例。接上去客户端代码:Helloh=home.create()一样Hello只是一个笼统的接口,那末h对象是甚么工具呢?打印一下:HelloBean_EOImpl_WLStub@8fa0d1本来是HelloBean_EOImpl_WLStub的一个对象实例。用这个例子来简述一遍EJB挪用历程:起首客户端JNDI查询,服务端JNDI树上Hello这个名字实践上绑定的对象是HelloBean_HomeImpl_WLStub,以是服务端将创立HelloBean_HomeImpl_WLStub的一个对象实例,序列化前往给客户端。因而客户端失掉home对象,外表上是失掉HelloHome接口的实例,实践上是举行了一次远程挪用失掉了HelloBean_HomeImpl_WLStub类的对象实例,别健忘了HelloBean_HomeImpl_WLStub也完成了HelloHome接口。然后home.create()本色上就是HelloBean_HomeImpl_WLStub.create(),该办法将发送信息给HelloBean_HomeImpl_WLSkeleton,而HelloBean_HomeImpl_WLSkeleton承受到信息后,再往挪用HelloBean_HomeImpl的create办法,至此完成第1次完全的RMI轮回。注重在此次RMI轮回过程当中,远程对象是HelloBean_HomeImpl,远程对象的接口是HelloHome,对象的stub是HelloBean_HomeImpl_WLStub,对象的skeleton是HelloBean_HomeImpl_WLSkeleton。然后HelloBean_HomeImpl再往挪用HelloBean_Impl的ejbCreate办法,而HelloBean_Impl的ejbCreate办法将卖力创立大概分派一个Bean实例,而且创立一个HelloBean_EOImpl_WLStub的对象实例。这一步对照风趣的是,在前一步RMI轮回中,远程对象HelloBean_HomeImpl在客户端有一个代办署理类HelloBean_HomeImpl_WLStub,但在这一步,HelloBean_HomeImpl本人却充任了HelloBean_Impl的代办署理类,只不外HelloBean_HomeImpl不在客户端,而是在服务端,因而不举行RMI。然后HelloBean_EOImpl_WLStub的对象实例序列化前往给客户端,这一步也很风趣,前次RMI历程,配角是HelloBean_HomeImpl和它的代办署理类HelloBean_HomeImpl_WLStub,但这这一次换成了HelloBean_EOImpl和它的代办署理类HelloBean_EOImpl_WLStub来玩了。Helloh=home.create();h.helloWorld();假定Hello接口有一个helloWorld远程办法,那末外表上是在挪用Hello接口的helloWorld办法,实践上是在挪用HelloBean_EOImpl_WLStub的helloWorld办法。然后HelloBean_EOImpl_WLStub的helloWorld办法将发送信息给服务器上的HelloBean_EOImpl_WLSkeleton,而HelloBean_EOImpl_WLSkeleton收到信息今后,再往挪用HelloBean_EOImpl的helloWorld办法。至此,完成第2次完全的RMI轮回历程。在方才HelloBean_EOImpl是作为远程对象被挪用的,它的代办署理类是HelloBean_EOImpl_WLStub,但如今HelloBean_EOImpl要作为HelloBean_Impl的代办署理类了。如今HelloBean_EOImpl往挪用HelloBean_Impl的helloWorld办法。注重!HelloBean_Impl承继了HelloBean,而HelloBean中的helloWorld办法是我们亲身编写的代码,如今终究挪用到了我们编写的代码了!至此,一次EJB挪用历程终究完成。在全部过程当中,服务端次要要挪用的类是HelloBean_Impl,HelloBean_HomeImpl,HelloBean_HomeImpl_WLSkeleton,HelloBean_EOImpl,HelloBean_EOImpl_WLSkeleton。客户端次要挪用的类是HelloBean_HomeImpl_WLStub,HelloBean_EOImpl_WLStub,这两个类在客户端代码中其实不会间接呈现,呈现在代码中的类是他们的接口HelloHome和Hello,因而客户端必要这两个接口文件,而Stub是服务器传送给他们的。Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流. 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 是一种为 Internet发展的计算机语言 Java 编程语言的风格十分接近C、C++语言。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 是一种将安全性(Security)列为第一优先考虑的语言 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 是一种为 Internet发展的计算机语言 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
页:
[1]