EJB快速开发


<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 --------------------------

  1. package com.laysman.test.xdoclet;
  2. import javax.ejb.*;
  3. /**
  4.  * @ejb.bean name="Teller" jndi-name="ejb/Teller" type="Stateless" view-type="both"
  5.  * @ejb.transaction  type="Required"
  6.  * @ejb.transaction-type type="Container"
  7.  * @author <a href="mailto:laysman@163.com">laysman 2003-1-15</a>
  8.  */
  9. public abstract class TellerBean implements SessionBean {
  10.     SessionContext sessionContext;
  11.     public void ejbCreate() throws CreateException {
  12.     }
  13.     /**
  14.      * @ejb.interface-method view-type="both"
  15.      * @ejb.transaction type="Required"
  16.      */
  17.     public String tell() {
  18.         return "你好greeting";
  19.     }
  20.     
  21.     public void ejbActivate() {
  22.     }
  23.     public void ejbPassivate() {
  24.     }
  25.     
  26.     public void setSessionContext(SessionContext ctx) {
  27.         this.sessionContext = ctx;
  28.     }
  29.     
  30.     public void ejbRemove() {
  31.     }
  32. }

  --------------- 2. 编写Ant使用的build.xml(这基本上可作为一个魔板)---------------

  1. <?xml version="1.0"?>
  2. <project name="XDoclet Examples" default="jar" basedir=".">
  3.     <property name="src.dir" value="src"/>
  4.     <property name="dist.dir" value="target"/>
  5.     <property name="gen-src.dir" value="${dist.dir}/gen-src"/>    
  6.     <property name="classes.dir" value="${dist.dir}/classes"/>
  7.     <property name="meta-inf.dir" value="${dist.dir}/META-INF"/>
  8.     
  9.     <property name="lib.dir" value="d:/library"/>
  10.     <path id="samples.class.path">
  11.         <fileset dir="${lib.dir}/build">
  12.             <include name="*.jar"/>
  13.         </fileset>
  14.         <fileset dir="${lib.dir}/j2ee">
  15.             <include name="*.jar"/>
  16.         </fileset>
  17.     </path>
  18.     <target name="init">
  19.         <tstamp>
  20.             <format property="TODAY" pattern="d-MM-yy"/>
  21.         </tstamp>
  22.         <taskdef
  23.             name="xdoclet"
  24.             classname="xdoclet.DocletTask"
  25.             classpathref="samples.class.path"
  26.             />
  27.         <taskdef
  28.             name="ejbdoclet"
  29.             classname="xdoclet.modules.ejb.EjbDocletTask"
  30.             classpathref="samples.class.path"
  31.             />
  32.     </target>
  33.     <target name="prepare" depends="init">
  34.         <mkdir dir="${classes.dir}"/>
  35.         <mkdir dir="${gen-src.dir}"/>
  36.         <mkdir dir="${meta-inf.dir}"/>
  37.     </target>
  38.     <target name="ejbdoclet" depends="prepare">
  39.         <ejbdoclet
  40.             destdir="${gen-src.dir}"
  41.             mergedir="parent-fake-to-debug"
  42.             excludedtags="@version,@author,@todo"
  43.             ejbspec="2.0"
  44.             force="false"
  45.             verbose="false" >
  46.             <fileset dir="${src.dir}">
  47.                 <include name="com/laysman/test/xdoclet/*Bean.java"/>
  48.             </fileset>           
  49.         <packageSubstitution packages="ejb" substituteWith="dao"/>
  50.             <remoteinterface>
  51.             <localinterface>
  52.             <homeinterface>
  53.             <localhomeinterface>
  54.             <dataobject>
  55.             <valueobject>
  56.             <entitypk>
  57.             <entitycmp>
  58.             <entitybmp>
  59.             <session>
  60.             <dao>
  61.                 <packageSubstitution packages="ejb" substituteWith="dao"/>
  62.             </dao>
  63.             <utilobject cacheHomes="true" includeGUID="true"/>
  64.             <deploymentdescriptor
  65.                 destdir="${meta-inf.dir}"
  66.                 validatexml="true"
  67.                 mergedir="fake-to-debug"
  68.                 xmlencoding="gb2312" >
  69.             </deploymentdescriptor>            
  70.         </ejbdoclet>
  71.     </target>
  72.     <target name="compile" depends="ejbdoclet">
  73.         <javac
  74.             destdir="${classes.dir}"
  75.             classpathref="samples.class.path"
  76.             debug="on"
  77.             deprecation="on"
  78.             optimize="off">
  79.             <src path="${src.dir}"/>
  80.             <src path="${gen-src.dir}"/>
  81.         </javac>
  82.     </target>
  83.     <target name="jar" depends="compile">
  84.         <delete file="${dist.dir}/teller-ejb.jar" />
  85.         <jar jarfile="${dist.dir}/teller-ejb.jar">
  86.               <fileset dir="${classes.dir}">
  87.                 <include name="com/laysman/test/xdoclet/*.class"/>
  88.               </fileset> 
  89.               <fileset dir="${dist.dir}">
  90.                 <include name="META-INF/*.xml"/>
  91.               </fileset>   
  92.         </jar>
  93.     </target>
  94.     <target name="clean">
  95.         <delete dir="${dist.dir}"/>
  96.     </target>
  97. </project>

