用简单例子学习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/