早在.NET 2.0问世的时候,Java就应知趣地退出历史舞台
Java不同于.NET,通常其开发环境是一群乌合之众。
通常我们使用的免费的J2EE开发环境是比较流行的Eclipse,为了开发EJB,还需要安装JBoss服务器,xDoclet。JBoss服务器既用于运行EJB的服务和JNDI服务,也同时可以用于承载作为界面显示的JSP,在这种方式下,通过适当的配置,JSP可以直接访问EJB中的Remote端。但在以下的操作过程中可以发现,xDoclet不是必须的,JBoss使用的是3.2.3版本,JDK也须使用1.4.2方能与其他模块配伍。
对于像我这样Java菜鸟,而对微软开发工具非常熟悉的人而言,开发Java最大困难在于其开发环境的极端杂乱。具体而言就是各开发组件之间版本的协调的混乱。如果不了解技术的大致机制,而只通过网上或书上的例子开发,必然会遇到问题。我为了尝试EJB Hello World工程的运行,几乎花了一个多星期的时间,尽在配置环境,一路咒骂,却毫无进展。
在数次放弃,复又数次尝试后,最近终于初步厘清了关系。
事实上,一个简单的EJB工程,(对于每一个Bean)在Java代码上只要实现一个类和几个接口即可:
1. 豆子类(Bean类),从javax.ejb.SessionBean继承,通常命名为XXXBean。在豆子类中除了一堆EJB规定的动作方法外,开发者可以定义一组具体的豆子功能方法。
2. 本地作坊接口(LocalHome接口),从javax.ejb.EJBHome继承,通常命名为XXXLocalHome。这里名其为作坊因为它翻译自Home,实际上也是体现了Factory模式。其主要方法是返回一个本地对象接口实例的create方法。
3. 本地对象接口(LocalObject接口),从javax.ejb.EJBLocalObject继承,通常命名为XXXLocal。这其中接口继承不需要开发者关注,只需要声明和豆子中的功能方法一一对应的方法。
4. 远程作坊接口(Home接口)Home接口,从javax.ejb.EJBObject继承,通常命名为XXXHome。其主要方法是返回一个远程对象接口实例的create方法。
5. 主对象接口(远程对象接口,Object对象),从javax.ejb.EJBObject继承,通常命名为XXX。这其中也一样只需要声明和豆子中的功能方法一一对应的方法。
通常声明继承这些接口,eclipse还是能比较尽责地提示方法缺失并帮忙把需要实现的方法填好。这些方法在简单的EJB工程中往往都不用实现,这里也不赘述。
除了完成上述几个源文件外,在Eclipse中编译还需要定义一个生成Bean的通常名为ejb-jar.xml的XML文件,它要涵盖对上述几个文件的描述,所以即便从字面上看它们都是一些接口而看不见实现它们的对象,但这是EJB生成过程中自动实现的,也就是说,接口在这里起到了类似很多通信架构(例如彪炳史册的Microsoft Windows Communication Foundation)中协议的作用。其主体结构基本如
<ejb-jar id="ejb-jar_ID"> <display-name>工程的显示名称</display-name> <enterprise-beans> <!— EJB豆子的集合 --> <session> <!--这里以Session Bean为例 --> <description>Bean的描述</description> <display-name>Bean的显示名称</display-name> <ejb-name>Bean的总名称(提供给JNDI和外部,据试验须和主对象接口名一致方能确保外部正确引用远程接口)</ejb-name> <home>完整修饰的远程作坊接口名</home> <remote>完整修饰的远程对象(主对象)接口名</remote> <local-home>完整修饰的本地作坊接口名</local-home> <local>完整修饰的本地对象接口名</local> <ejb-class>完整修饰的豆子类名称</ejb-class> <session-type>Session类型(Stateful或Stateless)</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar>
初始工程采用Eclipse J2EE版本的默认的EJB Project创建,为了和此处介绍的其他模块的版本协调,建议采取EJB模块版本2.0而非3以上。
注意2.0版本的EJB完全不支持Annotation。默认创建完成的工程含EAR库,和JRE,需要注意将JRE和JDK版本调整到1.4.2。注意到其中有
一个JAS-WS Web Services,这或许就是WS接口,通向光明灿烂的.NET的康庄大道。
为了工程生成(Build)通过,需要在Build Path(其实就是Java对其引用类库的矫情命名)中加入jboss-j2ee.jar,这样才能使用
javax.ejb包,这在JBoss安装目录下寻找即可。指定工程的运行服务为JBoss。这样完成的EJB工程不需要依赖xDoclet等破烂。
演示该EJB功能,通常通过动态网页的方式(JSP)进行。在Eclipse中另建动态网页工程,并指定相应的运行服务为相同的JBoss。作为简单
的演示,只需要添加一个JSP页面,在其主体(body元素)中添加如下代码:
<body> <% Context ctx = new InitialContext(); Object refobj = ctx.lookup(字符串形式的Bean总名称); <远程作坊接口类型> home = (TigerHome)PortableRemoteObject.narrow(refobj, <远程作坊接口类型>.class); <远程对象接口类型> mainObj = home.create(); %> <b><%= mainObj.methodReturningString() %></b> </body>
其中methodReturningString,作为例子,是一个在Bean上定义(相应在对象接口中声明的)的返回字符串的功能函数。如此最终在动态
网页上将会显示这个返回的字符串。
结束语:
实在没办法要交作业,才尝试EJB。其实老师也不建议学生去实践EJB,但是出于好奇,我还是做了整整一个多星期,方才初步完成一个EJB 2.0的Hello world例程,想想如果这些时间可以用.NET XNA完成多少Game Programming的代码。应该庆幸的是,最终算是做出来了,也整理出这么一篇小文;同时也体会到,所谓计算机开发技术,其实就是穷举的技术,Java使其体现得淋漓尽致。
而不幸的是,后来由于我估计不足,没有对这个工程备份,所以在eclipse经过一些改动(其实也没对更这个工程本身进行)后,它又无法运行了。
Java = "Just A Vain Attempt" or "Just A Vile Asshole"