用简单例子学习EJB

   过去习惯用微软的开发工具和文档,最近学习JAVA,才发现涉及的概念和技术太多,不太容易入手。特别是关于学习和开发文档,比较分散,不如微软的方便。这篇文章是本人关于学习EJB的一点心得体会,希望能够给其他学习JAVA的人提供借鉴。

 

JRE: 1.6.0_07                 http://www.java.com/en/download/manual.jsp

开发工具: Eclipse v3.5.0   http://download.eclipse.org/eclipse/downloads/

编译部署: ANT v1.7.1        http://ant.apache.org/bindownload.cgi

EJB服务器: jboss-4.2.3.GA   http://www.jboss.com/

    这几个工具用google一搜就能找到官方的下载地址, java的软件不用像window的软件那样需要进行安装,直接下载后解压到某个目录就可以使用。Eclipse是一个基于java的开源开发工具,我主要用Eclipse作为编辑工具,把编译部署的工作交给了ANT.ANT是一个类似于make的自动化工具,可以做自动编译,部署,拷贝等等工作,我个人感觉这个工具非常的棒,很灵活,速度很快。

    EJB是JAVA提出的一种分布式应用的规范,有1.0,2.0,到目前最新的3.0版本。通过遵循这种规范,开发人员可以将精力主要集中在业务逻辑上,把其他的工作交给EJB服务器来处理。为了理解EJB,本人从JBOSS的网站下载了学习文档和代码,进行了实践。下面通过一个示例代码讲下最简单的stateless EJB,即无状态的ejb (此代码例子遵从EJB3)

 

(1)用eclipse创建一个新项目

(2)创建一个公共的接口 -- Calculator.java

 

package org.jboss.tutorial.stateless.bean;

public interface Calculator
{
   int add(int x, int y);

   int subtract(int x, int y);
}

(3)创建Remote接口 --CalculatorRemote.java 

 

package org.jboss.tutorial.stateless.bean;

import javax.ejb.Remote;


@Remote
public interface CalculatorRemote extends Calculator
{

}

 

 (4)创建Local接口 -- CalculatorLocal.java

 

package org.jboss.tutorial.stateless.bean;

import javax.ejb.Local;


@Local
public interface CalculatorLocal extends Calculator
{
}

 

  (5)创建Bean -- CalculatorBean.java

 

package org.jboss.tutorial.stateless.bean;

import javax.ejb.Stateless;

@Stateless
public class CalculatorBean implements CalculatorRemote, CalculatorLocal
{
   public int add(int x, int y)
   {
      return x + y;
   }

   public int subtract(int x, int y)
   {
      return x - y;
   }
}

 

 

 (5)创建Client测试代码-- Client.java

 

package org.jboss.tutorial.stateless.client;

import org.jboss.tutorial.stateless.bean.Calculator;
import org.jboss.tutorial.stateless.bean.CalculatorRemote;

import javax.naming.InitialContext;

public class Client
{
   public static void main(String[] args) throws Exception
   {
   
      InitialContext ctx = new InitialContext();
      Calculator calculator = (Calculator) ctx.lookup("CalculatorBean/remote");

      System.out.println("1 + 1 = " + calculator.add(1, 1));
      System.out.println("1 - 1 = " + calculator.subtract(1, 1));
      System.out.println("Hello World");
   }
}

 

(6)创建一个build.xml文件-- 这是用于ant的脚本文件

注意:脚本里有个 env.JBOSS_HOME变量,这要求你必须在环境变量里加入一个JBOSS_HOME,它的值指向jboss的安装目录。

 

<?xml version="1.0"?>

<!-- ======================================================================= -->
<!-- JBoss build file                                                       -->
<!-- ======================================================================= -->

