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的惊喜在等待着我们去发掘。