4 发布EJB程序
我们来编写一段最简单的“Hello World”无状态会话Bean,我们创建的无状态会话Bean运行在分布式对象架构里,执行着重要的任务:向客户端返回一字符串——“Hello,World!”
4.1 创建Remote接口
我们以编写Remote接口开始,Remote接口复制了Bean“暴露”的每一个商务方法,由EJB容器实现Remote接口,实现的结果就是EJB对象。EJB对象将所有的客户端请求委托给实际的Bean。源代码如下:
Hello.java
package hello.ejb; /** * Remote interface for Enterprise Bean: Hello */ public interface Hello extends javax.ejb.EJBObject { /** * 唯一的方法hello,向客户端返回问候。 */ public String hello() throws java.rmi.RemoteException; } |
4.2 实现“Hello,world!”的Bean
接下来,创建Bean本身。我们将实现一个商务方法——hello()方法,我们还增加了所需的EJB容器回调方法。程序源代码如下“:
HelloBean.java
package hello.ejb; /** * Bean implementation class for Enterprise Bean: Hello */ public class HelloBean implements javax.ejb.SessionBean { private javax.ejb.SessionContext mySessionCtx; /** * getSessionContext */ public javax.ejb.SessionContext getSessionContext() { return mySessionCtx; } /** * setSessionContext */ public void setSessionContext(javax.ejb.SessionContext ctx) { mySessionCtx = ctx; } /** * ejbActivate */ public void ejbActivate() { } /** * ejbCreate */ public void ejbCreate() throws javax.ejb.CreateException { } /** * ejbPassivate */ public void ejbPassivate() { } /** * ejbRemove */ public void ejbRemove() { } // // 商务方法 // public String hello() { return "Hello,World!"; }
} |
4.3 创建“Hello,World!”Home接口
这里编写的Home接口详细说明了生成和清除EJB对象方法。程序源代码如下:
HelloHome.java
package hello.ejb; /** * Home interface for Enterprise Bean: Hello */ public interface HelloHome extends javax.ejb.EJBHome { /** * Creates a default instance of Session Bean: Hello */ public Hello create() throws javax.ejb.CreateException, java.rmi.RemoteException; } |
4.4 EJB部署描述
ejb-jar.xml
|
下面icech来简单介绍一下XML部署描述的内容。
|
4.5 客户端代码
客户端代码执行以下几个任务:
· 查找Home对象;
· 使用Home对象生成EJB对象;
· 对EJB对象调用hello()方法;
· 从内存中清除EJB对象。
HelloClient.java
package hello.ejb; import java.util.*; import java.io.*; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; public class HelloClient { public static void main(String[] args) { try { //jndi配置,硬编码到java中,应实现为外部属性文件 Properties p=new Properties(); p.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); p.setProperty("java.naming.provider.url", "localhost:1099");
//out print jndi配置 p.list(System.out);
// Get a naming context InitialContext jndiContext = new InitialContext(p); System.out.println("Got context");
// Get a reference to the Interest Bean //jboss默认jndi名为ejb-jar.xml中的:ejb-name Object ref = jndiContext.lookup("Hello"); System.out.println("Got reference");
// Get a reference from this to the Bean"s Home interface HelloHome home = (HelloHome) PortableRemoteObject.narrow(ref, HelloHome.class);
// Create an Hello object from the Home interface Hello hello = home.create();
// call the hello() method System.out.println(hello.hello()); } catch(Exception e) { System.out.println(e.toString()); } } } |