------------------3. 自动产生各种接口文件和部署描述文件并打包(jar)----------
   在build.xml所在目录下运行ant -buildfile build.xml jar
这样会自动生成target目录并将产生的各种文件也至于该目录下,其中包括teller-ejb.jar包。

------------------4. 部署到Orion ----------
   只需在[orion.dir]/config/application.xml中添加一行:
  1. <ejb-module id="testEJB" path="../applications/teller-ejb.jar" />

当然得把target目录下的teller-ejb.jar拷贝到[orion.dir]/applications目录下

------------------5. 编写远程测试客户端TellerClient.java ----------
  1. package com.laysman.test.xdoclet;
  2. import javax.naming.Context;
  3. import javax.naming.InitialContext;
  4. import javax.rmi.PortableRemoteObject;
  5. import java.util.*;
  6. /**
  7.  * @author laysman 2003-1-15 
  8.  */
  9. public class TellerClient {
  10.     public static String CONTEXT_FACTORY = "com.evermind.server.rmi.RMIInitialContextFactory";
  11.     public static String PROVIDER_URL = "ormi://localhost";
  12.     
  13.     public static void main(String[] args) 
  14.     {
  15.         try
  16.         {
  17.             Hashtable env = new Hashtable();
  18.             env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY);
  19.             env.put(Context.PROVIDER_URL, PROVIDER_URL);
  20.             env.put(Context.SECURITY_PRINCIPAL, "admin");
  21.             env.put(Context.SECURITY_CREDENTIALS, "laysman");            
  22.             
  23.             /**
  24.              * Create access to the naming context.
  25.              */
  26.             Context context = new InitialContext(env);
  27.             /**
  28.          * Lookup the TellerHome object
  29.          */
  30.             Object homeObject = context.lookup("Teller");
  31.             // Narrow the reference to a TellerHome 
  32.             TellerHome home = (TellerHome)PortableRemoteObject.narrow(homeObject, TellerHome.class);
  33.             Date begin = new Date();
  34.         for (int i = 0; i < 10; i++) {
  35.          Teller session = home.create();
  36.         System.out.println(session.tell());
  37.         }                
  38.             
  39.         Date end = new Date();
  40.         System.out.println("last: " + String.valueOf(end.getTime() - begin.getTime()) + "ms");
  41.     }catch(Exception e) {
  42.         e.printStackTrace();
  43.     }
  44.     }
  45. }

注意:源文件中的JNDI环境参数是针对Orion AppServer的,对不同的AppServer应作出相应修改(当然更好的办法是使用jndi.properties配置文件来修改)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值