CSDN博客

img Explorerwen

EJB快速开发

发表于2004/10/29 13:44:00  1049人阅读

分类: J2EE/EJB收藏

+-----------------------------------------------+
+           EJB快速开发                         +
+-----------------------------------------------+
开发工具:
  IDE: Eclipse 2.1 M4
  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。文件组织结构如下:
  Xdoclet_Examples
    |
    |---build.xml
    |---src
    |    |---com
    |         |---laysman
    |       |---test
    |            |---xdoclet
    |               |---TellerBean.java
    |               |---TellerClient.java
    |---target
    |     |---classes
    |     |---gen-src
    |     |---META-INF  

 开发流程:
    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.RMIIniti
alContextFactory";
    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配置文件来修改)。
阅读全文
0 0

相关文章推荐

img
取 消
img