<script language="javascript" type="text/javascript"> showbanner(6,6,1); </script><script type="text/javascript"> google_ad_client ="pub-2141342037947367";google_ad_width = 120;google_ad_height =240;google_ad_format = "120x240_as";google_ad_channel="8570654326";google_color_border = "CCCCCC";google_color_bg ="FFFFFF";google_color_link = "000000";google_color_url ="666666";google_color_text = "333333"; </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>+-----------------------------------------------++ EJB快速开发 ++-----------------------------------------------+开发工具: IDE: Eclipse 2.1 Builder: Ant 1.5.1 Generator: Xdoclet 1.2.0b2 AppServer: Orion 1.6.0beta DBMS: MySQL 3.23.52简单说明: Eclipse——不错的一个Java集成开发环境,相信有很多人已经在使用了。 Ant——类似于Linux下的Make工具,以批处理的形式执行各种任务(比如文件拷贝、编译、打包等以及自定义任务)。 Xdoclet——一个代码自动生成工具,它主要与Ant工具配合而用在EJB快速开发上。通过在你的Bean实现类源文件中插入一些特定的JavaDoc标记,解析时来自动生成各种文件,比如接口文件和部署描述文件。同时在1.2.0版本中引入了不少设计模式的概念,比如自动生成DAO和ValueObject对象、SessionFacade对象以及一些工具类。 Orion——小巧的AppServer,不过功能很强,正逐渐支持EJB2.0。 MySQL——不消说了,我最喜欢的关系数据库。 为何采用如上开发工具组合——首先它们都是免费的,而且几乎都是开放源码的。其次它们组合的功能强大,对开发人员的机器配置要求低。支持EJB2.0中的CMP/CMR、JSP以及JMS。无论是C/S应用还是B/S应用,都可以迅速搭建开发测试平台。显而易见,这个工具组合可以极大较少开发时间,我这里就暂且把它叫做EJB快速开发工具组合 :)简单例子: 一个Stateless SessionBean。文件组织结构如下: [pre]Xdoclet_Examples | |---build.xml |---src | |---com | |---laysman | |---test | |---xdoclet | |---TellerBean.java | |---TellerClient.java |---target | |---classes | |---gen-src | |---META-INF [/pre] 开发流程: 1).编写TellerBean实现类 2).编写Ant使用的build.xml 3).自动产生各种接口文件和部署描述文件并打包(jar) 4).部署到Orion 5).编写远程测试客户端 ---------------- 1.编写SessionBean实现类TellerBean.java -------------------------- package com.laysman.test.xdoclet; import javax.ejb.*; /** * @ejb.bean name="Teller" jndi-name="ejb/Teller" type="Stateless" view-type="both" * @ejb.transaction type="Required" * @ejb.transaction-type type="Container" * @author <a href="mailto:laysman@163.com">laysman 2003-1-15</a> */ public abstract class TellerBean implements SessionBean { SessionContext sessionContext; public void ejbCreate() throws CreateException { } /** * @ejb.interface-method view-type="both" * @ejb.transaction type="Required" */ public String tell() { return "你好greeting"; } public void ejbActivate() { } public void ejbPassivate() { } public void setSessionContext(SessionContext ctx) { this.sessionContext = ctx; } public void ejbRemove() { } } --------------- 2. 编写Ant使用的build.xml(这基本上可作为一个魔板)--------------- <?xml version="1.0"?> <project name="XDoclet Examples" default="jar" basedir="."> <property name="src.dir" value="src"/> <property name="dist.dir" value="target"/> <property name="gen-src.dir" value="${dist.dir}/gen-src"/> <property name="classes.dir" value="${dist.dir}/classes"/> <property name="meta-inf.dir" value="${dist.dir}/META-INF"/> <property name="lib.dir" value="d:/library"/> <path id="samples.class.path"> <fileset dir="${lib.dir}/build"> <include name="*.jar"/> </fileset> <fileset dir="${lib.dir}/j2ee"> <include name="*.jar"/> </fileset> </path> <target name="init"> <tstamp> <format property="TODAY" pattern="d-MM-yy"/> </tstamp> <taskdef name="xdoclet" classname="xdoclet.DocletTask" classpathref="samples.class.path" /> <taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask" classpathref="samples.class.path" /> </target> <target name="prepare" depends="init"> <mkdir dir="${classes.dir}"/> <mkdir dir="${gen-src.dir}"/> <mkdir dir="${meta-inf.dir}"/> </target> <target name="ejbdoclet" depends="prepare"> <ejbdoclet destdir="${gen-src.dir}" mergedir="parent-fake-to-debug" excludedtags="@version,@author,@todo" ejbspec="2.0" force="false" verbose="false" > <fileset dir="${src.dir}"> <include name="com/laysman/test/xdoclet/*Bean.java"/> </fileset> <packageSubstitution packages="ejb" substituteWith="dao"/> <remoteinterface> <localinterface> <homeinterface> <localhomeinterface> <dataobject> <valueobject> <entitypk> <entitycmp> <entitybmp> <session> <dao> <packageSubstitution packages="ejb" substituteWith="dao"/> </dao> <utilobject cacheHomes="true" includeGUID="true"/> <deploymentdescriptor destdir="${meta-inf.dir}" validatexml="true" mergedir="fake-to-debug" xmlencoding="gb2312" > </deploymentdescriptor> </ejbdoclet> </target> <target name="compile" depends="ejbdoclet"> <javac destdir="${classes.dir}" classpathref="samples.class.path" debug="on" deprecation="on" optimize="off"> <src path="${src.dir}"/> <src path="${gen-src.dir}"/> </javac> </target> <target name="jar" depends="compile"> <delete file="${dist.dir}/teller-ejb.jar" /> <jar jarfile="${dist.dir}/teller-ejb.jar"> <fileset dir="${classes.dir}"> <include name="com/laysman/test/xdoclet/*.class"/> </fileset> <fileset dir="${dist.dir}"> <include name="META-INF/*.xml"/> </fileset> </jar> </target> <target name="clean"> <delete dir="${dist.dir}"/> </target> </project> ------------------3. 自动产生各种接口文件和部署描述文件并打包(jar)---------- 在build.xml所在目录下运行ant -buildfile build.xml jar这样会自动生成target目录并将产生的各种文件也至于该目录下,其中包括teller-ejb.jar包。------------------4. 部署到Orion ---------- 只需在[orion.dir]/config/application.xml中添加一行: <ejb-module id="testEJB" path="../applications/teller-ejb.jar" /> 当然得把target目录下的teller-ejb.jar拷贝到[orion.dir]/applications目录下------------------5. 编写远程测试客户端TellerClient.java ---------- package com.laysman.test.xdoclet; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import java.util.*; /** * @author laysman 2003-1-15 */ public class TellerClient { public static String CONTEXT_FACTORY = "com.evermind.server.rmi.RMIInitialContextFactory"; public static String PROVIDER_URL = "ormi://localhost"; public static void main(String[] args) { try { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY); env.put(Context.PROVIDER_URL, PROVIDER_URL); env.put(Context.SECURITY_PRINCIPAL, "admin"); env.put(Context.SECURITY_CREDENTIALS, "laysman"); /** * Create access to the naming context. */ Context context = new InitialContext(env); /** * Lookup the TellerHome object */ Object homeObject = context.lookup("Teller"); // Narrow the reference to a TellerHome TellerHome home = (TellerHome)PortableRemoteObject.narrow(homeObject, TellerHome.class); Date begin = new Date(); for (int i = 0; i < 10; i++) { Teller session = home.create(); System.out.println(session.tell()); } Date end = new Date(); System.out.println("last: " + String.valueOf(end.getTime() - begin.getTime()) + "ms"); }catch(Exception e) { e.printStackTrace(); } } } 注意:源文件中的JNDI环境参数是针对Orion AppServer的,对不同的AppServer应作出相应修改(当然更好的办法是使用jndi.properties配置文件来修改)。