- 浏览: 240218 次
- 来自: ...
文章分类
最新评论
1、下载例子源程序
所有例子的源代码可以直接从 www.jboss.org进行下载。下载完后放在一个目录下。下载网址:http://www.jboss.org/docs/manual/files/documentation-example.zip
1.1 建立 BEAN
此节主要是建立一个简单的EJB,可以查看代码,这个“Interest”例子,是一个简单无状态的会话EJB。它的目的是根据说明的利息率,来对借的所有钱计算利息。实际上在整个包代码中只有一行功能。
远程接口只有一个商业方法calculateCompoundInterest。Home interface 文件名InterestHome.java。代码如下:
最后我们给出bean实现类,文件名称:InterestBean.java。代码如下:
注意大部分方法是空的。因为这些方法在SessionBean接口中说明,所以必须在InterestBean中存在,但在这个简单例子中,不需要具体内容。
2、部署描述符
当你编辑完类文件后,我们来看部署描述符。此文件告诉EJB Server是哪个类应该被唤醒bean、Home Interface 和remote Interface。如果一个包中有不止一个bean,它指明ejb同另外bean如何相和。在这
个简单例子中只有一个ejb,所以我们不用关心这方面问题。
大部分商业EJB Server都提供图形化部署工具,来构造部署描述符,JBoss没有XML编辑器,但是它能够简单手工构造部署描述符。下面是Interest Bean部署描述符:
部署描述符文件必须命名为“ejb-jar.xml”,并且必须放在目录META-INF下。一个大家容易犯的错误是目录名字,有的写成“META_INF”, “META~INF”或“meta-inf”所有这些都不能正常的工作。
我们在server上部署一个应用程序,而不是一个ejb。在这个例子中我们的应用程序只有一个ejb。在部署描述符中<ejb-name>Interest</ejb-name>表明ejb的名称。JBoss缺省是把bean的home interface作为JNDI命名空间放在<ejb-name>中,除非你修改缺省值。实际上客户端应用程序不是必须使用这个名字的。开发者不用为JNDI命名空间指明一个不同的名字而费心。然而一个由完整应用程序的产品包含多个beans,通常用一个和开发者说明不同的名字。所以会发现“[application name]/[bean name]”等,关于这部分我们以后介绍。
尽管部署描述符格式的文件ejb-jar.xml对所有ejb Server都是共有的。你可以从sun得到一个正确定义的DTD, 但是没有为一个特殊EJB Server指明每个必须要求。也没有说明如何从ejb-name影射到部署的JNDI名字,例如“[application name]/[bean name]”。通过JBoss提供一个缺省行为,来进行工作。这些工作来自于ejb-jar.xml。在高级配置的案例中,你必须定义JBoss说明行为, 此行为用jboss.xml部署描述符。在高级配置中我们会谈到jboss.xml描述符的详细信息的。
这里我们仅配置jboss.xml描述符的JNDI名字来用来访问Interest EJB home inrterface。通过缺省的JNDI名字用来访问EJB home inrterface, 需要同ejb-jar.xml的ejb-name相同。对于这个简单的例子,Interest bean通过JNDI初始化上下文(作为“Interest”)来定位。 我们想用“interest/Interest”使home interface 可以使用,所以我们必须用jboss.xml描述符来说明。在jboss.xml中,重新覆盖缺省的JNDI命名。为了重新编写缺省的行为,我们用ejb-jar.xml中的ejb-name元素值作为bean home接口的JNDI命名,必须说明jndi命名,来写jboss.xml描述符如下:
这个文件说明调用的Interest BEAN被绑定在interest/Interest的JNDI名称下。我们建立的标准ejb-jar.xml部署描述符同JBoss说明jboss.xml共同设置Interest EJB home接口的JNDI名称为“interest/Interest”。我们现在有了EJB类,这些类是建立ejb 文件包必须的文件。
3、打包和部署BEAN
jar包是建立一个JAR文件,该文件包含EJB类文件和部署描述符。在下载的例子可能和你设置环
境不同,所以需要修改examples\build\build.xml的内容。关于各个ant方面的内容,我会在Ant文档中介绍给大家。关于如何修改,下面我一步步地来告诉大家。以下是windows平台的。至于Unix/Lunix平台基本相似,这里就不在叙述了。
1) 在修改之前,比首先设定JBOSS_DIST环境变量,指定到你安装的Jboss的目录。我安装在C:\jboss-3.0.6_tomcat-4.1.18, 所以 JBOSS_DIST设定为C:\jboss-3.0.6_tomcat-4.1.18。
2) 你是否安装了tomcat或jetty等web服务器。如果你没有安装,建议你安装jboss-3.0.6_tomcat-4.1.18, JBoss和tomcat直接结合在一起啦,不需要再单独安装,当然也可以安装jboss-jetty( JBoss和jetty直接结合在一起)。取决你喜欢什么web服务器。
3) 完成上面两步后,我们来讨论修改examples\build\build.xml文件。在原有的文件中的部分代码:
由于此代码例子是jboss2.2中的所以对于我们不能适应,在此基础上我们来进行改动。在改动之前,来说明一下为什么改动,让大家清楚改动原因,不是一团雾水。
<available property="servlet.jar" value="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar" file="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar"/>….
此部分说明你运用的web服务器是什么,根据你使用的web服务器来设置servlet.jar。 由于我使用的是jboss-tomcat.。
<path id="base.path_24"> … </path>说明客户端要的CLASSPATH包。
修改以后的部分文件:
4)修改完后存盘。然后到exaples\build目录下运行以下命令:
ant intro-interest-jar
如果成功会提示 : BUILD SUCCESSFUL 。
在编译EJB 类文件,建立ejb-jar文件时,如果有一个java.lang.NoClassDefFoundError异常产生,你需要检查你的classpath。修改<path id="base.path_306">中的内容。
5)完成后你可以查看interest.jar文件中内容:
jar –tvf interest.jar为了把bean部署到server上,必须拷贝interest.jar文件到JBOSS_DIST/server/default/deploy目录下。服务器自己会发现发生变化的文件,并重新部署它。
6)当JBoss server运行时,通过在examlpes\build目录下运行ant intro-interest-deploy来部署jar。在你部署期间,你会看到在server控制台的一些信息。
7)如果你发现部署失败的信息,通常是部署描述符ejb-jar.xml文件结构坏了或丢失或在错误的目录下。
8)如果在Server上部署完后,我们来编写一个简单客户端来测试它是否正常工作。
所有例子的源代码可以直接从 www.jboss.org进行下载。下载完后放在一个目录下。下载网址:http://www.jboss.org/docs/manual/files/documentation-example.zip
1.1 建立 BEAN
此节主要是建立一个简单的EJB,可以查看代码,这个“Interest”例子,是一个简单无状态的会话EJB。它的目的是根据说明的利息率,来对借的所有钱计算利息。实际上在整个包代码中只有一行功能。
1.2 回顾EJBs
在我们查看代码之前,我们先对EJB进行复习一下。在EJB最小类型,也必须有三个类:remote interface, home interface和bean实现类。
remote interface是会把EJB中方法提供给外边世界,让外边的代码来进行调用,在这个例子中类名称是org.jboss.interest.Interrest。
home interface是管理remote interface类的类。包括建立、删除等操作。在这个例子中类名称是org.jboss.interest.InterrestHome。
bean实现类提供home interface和remote interface所有方法的实现。在这个例子中类名称是org.jboss.interest.InterrestBean。
当然一个Bean可能还包括其他类,甚至其他包。但是必须有此三个类,其他类是在此三个类之上建立的。所有类被打包进一个JAR文件,此文件是用一个目录结构来反映出包的层次关系。在此例子中所有类都打包在org.jboss.interest包中,所以他们需要在目录org/jboss/interest/下。
在包含所有类的jar文件建立之前,必须有一个META-INF目录。此目录存放了部署描述符(通常叫“ejb-jar.xml”),和可选的其他XML文件。这些文件告诉服务器关于应用明确服务信息。对于JBoss 来讲,文件名必须叫“jboss.xml”。
创建jar文件后部署到JBoss Server上。在客户端你需要一个jndi.properties文件,此文件告诉你的客户端程序从哪里初始化查找JNDI 命名服务。从这个服务,客户端将查找到Interest bean,并且返回bean的home interface。home interface用来得到bean的一个remote interface。它可以用远程接口来访问bean提供的商业方法。
1.3 EJB类
我们需要三个类:remote interface, home interface 和bean实现类。remote interface远程接口类,文件名Interest.java。代码如下:
在我们查看代码之前,我们先对EJB进行复习一下。在EJB最小类型,也必须有三个类:remote interface, home interface和bean实现类。
remote interface是会把EJB中方法提供给外边世界,让外边的代码来进行调用,在这个例子中类名称是org.jboss.interest.Interrest。
home interface是管理remote interface类的类。包括建立、删除等操作。在这个例子中类名称是org.jboss.interest.InterrestHome。
bean实现类提供home interface和remote interface所有方法的实现。在这个例子中类名称是org.jboss.interest.InterrestBean。
当然一个Bean可能还包括其他类,甚至其他包。但是必须有此三个类,其他类是在此三个类之上建立的。所有类被打包进一个JAR文件,此文件是用一个目录结构来反映出包的层次关系。在此例子中所有类都打包在org.jboss.interest包中,所以他们需要在目录org/jboss/interest/下。
在包含所有类的jar文件建立之前,必须有一个META-INF目录。此目录存放了部署描述符(通常叫“ejb-jar.xml”),和可选的其他XML文件。这些文件告诉服务器关于应用明确服务信息。对于JBoss 来讲,文件名必须叫“jboss.xml”。
创建jar文件后部署到JBoss Server上。在客户端你需要一个jndi.properties文件,此文件告诉你的客户端程序从哪里初始化查找JNDI 命名服务。从这个服务,客户端将查找到Interest bean,并且返回bean的home interface。home interface用来得到bean的一个remote interface。它可以用远程接口来访问bean提供的商业方法。
1.3 EJB类
我们需要三个类:remote interface, home interface 和bean实现类。remote interface远程接口类,文件名Interest.java。代码如下:
package org.jboss.docs.interest; import javax.ejb.EJBObject; import java.rmi.RemoteException; /** This interface defines the `Remote' interface for the `Interest' EJB. Its single method is the only method exposed to the outside world. The class InterestBean implements the method. */ public interface Interest extends EJBObject { /** Calulates the compound interest on the sum `principle', with interest rate per period `rate' over `periods' time periods. This method also prints a message to standard output; this is picked up by the EJB server and logged. In this way we can demonstrate that the method is actually being executed on the server, rather than the client. */ public double calculateCompoundInterest(double principle, double rate, double periods) throws RemoteException; } |
远程接口只有一个商业方法calculateCompoundInterest。Home interface 文件名InterestHome.java。代码如下:
package org.jboss.docs.interest; import java.io.Serializable; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; /** This interface defines the 'home' interface for the 'Interest' EJB. */ public interface InterestHome extends EJBHome { /** Creates an instance of the `InterestBean' class on the server, and returns a remote reference to an Interest interface on the client. */ Interest create() throws RemoteException, CreateException; } |
最后我们给出bean实现类,文件名称:InterestBean.java。代码如下:
package org.jboss.docs.interest; import java.rmi.RemoteException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; /** This class contains the implementation for the 'calculateCompoundInterest' method exposed by this Bean. It includes empty method bodies for the methods prescribe by the SessionBean interface; these don't need to do anything in this simple example. */public class InterestBean implements SessionBean { /** Calulates the compound interest on the sum `principle', with interest rate per period `rate' over `periods' time periods. This method also prints a message to standard output; this is picked up by the EJB server and logged. In this way we can demonstrate that the method is actually being executed on the server, rather than the client. */ public double calculateCompoundInterest(double principle, double rate, double periods) { System.out.println("Someone called `calculateCompoundInterest!'"); return principle * Math.pow(1+rate, periods) - principle; } /** Empty method body */ public void ejbCreate() {} /** Every ejbCreate() method ALWAYS needs a corresponding ejbPostCreate() method with exactly the same parameter types. */ public void ejbPostCreate() {} /** Empty method body */ public void ejbRemove() {} /** Empty method body */ public void ejbActivate() {} /** Empty method body */ public void ejbPassivate() {} /** Empty method body */ public void setSessionContext(SessionContext sc) {} } |
注意大部分方法是空的。因为这些方法在SessionBean接口中说明,所以必须在InterestBean中存在,但在这个简单例子中,不需要具体内容。
2、部署描述符
当你编辑完类文件后,我们来看部署描述符。此文件告诉EJB Server是哪个类应该被唤醒bean、Home Interface 和remote Interface。如果一个包中有不止一个bean,它指明ejb同另外bean如何相和。在这
个简单例子中只有一个ejb,所以我们不用关心这方面问题。
大部分商业EJB Server都提供图形化部署工具,来构造部署描述符,JBoss没有XML编辑器,但是它能够简单手工构造部署描述符。下面是Interest Bean部署描述符:
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar> <description>JBoss Interest Sample Application</description> <display-name>Interest EJB</display-name> <enterprise-beans> <session> <ejb-name>Interest</ejb-name> <home>org.jboss.docs.interest.InterestHome</home> <remote>org.jboss.docs.interest.Interest</remote> <ejb-class>org.jboss.docs.interest.InterestBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Bean</transaction-type> </session> </enterprise-beans> </ejb-jar> |
部署描述符文件必须命名为“ejb-jar.xml”,并且必须放在目录META-INF下。一个大家容易犯的错误是目录名字,有的写成“META_INF”, “META~INF”或“meta-inf”所有这些都不能正常的工作。
我们在server上部署一个应用程序,而不是一个ejb。在这个例子中我们的应用程序只有一个ejb。在部署描述符中<ejb-name>Interest</ejb-name>表明ejb的名称。JBoss缺省是把bean的home interface作为JNDI命名空间放在<ejb-name>中,除非你修改缺省值。实际上客户端应用程序不是必须使用这个名字的。开发者不用为JNDI命名空间指明一个不同的名字而费心。然而一个由完整应用程序的产品包含多个beans,通常用一个和开发者说明不同的名字。所以会发现“[application name]/[bean name]”等,关于这部分我们以后介绍。
尽管部署描述符格式的文件ejb-jar.xml对所有ejb Server都是共有的。你可以从sun得到一个正确定义的DTD, 但是没有为一个特殊EJB Server指明每个必须要求。也没有说明如何从ejb-name影射到部署的JNDI名字,例如“[application name]/[bean name]”。通过JBoss提供一个缺省行为,来进行工作。这些工作来自于ejb-jar.xml。在高级配置的案例中,你必须定义JBoss说明行为, 此行为用jboss.xml部署描述符。在高级配置中我们会谈到jboss.xml描述符的详细信息的。
这里我们仅配置jboss.xml描述符的JNDI名字来用来访问Interest EJB home inrterface。通过缺省的JNDI名字用来访问EJB home inrterface, 需要同ejb-jar.xml的ejb-name相同。对于这个简单的例子,Interest bean通过JNDI初始化上下文(作为“Interest”)来定位。 我们想用“interest/Interest”使home interface 可以使用,所以我们必须用jboss.xml描述符来说明。在jboss.xml中,重新覆盖缺省的JNDI命名。为了重新编写缺省的行为,我们用ejb-jar.xml中的ejb-name元素值作为bean home接口的JNDI命名,必须说明jndi命名,来写jboss.xml描述符如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss> <enterprise-beans> <session> <ejb-name>Interest</ejb-name> <jndi-name>interest/Interest</jndi-name> </session> </enterprise-beans> </jboss> |
这个文件说明调用的Interest BEAN被绑定在interest/Interest的JNDI名称下。我们建立的标准ejb-jar.xml部署描述符同JBoss说明jboss.xml共同设置Interest EJB home接口的JNDI名称为“interest/Interest”。我们现在有了EJB类,这些类是建立ejb 文件包必须的文件。
3、打包和部署BEAN
jar包是建立一个JAR文件,该文件包含EJB类文件和部署描述符。在下载的例子可能和你设置环
境不同,所以需要修改examples\build\build.xml的内容。关于各个ant方面的内容,我会在Ant文档中介绍给大家。关于如何修改,下面我一步步地来告诉大家。以下是windows平台的。至于Unix/Lunix平台基本相似,这里就不在叙述了。
1) 在修改之前,比首先设定JBOSS_DIST环境变量,指定到你安装的Jboss的目录。我安装在C:\jboss-3.0.6_tomcat-4.1.18, 所以 JBOSS_DIST设定为C:\jboss-3.0.6_tomcat-4.1.18。
2) 你是否安装了tomcat或jetty等web服务器。如果你没有安装,建议你安装jboss-3.0.6_tomcat-4.1.18, JBoss和tomcat直接结合在一起啦,不需要再单独安装,当然也可以安装jboss-jetty( JBoss和jetty直接结合在一起)。取决你喜欢什么web服务器。
3) 完成上面两步后,我们来讨论修改examples\build\build.xml文件。在原有的文件中的部分代码:
<target name="validate-servlet"> <!-- Override with your web server servlet jar location. The default assumes that JBOSS_DIST points to a JBoss/Tomcat bundle distribution --> <available property="servlet.jar" value="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar" file="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar"/> <available property="servlet.jar" value="${env.JBOSS_DIST}/../jetty/lib/javax.servlet.jar" file="${env.JBOSS_DIST}/../jetty/lib/javax.servlet.jar"/> <available property="servlet.jar" value="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar" file="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar"/> <available property="servlet.jar" value="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar" file="${env.TOMCAT_HOME}/lib/servlet.jar"/> <property name="servlet.jar" value="COULD_NOT_FIND_SERVLET_JAR"/> <path id="base.path_22"> <pathelement location="${jboss.dist}/client/ejb.jar"/> <pathelement location="${jboss.dist}/client/jaas.jar"/> <pathelement location="${jboss.dist}/client/jbosssx-client.jar"/> <pathelement location="${jboss.dist}/client/jboss-client.jar"/> <pathelement location="${jboss.dist}/client/jnp-client.jar"/> <pathelement location="${servlet.jar}"/> </path> <path id="base.path_24"> <pathelement location="${jboss.dist}/client/jboss-j2ee.jar"/> <pathelement location="${jboss.dist}/client/jaas.jar"/> <pathelement location="${jboss.dist}/client/jbosssx-client.jar"/> <pathelement location="${jboss.dist}/client/jboss-client.jar"/> <pathelement location="${jboss.dist}/client/jnp-client.jar"/> <pathelement location="${servlet.jar}"/> </path> </target> <target name="validate-jboss" depends="validate-servlet"> <available property="classpath_id" value="base.path_22" file="${jboss.dist}/client/ejb.jar" /> <available property="classpath_id" value="base.path_24" file="${jboss.dist}/client/jboss-j2ee.jar" /> </target> |
由于此代码例子是jboss2.2中的所以对于我们不能适应,在此基础上我们来进行改动。在改动之前,来说明一下为什么改动,让大家清楚改动原因,不是一团雾水。
<available property="servlet.jar" value="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar" file="${env.JBOSS_DIST}/../tomcat/lib/servlet.jar"/>….
此部分说明你运用的web服务器是什么,根据你使用的web服务器来设置servlet.jar。 由于我使用的是jboss-tomcat.。
<path id="base.path_24"> … </path>说明客户端要的CLASSPATH包。
修改以后的部分文件:
<target name="validate-servlet"> <!-- Override with your web server servlet jar location. The default assumes that JBOSS_DIST points to a JBoss/Tomcat bundle distribution --> <available property="servlet.jar" value="${env.JBOSS_DIST}/tomcat-4.1.x/common/lib/servlet.jar" file="${env.JBOSS_DIST}/tomcat-4.1.x/common/lib/servlet.jar"/> <available property="servlet.jar" value="${env.JBOSS_DIST}/../jetty/lib/javax.servlet.jar" file="${env.JBOSS_DIST}/../jetty/lib/javax.servlet.jar"/> <available property="servlet.jar" value="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar" file="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar"/> <available property="servlet.jar" value="${env.JBOSS_DIST}/../catalina/common/lib/servlet.jar" file="${env.TOMCAT_HOME}/lib/servlet.jar"/> <property name="servlet.jar" value="COULD_NOT_FIND_SERVLET_JAR"/> <path id="base.path_22"> <pathelement location="${jboss.dist}/client/ejb.jar"/> <pathelement location="${jboss.dist}/client/jaas.jar"/> <pathelement location="${jboss.dist}/client/jbosssx-client.jar"/> <pathelement location="${jboss.dist}/client/jboss-client.jar"/> <pathelement location="${jboss.dist}/client/jnp-client.jar"/> <pathelement location="${servlet.jar}"/> </path> <path id="base.path_306"> <pathelement location="${jboss.dist}/client/jboss-j2ee.jar"/> <pathelement location="${jboss.dist}/client/jboss-jaas.jar"/> <pathelement location="${jboss.dist}/client/jbosssx-client.jar"/> <pathelement location="${jboss.dist}/client/jboss-client.jar"/> <pathelement location="${jboss.dist}/client/jnp-client.jar"/> <pathelement location="${jboss.dist}/client/jbossall-client.jar"/> <pathelement location="${jboss.dist}/client/log4j.jar"/> <pathelement location="${servlet.jar}"/> </path> </target> <target name="validate-jboss" depends="validate-servlet"> <available property="classpath_id" value="base.path_22" file="${jboss.dist}/client/ejb.jar" /> <available property="classpath_id" value="base.path_306" file="${jboss.dist}/client/jboss-j2ee.jar" /> </target> |
4)修改完后存盘。然后到exaples\build目录下运行以下命令:
ant intro-interest-jar
如果成功会提示 : BUILD SUCCESSFUL 。
在编译EJB 类文件,建立ejb-jar文件时,如果有一个java.lang.NoClassDefFoundError异常产生,你需要检查你的classpath。修改<path id="base.path_306">中的内容。
5)完成后你可以查看interest.jar文件中内容:
jar –tvf interest.jar为了把bean部署到server上,必须拷贝interest.jar文件到JBOSS_DIST/server/default/deploy目录下。服务器自己会发现发生变化的文件,并重新部署它。
6)当JBoss server运行时,通过在examlpes\build目录下运行ant intro-interest-deploy来部署jar。在你部署期间,你会看到在server控制台的一些信息。
7)如果你发现部署失败的信息,通常是部署描述符ejb-jar.xml文件结构坏了或丢失或在错误的目录下。
8)如果在Server上部署完后,我们来编写一个简单客户端来测试它是否正常工作。
4、 编码和编译客户端
单独一个ejb是不能用,我们至少需要一个简单客户端来用它的服务。一个EJB可以被其他的EJB,普通的JavaBean,一个JSP page,一个applet程序或是独立的应用程序调用。在这个例子中。我们编写一个简单的应用程序。这个应用程序将会建立Interest类的一个对象。并且执行它的方法。当部署完bean后,server会绑定EJB home 接口到interest/Interest的JNDI名字下,并输出此home 接口,能通过RMI被调用。客户端代码如下:
客户端在JNDI命名“interest/Interest”下查找InterestHome接口。如果你提供了一个正确的jboss.xml文件,Bean home接口将会绑定到这个名字。否则,JNDI的名字是“Interest”。为了连接JBoss JNDI,必须建立一个初始化上下文,该上下文是根据在客户端的classpath路径下jndi.properties来的。这个jndi.property文件我们放在了examples\resources\jndi.properties中。代码如下:
指定了InitialContextFactory(初始化上下文工厂),url,和工厂对象的包。在这里url是“localhost”,或运行JBoss的主机名(IP),用的缺省端口是1099。为了不同RMI协议互相兼容,通过“narrow”方法来确保“ref”对象能转换为“InterestHome”对象。客户端不需要必须和EJB类在同一个包中。所以它必须import ejb claess类。
为了能运行Ant命令。我修改了examples\org\jboss\docs\interest\build.xml文件,原文件的部分内容:
修改后为:
修改完后保存。编译和运行InterestClient,通过以下命令:
ant intro-interest-client会出现正确的结果。
5、补充说明
各个jar文件:
1) jboss-j2ee.jar :是标准的javax.ejb.* 包括EJB2.0接口和类。
2) jboss-jaas.jar :是java鉴定和授权服务安全类。
3) jbosssx-client.jar :是JbossSX安全扩展客户端类。
4) jboss-client.jar :是Jboss EJB容器代理和stub客户端类。
5) jnp-client.jar :是JBoss JNDI提供者客户端类。
现在隐藏代码,编译和部署EJB, 运行简单客户端进行测试。
6、 结论
最后来进行一个总结。
Server:
为每个EJB(包括有、无状态的Session,或实体Bean),都需要三个文件: bean实现类, remote接口类,home接口类。这些类和一个或多个部署描述符(ejb-jar.xml, jboss.xml等),这些描述符必须在META-INF目录下,一起打包进jar文件。为部署这个jar文件,你只需要拷贝到jboss\server\default\deploy\下。
Client:
1)从JNDI服务,查找bean的home 接口;
2)从home接口,建立一个新的bean或得到一个已经存在bean;
3)用得到的remote接口来访问服务器上bean实现类中商业方法。
在客户端查找home 接口之前,客户端必须知道如何从JNDI来定位。因此我们提供了一个jndi.properties文件。这个文件和一些jboss\clientx下的jar,必须包含到CLASSPATH中,才能使客户端运行。
单独一个ejb是不能用,我们至少需要一个简单客户端来用它的服务。一个EJB可以被其他的EJB,普通的JavaBean,一个JSP page,一个applet程序或是独立的应用程序调用。在这个例子中。我们编写一个简单的应用程序。这个应用程序将会建立Interest类的一个对象。并且执行它的方法。当部署完bean后,server会绑定EJB home 接口到interest/Interest的JNDI名字下,并输出此home 接口,能通过RMI被调用。客户端代码如下:
package org.jboss.docs.interest; import javax.naming.InitialContext; import javax.naming.Context; import javax.rmi.PortableRemoteObject; import org.jboss.docs.interest.Interest; import org.jboss.docs.interest.InterestHome; /** This simple application tests the 'Interest' Enterprise JavaBean which is implemented in the package 'org.jboss.docs.interest'. For this to work, the Bean must be deployed on an EJB server. */ public class InterestClient { /** This method does all the work. It creates an instance of the Interest EJB on the EJB server, and calls its `calculateCompoundInterest()' method, then prints the result of the calculation. */ public static void main(String[] args) { // Enclosing the whole process in a single `try' block is not an ideal way // to do exception handling, but I don't want to clutter the program up // with catch blocks try { // Get a naming context InitialContext jndiContext = new InitialContext(); System.out.println("Got context"); // Get a reference to the Interest Bean Object ref = jndiContext.lookup("interest/Interest"); System.out.println("Got reference"); // Get a reference from this to the Bean's Home interface InterestHome home = (InterestHome) PortableRemoteObject.narrow(ref, InterestHome.class); // Create an Interest object from the Home interface Interest interest = home.create(); // call the calculateCompoundInterest() method to do the calculation System.out.println("Interest on 1000 units, at 10% per period, compounded over 2 periods is:"); System.out.println(interest.calculateCompoundInterest(1000, 0.10, 2)); } catch(Exception e) { System.out.println(e.toString()); } } } |
客户端在JNDI命名“interest/Interest”下查找InterestHome接口。如果你提供了一个正确的jboss.xml文件,Bean home接口将会绑定到这个名字。否则,JNDI的名字是“Interest”。为了连接JBoss JNDI,必须建立一个初始化上下文,该上下文是根据在客户端的classpath路径下jndi.properties来的。这个jndi.property文件我们放在了examples\resources\jndi.properties中。代码如下:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces |
指定了InitialContextFactory(初始化上下文工厂),url,和工厂对象的包。在这里url是“localhost”,或运行JBoss的主机名(IP),用的缺省端口是1099。为了不同RMI协议互相兼容,通过“narrow”方法来确保“ref”对象能转换为“InterestHome”对象。客户端不需要必须和EJB类在同一个包中。所以它必须import ejb claess类。
为了能运行Ant命令。我修改了examples\org\jboss\docs\interest\build.xml文件,原文件的部分内容:
<target name="deploy-ejb-jar" depends="ejb-jar"> <copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/deploy" /> </target> <target name="deploy-ear" depends="ear"> <copy file="${build.interest.dir}/interest.ear" todir="${jboss.dist}/deploy" /> </target> |
修改后为:
<target name="deploy-ejb-jar" depends="ejb-jar"> <copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/server/default/deploy" /> </target> <target name="deploy-ear" depends="ear"> <copy file="${build.interest.dir}/interest.ear" todir="${jboss.dist}/server/default/deploy" /> </target> |
修改完后保存。编译和运行InterestClient,通过以下命令:
ant intro-interest-client会出现正确的结果。
5、补充说明
各个jar文件:
1) jboss-j2ee.jar :是标准的javax.ejb.* 包括EJB2.0接口和类。
2) jboss-jaas.jar :是java鉴定和授权服务安全类。
3) jbosssx-client.jar :是JbossSX安全扩展客户端类。
4) jboss-client.jar :是Jboss EJB容器代理和stub客户端类。
5) jnp-client.jar :是JBoss JNDI提供者客户端类。
现在隐藏代码,编译和部署EJB, 运行简单客户端进行测试。
6、 结论
最后来进行一个总结。
Server:
为每个EJB(包括有、无状态的Session,或实体Bean),都需要三个文件: bean实现类, remote接口类,home接口类。这些类和一个或多个部署描述符(ejb-jar.xml, jboss.xml等),这些描述符必须在META-INF目录下,一起打包进jar文件。为部署这个jar文件,你只需要拷贝到jboss\server\default\deploy\下。
Client:
1)从JNDI服务,查找bean的home 接口;
2)从home接口,建立一个新的bean或得到一个已经存在bean;
3)用得到的remote接口来访问服务器上bean实现类中商业方法。
在客户端查找home 接口之前,客户端必须知道如何从JNDI来定位。因此我们提供了一个jndi.properties文件。这个文件和一些jboss\clientx下的jar,必须包含到CLASSPATH中,才能使客户端运行。
相关推荐
《JBoss开发技术文档》是针对企业级应用服务器JBoss的详细指南,旨在帮助开发者深入理解和熟练运用这一开源Java EE应用服务器。本文档分为两大主要部分:JBoss入门和JBoss的配置,涵盖了从安装、启动到高级特性的...
总结来说,这些文档提供了深入理解JBoss技术栈的关键步骤,无论你是新手还是经验丰富的开发者,都能从中受益。通过实践这些教程,你可以熟练掌握JBoss的部署、配置和管理,从而更好地利用其在企业级Java应用中的强大...
### JBoss 中文开发文档知识点总结 #### 一、引言 JBoss 是一款非常流行的开源Java应用服务器,被广泛应用于各种规模的企业级项目中。本文档旨在为开发者提供一个全面且深入的学习资源,帮助他们从零开始学习并掌握...
4. **更多资源**:链接到其他相关文档、论坛和技术支持信息。 5. **管理指南**:深入讲解JBoss AS7的管理接口、概念以及具体管理任务。 #### 二、管理员指南详解 ##### 5.1 目标受众与先决条件 - **目标受众**:...
**JBoss Seam 中文文档集合概述** JBoss Seam 是一个开源的应用框架,它结合了JavaServer Faces (JSF)、Java Persistence API (JPA)、Enterprise JavaBeans (EJB) 3.0 和其他Java EE组件,旨在简化企业级开发。这个...
### JBoss Seam 中文文档知识点概述 #### 一、JBoss Seam 简介 JBoss Seam 是一款基于 Java EE 的应用开发框架,它通过提供一套丰富的组件模型和灵活的应用结构,极大地简化了企业级应用的开发过程。Seam 结合了 ...
此外,Red Hat提供了商业级别的技术支持和服务,包括电话、邮件支持、紧急问题响应等,确保企业级应用的稳定运行。 综上所述,JBoss AS 7不仅是一个功能强大的应用服务器,也是一个高度可配置、易于管理的平台。...
通过以上知识点的详细说明,我们可以了解到JBoss ESB技术文档涵盖了从安装、配置到使用的各个方面,为开发者提供了全面的技术指导和支持。这不仅有助于加快ESB项目的开发进度,还能有效降低因配置错误导致的问题发生...
总结,JBoss AS 4.2.2 GA是一个功能丰富的应用服务器,其英文文档为开发者提供了详尽的技术指导,涵盖了从基础概念到高级特性的所有内容,有助于提升开发者的技能和效率。通过深入学习和实践,开发者能够充分利用...
【JBoss技术文档】 JBoss,作为一款在J2EE应用服务器领域中迅速崛起的开源解决方案,因其商业友好的LGPL授权和社区驱动的开发模式,深受开发者喜爱。该技术的核心特性包括基于JMX微内核的服务总线,面向服务的架构...
【JBoss Seam 2.0文档详解】 JBoss Seam 是一个开源的企业级开发框架,它旨在简化Java EE应用的开发过程,特别是在Web和富互联网应用程序(Rich Internet Applications, RIA)领域。Seam 2.0是其重要的版本,提供了...
本指南主要面向希望深入掌握JBoss AS7.0管理技能的技术人员,包括系统管理员、开发人员及技术支持工程师等。 **1.2 预备知识** 在阅读本指南之前,读者应具备以下基础: - 对Java SE/EE有基本了解。 - 具有一定的...
JBoss则是一个开源的应用服务器,支持Java EE规范,用于运行和管理企业级Java应用程序。 首先,让我们详细探讨Apache的安装与配置。Apache 2.0的编译安装通常包括以下几个步骤: 1. **下载相关软件包**:你需要...
JBoss Seam 2.0 是一个全面的企业级Java开发框架,旨在简化Java EE(现在称为Java EE)应用程序的构建过程,尤其是在集成各种技术和处理业务逻辑方面。Seam 提供了一个统一的模型,允许开发者用一种更直观的方式来...
**JBoss 4.2.2 GA 中文文档详解** ...通过深入理解这些核心概念和技术,开发者能够充分利用JBoss的潜力,构建出高效、稳定的应用系统。文档中的"JBOSS使用指南.doc"将提供更详尽的指导,帮助读者在实践中掌握这些知识。
1. **JBossTools 3.1**:用于Eclipse的插件,增强Eclipse的功能,提供对JBoss ESB的支持。 2. **Eclipse 3.5.2 (Galileo SR2)**:主流的Java集成开发环境(IDE),用于编写Java代码。 3. **jbossesb-server-4.9.zip**...