用JBoss部署一个EJB,并构建一个客户端应用程序来运用它。
by Budi Kurniawan 
很多人在开始学习Enterprise JavaBeans(EJB)时,在编译第一个enterprise bean以及在所选择的J2EE服务器上部署它时常常会遇到问题。首先,与其它J2EE 技术相比较,EJB的学习曲线是很陡的。第二,在编写一个enterprise bean时, 你必须处理许多文件。许多有关EJB的书籍的作者在他们的书的前几章都狂热地谈论这种技术,但是很少有人教你如何让你的第一个EJB运行。作为技术引导性文章,本文主要是讲述如何开发一个简单的EJB并用JBoss部署它,而不是探讨EJB的规范和技术。用其它J2EE服务器进行部署的过程是同样的,只是有些微小的变化。EJB是J2EE中的主要技术之一。你可能已经读到很多有关这个令人兴奋的技术的文章了, 现在可能正准备采取下个步骤:开发一个真正的EJB并在一个EJB容器中运行它。通过本文,你将学习到如何开发一个EJB、部署它、并构建一个客户端应用程序来运用它。本文运用的这个EJB很简单:叫做StringProcessor,它唯一的功能就是将一个字符串转换成大写。即,输入“ejb”,StringProcessor就会将它转换成“EJB”。本文的重点是讲述整个开发过程,所以我打算尽量地使代码简单。你可以通过这个小程序来证明我们要讲的概念。要开发和部署一个EJB应用程序,必须经历四个步骤:  1. 为你的bean编写类。 
 2. 编写部署描述符。 
 3. 创建一个部署文件。 
 4. 部署bean。 另外,我还将讲述如何构建一个客户端应用程序,因此你可以看到你的bean是如何运行的。 我将一步步地讲述。让我们以本文的例子为例, 首先建一个名为workplace的目录,作为你的工作区(workspace)。 你可以将你的bean classes放在com.javapro.ejb包中,所以你需要为源文件和Java类建几个目录(见图1)。在做完这些后,目录将会包含10个文件(见图2)。现在将注意力转移到构建你的EJB所需的步骤上。

