2004
年
7
月,
EJB
专家委员会公布了新的
EJB3.0
规范草本。
2004
年
10
月
7
号,
JBoss
发布了支持
EJB3.0
的第一个预览版本
jboss-EJB-3.0_Preview_1
。
2004
年
11
月
5
号,
JBoss
发布了支持
EJB3.0
的第二个预览版本
jboss-EJB-3.0_Preview_2
。
我们来完成第一个
EJB3.0
程序。
搭配环境
实现
EJB3.0
的环境要求使用
JBoss
的
jboss-4.0.1RC1
(已经有了
RC2
)和
JDK1.5
及更高版本。
jboss-4.0.1RC1
可以在
www.jboss.org
上下载,
JDK1.5
可以在
java.sun.com
得到。我们在
windows
环境下使用,所以下载相应
windows
版本。
首先安装
JDK
。下载
jdk-1_5_0_01-windows-i586-p.exe
,安装至相应目录,我安装至
D:\Program Files\Java\jdk1.5.0_01
。然后配置环境。在我的电脑
->
属性
->
高级
->
环境变量
->
系统变量中,设置
JAVA_HOME
=
D:\Program Files\Java\jdk1.5.0_01
,
Path
中将
D:\Program Files\Java\jdk1.5.0_01\bin;
写在最前。
下载
jboss-4.0.1RC1.zip
,直接解压缩到
D:\jboss4
下。相同方法设置
JBOSS_HOME
=
D:\jboss4
。
由于用到
ant
,所以还需要取得
Apache Ant
相关执行程序。在
Apache
服务器
,Weblogic
或
Jbuilder
等安装目录下可以找到,最好版本较高。我使用
JBuilder2005
下的,路径为
D:\Borland\JBuilder2005\thirdparty\ant\bin;
仍然设置在系统变量的
Path
中,写在
JDK
路径之后。(注意:如果
ant
版本较低将编译时报错,我的为
Apache Ant version 1.6.2 compiled on July 16 2004
)。
还要用到
jboss-EJB-3.0_Preview_2
包,可以在
www.jboss.org
得到。解压后包括
docs
,
lib
两个文件夹和
RELEASE_NOTES.txt
和
INSTALL.html
两个说明文件。
Docs
文件夹中有主页文件
index.html,
包括了
EJB3.0
的规范草本
ejb-3_0-edr-spec.pdf
,指南文件夹
tutorial
(包括范例说明文件和源文件),配置说明文件夹
reference
和
Hibernate3
的文件夹。
Lib
文件夹是部署
EJB3.0
环境所需要的
ejb3-interceptors-aop.xml
和
ejb3.deployer
。
运行简单的
EJB3.0
范例,我们只需要将
ejb3-interceptors-aop.xml
和
ejb3.deployer
文件夹拷贝到
D:\jboss4\
server\all\deploy
下即可。
我们将范例部署在all下,所以运行JBoss时我们使用
Run –c all
启动JBoss后我们就完成了环境的配置。
编写程序
Docs
文件夹下提供了许多EJB3.0各个方面的范例。我们以无状态bean为例运行范例。
无状态bean范例在stateless文件夹下。包括了存放源文件的src和运行配置文件build.xml,JNDI配置文件jndi.properties和说明文件stateless.html。
源文件包括Calculator.java
,
CalculatorBean.java
,
CalculatorLocal.java
,
CalculatorRemote.java
和
Client.java
。
在EJB3.0环境下编写无状态bean时很容易的。所有的bean类型就是homeless所以只需要创建一个bean类和实现至少一个接口。
在CalculatorBean.java我们声明一个无状态bean只需要声明为 @Stateless,EJB容器就会部署这个类为无状态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;
}
}
这个CalculatorBean实现了两个接口。一个是remote,一个是local。现在在EJB3.0中你可以仅仅实现一个remote,一个local或两个都实现。
在CalculatorRemote.java定义Calculator bean 的remote接口你仅仅需要标识其为@Remote。
import javax.ejb.Remote;
@Remote
public interface CalculatorRemote extends Calculator
{
}
同样在CalculatorLocal.java你也仅仅需要标识一个@Local就可以定义Calculator bean 的local接口
import javax.ejb.Local;
@Local
public interface CalculatorLocal extends Calculator
{
}
Calculator bean
需要两个JNDI的绑定分别对应@Remote 和@Local接口。默认的,JBoss使用接口的全名作为JNDI的名字。这使得你可以容易的调用CalculatorRemote.class.getName()来查找一个JNDI名字对应的引用。
在Client.java中你可以发现是使用remote接口的全名来查找无状态bean,也可以注意到并不存在HOME接口。
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(CalculatorRemote.class.getName());
System.out.println("1 + 1 = " + calculator.add(1, 1));
System.out.println("1 - 1 = " + calculator.subtract(1, 1));
}
}
现在你可以直接执行这个无状态bean了。
运行结果
这个实例使用ant机制运行,所以需要配置build.xml。不同的build.xml中需要设置不同的run参数中的classname:
<target name="run" depends="ejbjar">
<java classname="org.jboss.tutorial.stateless.client.Client" fork="yes" dir=".">
<classpath refid="classpath"/>
</java>
</target>
JNDI
的配置相同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
打开命令运行窗口,到范例目录下,如
D:\jboss-EJB-3.0_Preview_2\docs\tutorial\stateless
,键入命令ant编译文件。编译成功会显示:BUILD SUCCESSFUL。
成功编译后会目录下会多一个build目录,为编译后的class文件和tutorial.ejb3的文件。
然后运行 ant run,执行程序,我们可以看到:
Buildfile: build.xml
prepare:
compile:
ejbjar:
run:
[java] 2005-01-12 15:07:25,296 INFO org.jboss.remoting.InvokerRegistry[main
] - Failed to load soap remoting transport: org/apache/axis/AxisFault
[java] 1 + 1 = 2
[java] 1 - 1 = 0
BUILD SUCCESSFUL
Total time: 3 seconds
其中的信息
[java] 2005-01-12 15:07:25,296 INFO org.jboss.remoting.InvokerRegistry[main
] - Failed to load soap remoting transport: org/apache/axis/AxisFault
是JBoss的一个bug,我们可以不去关心。他们会在下一版本改进。
至此,我完成了一个EJB3.0的范例。我们可以发现EJB3.0带给我们的惊喜。我们不必再去配置大量繁琐的部署描述和复杂的接口。相信更多的EJB3.0的惊喜在等待着我们去发掘。