原文地址:http://blog.csdn.net/xyls_2009/article/details/4818823
EJB Container的介绍
SUN公司正式推出了EJB的规范之后,在众多的公司和开发人员中引起了很大的反响。标志着用Java开发企业级应用系统将变的非常简单。许多公司都已经推出了或正打算EJB的产品。
SUN公司对EJB的定义是:EJB是用于开发和部署多层结构的、分布式的、面向对象的Java 应用系统的跨平台的构件体系结构。采用EJB可以使开发商业应用系统变得容易,应用系统可以在一个支持EJB的环境中开发,开发完之后部署在其他的环境中,随着需求的改变,应用系统可以不加修改地迁移到其他功能更强、更复杂的服务器上。
在EJB的规范中,提到了6中角色,包括 Bean提供者,应用程序装配者,EJB容器,EJB配置工具,EJB服务提供者,系统管理员。这里面,EJB容器是EJB之所以能够运行的核心。EJB 容器管理着EJB的创建,撤消,激活,去活,与数据库的连接等等重要的核心工作。
EJB规范的出现对电子商务发展起了很大的推动作用。现在大型的电子商务网站,都是采用EJB技术的应用服务器来构建的。现在应用比较广泛的,支持EJB的应用服务器中,已经产品化了的最主要的是: IBM的WebSphere,BEA的WebLogic另外,还有开源的如JBoss。
IBM WebSphere应用服务器是一个完善的,开放的Web应用服务器。它是IBM e-business应用架构的核心。WebSphere 应用服务器 提供三个等级的版本,他们是:标准版(Standard Edition),高级版(Advanced Edition),企业版(Enterprise Edition)。其中,在高级版中开始支持EJB的编程模型。在企业版中提供一个高可靠的解决方案,使其能够移植到关键性的企业环境。EJB是WebSphere最核心的对象技术之一,它提供了具有交易功能的服务器端的Java 组件,同时又是一种新型的对象分布技术编程模型。使用EJB组件完成的应用,会支持更高级的基于数据库的交易处理功能,如多个数据库之间的更新,两阶段提交等。WebSphere是IBM整个一套开发,应用服务器的套件。他把EJB和IBM其它的优秀的产品(TXSerise 和Component Broker)结合在了一起。在具体的应用中,基于安全的考虑,性能考虑和系统管理考虑,还可以增加Firewall,WebShpere Performance Pack 和 Tivoli。所以,可能IBM的EJB Container不一定是最好的,但是,WebSphere中的EJB和IBM其他产品的结合却是做的最好的。然后,我们再来看看BEA的WebLogic: BEA公司宣布:该公司率先实现了对Enterprise JavaBeans(EJB)2.0标准的支持。凭借BEA WebLogic Server对EJB的支持,BEA可帮助开发人员更快地推出电子商务应用系统,从而让开发人员极大地受益于这一业内最新标准。作为服务器端商务逻辑的行业标准和Java2平台的基石,Enterprirse JavaBeans是BEA WebLogic应用服务器的主要技术。Enterprise JavaBeans使得开发人员能够专心地开发其应用系统和电子商务设想的商务逻辑,而不必为基础结构的构筑而分心。
虽然EJB3.0刚刚发布,但已经有很多EJB服务器支持EJB3.0了,这其中跟得最紧的是JBoss,其次WebLogic、WebSphere等也随之跟进。因此,各大厂商还是对EJB3.0非常看好的。
EJ3.0的开发工具
1>下载安装JDK5.0 http://java.sun.com/j2se/1.5.0/download.jsp
2>下载安装开发工具JBossIDE(内含Eclipse 3.2),直接解压缩即可完成安装。
http://prdownloads.sourceforge.net/jboss/JBossIDE-2.0.0.Beta2-Bundle-win32.zip?download想使用中文的朋友可以下载中文语言包NLpack1-eclipse-SDK-3.2-win32.zip
下载路径:
http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/L-3.2_Language_Packs-200607121700/NLpack1-eclipse-SDK-3.2-win32.zip
解压语言包,把features及plugins文件夹拷贝覆盖JBossIDE安装目录下的features及plugins文件夹。如果汉化失败,可能是你安装语言包之前运行过eclipse,解决办法是:把eclipse安装目录下的configuration文件夹删除,从JBossIDE安装包中解压出configuration文件夹,把configuration文件夹拷贝到JBossIDE安装目录下。
3>下载和安装JBOSS-4.0.5.GA服务器
http://prdownloads.sourceforge.net/jboss/jems-installer-1.2.0.CR1.jar?download文件下载,这里要注意:最好不要用下载工具下载,直接通过”目标另存为”下载。
安装方法:
双击jems-installer-1.2.0.CR1.jar文件,或者在DOS命令下执行:
java -jar G:/soft/jems-installer-1.2.0.CR1.jar,G:/soft为Jboss安装文件所在目录
安装界面如下:
图4-1安装初始界面
这一步是让你选择安装语言,以后点“Next”并同意许可协议,直到选择安装目录(如下图)。
图4-2选择安装目录界面
建议不要安装在Program Files目录,否则一些应用会导致莫名的错误。
图4-3安装提示界面
跟着选择一个安装类型,本文选择带集群功能的安装选项“ejb3-clustered”,如下图
图4-4选择ejb3-clustered界面
点下一步,选择advance
图4-5选择Advance界面
在Name输入栏中输入 all
图4-6输入all界面
点下一步,直到出现下图:
图4-7输入密码界面
四个选框都选上。点下一步就开始安装了。
安装完后请在“系统变量”里添加JBOSS_HOME 变量,值为Jboss的安装路径。如下图
图4-8设置系统变量界面
现在验证安装是否成功。在Dos命令窗口下执行:
C:/javaserver/jboss-4.0.5.GA/bin run -c all
这个命令用作启动jboss
观察控制台有没有Java的例外抛出。如果没有例外并看到下图,恭喜你,安装成功了。
图4-9正常启动界面
你可以输入http://localhost:8080来到Jboss的欢迎主页。在JBoss Management 栏中点击”JMX Console”进入Jboss的管理界面,这里需要你输入用户名及密码,如果你在安装的时候按照教程设置了Jboss管理台用户名及密码,那么用户名及密码都是admin。
如果启动jboss出现例外,先看看jboss所用端口有没有被占(如1099,1098 ,8080, 8083等端口)。可以下载端口查看器(Active Ports)进行检查,如果端口被占用就关闭此进程。确定不是端口被占用,那很大可能是你的JDK安装不正确。
图4-10JBOSS控制台界面
输入用户名和密码
这样服务器就安装成功了。
图4-11 JBOSS控制台界面
4.3JOBSS服务器
4.3.1JOBSS安装目录
表4-1JBOSS安装目录
JBoss中的部署
JBoss中的部署过程非常的简单、直接。在每一个配置中,JBoss不断的扫描一个特殊目录的变化:
[jboss安装目录]/server/config-name/deploy
此目录一般被称为“部署目录”。
你可以把下列文件拷贝到此目录下:
* 任何jar库(其中的类将被自动添加到JBoss的classpath中)
* EJB JAR
* WAR (Web Appliction aRrchive)
* EAR (Enterprise Application aRchive)
* 包含JBoss MBean定义的XML文件
* 一个包含EJB JAR、WAR或者EAR的解压缩内容,并以.jar、.war或者.ear结尾的目录。要重新部署任何上述文件(JAR、WAR、EAR、XML等),用新版本的文件覆盖以前的就可以了。JBoss会根据比较文件的时间发现改变,然后部署新的文件。要重新部署一个目录,更新他的修改时间即可。
如何进行EJB打包
要发布EJB时必须把她打成jar或ear包,打包的方式有很多,如:jar命令行、集成开发环境的打包向导和Ant
任务。下面介绍Elispse打包向导和Ant打包任务。
1. Elispse打包向导
在Elispse开发环境下,可以通过向导进行打包。右击项目名称,在跳出的菜单中选择“导出”,在“导出”对话框选择“Jar文件”,在“选择要导出的资源”时,选择源目录和用到的资源。然后选择一个存放目录及文件名。点“完成”就结束了打包。
2. Ant打包任务
采用Ant进行打包是比较方便的,也是作者推荐的打包方式。下面我们看一个简单的打包任务。
<?xml version="1.0"?>
<project name="jartest" default="jar" basedir=".">
<property name="build.dir" value="/build" />
<property name="build.classes.dir" value="/classes" />
<target name="jar" description="打包成Jar">
<jar jarfile="/ejbfile.jar">
<fileset dir="">
<include name="**/*.
</jar>
</target>
</project>
上面建立了一个名为jartest的Ant项目,默认的任务为default="jar",项目的路径为build.xml文件所在目录
basedir="." 。应用编绎过后的class文件已经存在于应用的/build/classes/目录下。Ant定义了一个属性
“build.classes.dir”,他指向应用的/build/classes/目录。
<target name="jar" description="打包成Jar">定义了一个名叫jar的任务,description是描述信息。任务中使用jar
命令把/build/classes/目录下的所有class文件打包进jar文件,同时也把应用下的META-INF目录下的所有文件打
包进jar文件的META-INF目录。打包后的jar文件存放在应用目录下。文件名为:ejbfile.jar
4.3.4如何进行WEB应用打包
一个Web应用发布到Jboss服务器时需要打成war包。本节将介绍jar命令行及Ant任务两种war文件的打包方
式。
1.在命令行下用jar命令进行war文件打包
在打包前把文件存成以下结构:
WEB应用根目录
| -- **/*. jsp
| -- WEB-INF
| -- web.xml
| -- lib
| -- *.*
| -- classes
| -- **/*.class
在Dos窗口中进入到WEB应用根目录下,执行如下命令
jar cvf EJBTest.war *
此命令把WEB应用根目录下的所有文件及文件夹打包成EJBTest.war文件
例如WEB应用根目录在: D:/java/webapp/ ,命令输入如下:
D:/java/webapp> jar cvf EJBTest.war *
2.在Ant任务中进行war文件打包
如果文件存放的结构如下面所示:
WEB应用根目录
|-- build.xml
|--**/*.jsp
|-- WEB-INF
| -- web.xml
| -- lib
| -- *.*
| -- classes
| -- **/*.class
那么Ant的war文件打包任务如下:
<?xml version="1.0"?>
<project name="wartest" default="war" basedir=".">
<target name="war" description="创建WEB发布包">
<war warfile="/EJBTest.war" webxml="/WEB-INF/web.xml">
<fileset dir="">
<include name="**"/>
<exclude name="build.xml" />
<exclude name="/WEB-INF/web.xml" />
</fileset>
</war>
</target>
</project>
<target name="war" description="创建WEB发布包"> 定义一个名叫war的任务。任务中执行war打包操作,把应用下除了build.xml, /WEB-INF/web.xml之外的所有文件夹及文件打进war包,同时把webxml="/WEB-INF/web.xml"作为web应用的web.xml文件。
开发第一个HelloWorld EJB3.0程序
第一步:创建HelloWorld工程,在这里我们选择Java Project
图4-12 选择Java Project界面
在下面的窗口里输入工程名
图4-13 输入工程名界面
点击next直到结束,并为此工程添加ejb3.0jar包,如下图所示: 这些类包都可以在jboss安装目录的client,/server/all/deploy/jboss-aop-jdk50.deployer,/server/all/deploy/ejb3.deployer,/lib/endorsed等文件夹下找到,或者在本书附带的光盘源代码的Lib文件夹下得到。
图4-14 添加EJB3.0jar包界面
第二步:要定义一个会话Bean,首先需要定义一个包含他所有业务方法的接口。这个接口不需要任何注释,就像普通的java接口那样定义。调用EJB的客户端通过使用这个接口引用从EJB容器得到的会话Bean对象stub。接口的定义如下:
IHelloWorld.java:
package lesson2;
public interface IHelloWorld {
String sayHello(String name);
}
第三步:实现上面的接口并加入两个注释@Stateless , @Remote,第一个注释定义这是一个无状态会话Bean,第二个注释指明这个无状态Bean的remote接口。
经过上面的步骤一个只存在Remote接口的无状态会话Bean就开发完成。无状态会话Bean是一个简单的POJO(纯粹的面向对象思想的java对象),EJB3.0容器自动地实例化及管理这个Bean。下面是HelloWorld会话Bean的实现代码:
HelloWorldBean.java 。实现类的命名规则是:接口+Bean ,如: HelloWorldBean
package lesson2;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote ({IHelloWorld.class})
public class HelloWorldBean implements IHelloWorld {
public String sayHello(String name) {
return name+"hello ,this is my first EJB";
}
}
HelloWorld会话Bean开发完了,现在我们把她她打成Jar包或EAR包发布到Jboss中。
鼠标右键点击工程,在弹出的菜单中选择Export,弹出的窗口如下:选择Jar file。
图4-15 打成jar包界面
点击next在下面的窗口中选择jar文件的存放路径。
图4-16 选择部署路径界面
打完包后,启动Jboss,把发布包拷贝到[jboss安装目录]/server/all/deploy/目录下。观察Jboss控制台输出,如果没有抛出例外并看到下面的输出界面,发布就算成功了。
图4-17 部署成功界面
一旦发布成功,你就可以在jboss 的管理平台查看她们的JNDI名,输入下面URL
http://localhost:8080/jmx-console/点击service=JNDIView,查看EJB的JNDI名称。(如下图)
图4-18 选择JNDIView界面
在出现的页面中,找到“List of MBean operations:”栏。点击”Invoke”按钮
图4-19 点击Invoke界面
出现如下界面:
图4-20 查找JNDI Name界面
在上图中可以看见HelloWorld会话Bean的JNDI名,JNDI名的组成规则是“上层名称/下层名称“,每层之间以”/”分隔。HelloWorld会话Bean的JNDI名是:HelloWorldBean/remote 。
HelloWorld会话Bean发布成功后,接下来介绍客户端如何访问她。
当一个无状态会话Bean发布到EJB容器时,容器就会为她创建一个对象stub,并把她注册进容器的JNDI目录,客户端代码使用她的JNDI名从容器获得他的stub。通过这个stub,客户端可以调用她的业务方法。
新建一个web 工程,命名为:EJBTest
图4-21 选择 Web Project界面
工程创建完毕后,创建一个jsp例子代码如下:
Test.jsp:
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="lesson2.IHelloWorld, javax.naming.*, java.util.Properties"%>
<%
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx;
try {
ctx = new InitialContext(props);
IHelloWorld helloworld =
(IHelloWorld) ctx.lookup("HelloWorldBean/remote");
out.println(helloworld.sayHello("lxl"));
} catch (NamingException e) {
out.println(e.getMessage());
}
%>
把上面的客户端应用打成war文件。
图4-22 选择部署路径界面
然后把她拷贝到“[jboss安装目录]/server/all/deploy”目录下。如果war文件的文件名为 EJBTest.war ,我们可以通过http://localhost:8080/EJBTest/Test.jsp访问客户端。运行结果如下图:
图4-23运行结果界面
在这里作者要重点说明一下EJB JNDI名称默认的命名规则,命名规则如下:
1> 如果EJB打包进后缀为*.ear的J2EE发布文件,默认的JNDI 名称是
访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
例:EJB HelloWorld打包进名为HelloWorld.ear的J2EE应用,访问她远程接口的JNDI 名是:
HelloWorld/HelloWorldBean/remote
2> 如果EJB应用打包成后缀为*.jar的发布文件, 默认的JNDI 名称是
访问本地接口:EJB-CLASS-NAME/local
访问远程接口:EJB-CLASS-NAME/remote
例: HelloWorld应用打包成HelloWorld.jar文件,访问她远程接口的JNDI名称是:HelloWorldBean/remote
另外有一点要注意:EJB-CLASS-NAME 是不带包名的,如com.foshanshop.ejb3.impl.HelloWorldBean只需取
HelloWorldBean。
EJB3.0远程调用
在正式的生产环境下,大部分调用EJB的客户端所在的服务器都为独立的Tomcat或Resin 。下面介绍如何在
独立的Tomcat服务器中调用Jboss中的EJB。在独立的Tomcat服务器中调用EJB需要有以下步骤:
1> 根据应用的需要,把调用EJB所依赖的Jar包拷贝到tomcat下的/shared/lib目录或WEB应用的
WEB-INF/lib下,所依赖的Jar一般在jboss安装目录的client,/server/all/deploy/jboss-aop-jdk50.deployer,
/server/all/deploy/ejb3.deployer,/lib/endorsed等文件夹下。
下面的jar文件是必需的:
[jboss安装目录]/client/jbossall-client.jar
[jboss安装目录]/client/jboss-remoting.jar
[jboss安装目录]/client/jboss-aop-jdk50-client.jar
[jboss安装目录]/client/jboss-aspect-jdk50-client.jar
[jboss安装目录]/client/jboss-ejb3-client.jar
[jboss安装目录]/client/jboss-ejb3x.jar
[jboss安装目录]/client/jboss-annotations-ejb3.jar
2> 把调用的EJB接口拷贝到应用的/WEB-INF/classes/目录下,如果有包名,需要把包和类一起拷过来。
注意,在部署web应用的服务器上,如果安装的是Tomcat服务器,它的安装路径不能出现空格,如:D:/Tomcat5.0不能象D:/Tomcat 5.0这样带空格的安装目录,否则会出现下面的异常:java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.net.MalformedURLException: no protocol: 5.0/webapps/ROOT/WEB-INF/classes/]。现在把上述的HelloWorld EJB程序实现远程调用:打包好的EJB组件部署在一台机器的Jobss服务器上,把服务器启动起来,在部署web应用的机器上按照上述的两个步骤把相关jar文件和用到的接口类拷到相应的目录下,把Test.jsp:文件中的
props.setProperty("java.naming.provider.url", "localhost:1099");这行的localhost改为EJB组件部署机器的IP,把web应用的工程部署到Tomcat下,启动Tomcat,就可以看到运行的结果了。
4.6小结
本章主要介绍了EJB3.0开发环境的搭建。首先给读者介绍了EJB的几种主要的容器及EJB3.0的开发工具。本章以JBOSS为例详细介绍了开发环境的搭建过程。并给读者介绍了第一个HelloWorld的EJB3.0开发部署和运行的详细过程,最后给读者介绍了EJB3.0的远程调用,相信通过本章的学习读者已经掌握了EJB3.0开发的基本知识。为后面其他内容的学习打下了良好的基础。