解决方案 »

  1.   

    编写类
    正如你所知道的,一个enterprise bean最少由三个类构成(见列表1、2和3)。你应该在workplace/com/javapro/ejb目录中保存这些文件。编译源文件时,应该执行下面这些步骤。(假设你已经将javac.exe包含在你的“path”环境变量中了。注意这里的路径是针对Windows的。如果你在Linux/Unix中,应该对它做相应的修改。这不会是个大问题。)列表1. StringProcessor.java 文件 package com.javapro.ejb;
    import javax.ejb.EJBObject;
    import java.rmi.RemoteException;
    public interface StringProcessor extends EJBObject {
      public String toUpperCase(String s) throws RemoteException;
    }列表2. StringProcessorHome.java 文件 package com.javapro.ejb;
    import java.rmi.RemoteException;
    import javax.ejb.CreateException;
    import javax.ejb.EJBHome;
    public interface StringProcessorHome extends EJBHome {
      StringProcessor create() throws RemoteException, CreateException;
    }列表3. StringProcessorBean.java 文件package com.javapro.ejb;
    import java.rmi.RemoteException;
    import javax.ejb.SessionBean;
    import javax.ejb.SessionContext;
    public class StringProcessorBean implements SessionBean {
      public String toUpperCase(String s) {
        System.out.println("from StringProcessorBean");
        if (s==null)
          return null;
        else 
          return s.toUpperCase();
      }
      public void ejbCreate() {}
      public void ejbRemove() {}
      public void ejbActivate() {}
      public void ejbPassivate() {}
      public void setSessionContext(SessionContext sc) {}
    }
      

  2.   

    编写部署描述符
    一个EJB应用程序的部署描述符采用的名字是ejb-jar.xml(见列表4)。即,它是个XML文件。你必须将这个文件保存到workplace/META-INF目录中。
    列表4. ejb-jar.xml 文件<?xml version="1.0" encoding="UTF-8"?>
    <ejb-jar>
      <description>Your first EJB application </description>
      <display-name>String Processor Application</display-name>
      <enterprise-beans>
        <session>
          <ejb-name>StringProcessor</ejb-name>
          <home>com.javapro.ejb.StringProcessorHome</home>
          <remote>com.javapro.ejb.StringProcessor</remote>
          <ejb-class>com.javapro.ejb.StringProcessorBean</ejb-class>
          <session-type>Stateless</session-type>
          <transaction-type>Bean</transaction-type>
        </session>
      </enterprise-beans>
    </ejb-jar>部署你的Bean
    编写客户端应用程序 编译并运行
    列表5. Client.java import javax.naming.*;
    import javax.rmi.PortableRemoteObject;
    import java.util.Properties;
    import com.javapro.ejb.StringProcessor;
    import com.javapro.ejb.StringProcessorHome;public class Client {  public static void main(String[] args) {    // first argument must be the input
        if (args.length==0) {
          System.out.println("Please specify the input to convert to upper case.");
          return;
        }
        String input = args[0];    // preparing properties for constructing an InitialContext object
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        properties.put(Context.PROVIDER_URL, "localhost:1099");    try {
          // Get an initial context
          InitialContext jndiContext = new InitialContext(properties);
          System.out.println("Got context");      // Get a reference to the Bean
          Object ref  = jndiContext.lookup("StringProcessor");
          System.out.println("Got reference");      // Get a reference from this to the Bean's Home interface
          StringProcessorHome home = (StringProcessorHome)
            PortableRemoteObject.narrow (ref, StringProcessorHome.class);      // Create an Adder object from the Home interface
          StringProcessor sp = home.create();
          System.out.println ("Uppercase of '" + input + "' is " + 
            sp.toUpperCase(input));
        }
        catch(Exception e) {
          System.out.println(e.toString());
        }
      }
    }
      

  3.   

    client中,如下:
    import javax.naming.*;
    import javax.rmi.PortableRemoteObject;
    import java.util.*;
    public class HSAreaInfoClient {
      private s_HSAreaInfoHome s_HSAreaInfoHomeObject = null;  //Construct the EJB test client
      public HSAreaInfoClient() {
        try {
          //get naming context
          Context ctx = getJBossInitialContext();      //look up jndi name
          Object ref = ctx.lookup("s_HSAreaInfo");      //cast to Home interface
          s_HSAreaInfoHomeObject = (s_HSAreaInfoHome) PortableRemoteObject.narrow(ref, s_HSAreaInfoHome.class);
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
      public boolean createClient(){
        try{
        Context ctx = getJBossInitialContext();
        Object ref = ctx.lookup("s_HSAreaInfo");
        s_HSAreaInfoHomeObject = (s_HSAreaInfoHome) PortableRemoteObject.narrow(ref, s_HSAreaInfoHome.class);
        return true;
        }catch(Exception ex){
           return false;
        }
      }
      private javax.naming.Context getJBossInitialContext() throws NamingException {
        java.util.Hashtable JNDIParm = new java.util.Hashtable();
        JNDIParm.put(Context.PROVIDER_URL, "localhost:1099");
        JNDIParm.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        return new InitialContext(JNDIParm);
      }
      //----------------------------------------------------------------------------
      // Utility Methods
      //----------------------------------------------------------------------------  public s_HSAreaInfoHome getHome() {
        return s_HSAreaInfoHomeObject;
      }
      public java.util.Collection getUserName(){
        try{
          s_HSAreaInfo areainfo = getAreaInfoInstance();
          Collection c = areainfo.getUserName();
          if(c.size()>0){
            return c;
          }else{
            return null;
          }
        }catch(Exception ex){
          ex.printStackTrace();
          //System.err.println("error:"+ex.toString());
          return null;
        }
      }
      private s_HSAreaInfo getAreaInfoInstance(){
      try{
        s_HSAreaInfo areainfo = (s_HSAreaInfo)PortableRemoteObject.narrow(
            s_HSAreaInfoHomeObject.create(),s_HSAreaInfo.class);
        return areainfo;
      }catch(Exception ex){
        System.err.println(ex.toString());
        return null;
      }
      }
    }在页面中调用如下:
    ......
    <jsp:useBean id="callClient" scope="page" class="com.hisense.search.HSAreaInfoClient" />
    ......
    if(callClient.createClient()){
          Collection c = callClient.getUserName();
      

  4.   

    晕,给错分了。
    对不起了,mayafree。
      

  5.   

    我来给他分数把,100是吧
    我给你200分吧,呵呵
    http://expert.csdn.net/Expert/topic/2488/2488023.xml?temp=.4195215