<project name="JBoss" default="ejbjar" basedir=".">

   <property environment="env"/>
   <property name="src.dir" value="${basedir}/src"/>
   <property name="jboss.home" value="${env.JBOSS_HOME}"/>
   <property name="jboss.server.config" value="default"/>
   <property name="build.dir" value="${basedir}/build"/>
   <property name="build.classes.dir" value="${build.dir}/classes"/>
   <property name="build.artifact" value="jboss-ejb3-tutorial-stateless.jar"/>

   <!-- Build classpath -->
   <path id="classpath">
      <!-- So that we can get jndi.properties for InitialContext -->
      <pathelement location="${basedir}"/>
     <!-- Only the jbossall-client.jar should ideally be sufficient -->
      <fileset dir="${jboss.home}/client">
         <include name="**/jbossall-client.jar"/>
      </fileset>
     <!-- javax.persistence.* -->
      <fileset dir="${jboss.home}/server/default/lib">
           <include name="ejb3-persistence.jar"/>
           <include name="jboss-ejb3x.jar" />
         </fileset>
    
      <pathelement location="${build.classes.dir}"/>
   </path>

   <property name="build.classpath" refid="classpath"/>

   <!-- =================================================================== -->
   <!-- Prepares the build directory                                        -->
   <!-- =================================================================== -->
   <target name="prepare">
      <mkdir dir="${build.dir}"/>
      <mkdir dir="${build.classes.dir}"/>
   </target>

   <!-- =================================================================== -->
   <!-- Compiles the source code                                            -->
   <!-- =================================================================== -->
   <target name="compile" depends="prepare">
      <javac srcdir="${src.dir}"
         destdir="${build.classes.dir}"
         debug="on"
         deprecation="on"
         optimize="off"
         includes="**">
         <classpath refid="classpath"/>
      </javac>
   </target>

   <target name="ejbjar" depends="compile">
      <jar jarfile="build/${build.artifact}">
         <fileset dir="${build.classes.dir}">
            <include name="**/*.class"/>
         </fileset>
      </jar>
      <copy file="build/${build.artifact}" todir="${jboss.home}/server/${jboss.server.config}/deploy"/>
   </target>

   <target name="run" depends="ejbjar">
      <java classname="org.jboss.tutorial.stateless.client.Client" fork="yes" dir=".">
         <classpath refid="classpath"/>
      </java>
   </target>

   <!-- =================================================================== -->
   <!-- Cleans up generated stuff                                           -->
   <!-- =================================================================== -->
   <target name="clean.db">
      <delete dir="${jboss.home}/server/${jboss.server.config}/data/hypersonic"/>
   </target>

   <target name="clean">
      <delete dir="${build.dir}"/>
      <delete file="${jboss.home}/server/${jboss.server.config}/deploy/${build.artifact}"/>
   </target>


</project>

 

(7) 在eclipse里,右键选择build.xml,run as->ant build,就会自行进行编译和部署,会产生一个jboss-ejb3-tutorial-stateless.jar

文件,并被拷贝到"jboss安装目录/server/default/deploy"目录下

 

(8)双击"jboss安装目录/bin/run.bat",运行jboss。在提示信息中可以看到该ejb被加载。

[EJBContainer] STARTED EJB: org.jboss.tutorial.stateless.bean.CalculatorBean ejbName: CalculatorBean
[EJB3Deployer] Deployed: file:C:/jboss-4.2.3.GA/server/default/deploy/jboss-ejb3-tutorial-state

 

(9)配置jndi,进入到"项目目录/build/classes"目录,创建一个jndi.properties文件:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost

 

 (10)在"项目目录/build/classes"目录下,用命令行方式输入

    java -cp .;C:/jboss-4.2.3.GA/client/jbossall-client.jar org.jboss.tutorial.stateless.client.Client

 

(注意:jbossall-client.jar位于jboss的client目录下,如果不引用该包会出现这样的错误:

javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory)

 

正常运行的话会出现以下的结果:

1 + 1 = 2
1 - 1 = 0
Hello World

 

 

总结:从概念上说,即client通过jndi服务查询到本地的jboss服务器的EJB对象--CalculatorBean,然后JBOSS实例化该EJB,并传回引用,client根据引用调用add,subtract方法,并输出hello world. 通过这么一个简单的例子可以让开发者大致了解EJB的运行框架

 

 

参考: http://www.jboss.org/ejb3/docs/tutorial/

 

   

 

 

posted on 2010-01-14 22:51  omage  阅读(62)  评论(0编辑  收藏  举报