存在就是合理的

会思考的僵尸

Eclipse+MyEclipse+weblogic8开发EJB初探

一、无状态会话BEAN
搞了几年JAVA了,最近由于完全不懂EJB技术,被取笑了!我怒而学之.
以下为自己保留的代码,大部分抄袭网上的,只为自己保留,望看客一笑而过!
关键字一:DOMAIN域
为WEBLOGIC管理应用的机制.用WEBLOGIC自带的Configuration Wizard工具生成,根据功能不同能创建不同的工作域.
关键字二:部署
Eclipse+MyEclipse提供了比较强大的部署功能,这里忽略先.
具体代码如下:
package com.ejb;

import java.rmi.RemoteException;

import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

/**
 * XDoclet-based session bean.  The class must be declared
 * public according to the EJB specification.
 *
 * To generate the EJB related files to this EJB:
 *  - Add Standard EJB module to XDoclet project properties
 *  - Customize XDoclet configuration for your appserver
 *  - Run XDoclet
 *
 * Below are the xdoclet-related tags needed for this EJB.
 *
 * @ejb.bean name="HelloWorld"
 *           display-name="Name for HelloWorld"
 *           description="Description for HelloWorld"
 *           jndi-name="ejb/HelloWorld"
 *           type="Stateless"
 *           view-type="remote"
 */
public class HelloWorld implements SessionBean {

 /** The session context */
 private SessionContext context;
 private String message = "helloworld!";
 public HelloWorld() {
  // TODO Auto-generated constructor stub
 }

 public void ejbActivate() throws EJBException, RemoteException {
  // TODO Auto-generated method stub

 }

 public void ejbPassivate() throws EJBException, RemoteException {
  // TODO Auto-generated method stub

 }

 public void ejbRemove() throws EJBException, RemoteException {
  // TODO Auto-generated method stub

 }

 /**
  * Set the associated session context. The container calls this method
  * after the instance creation.
  *
  * The enterprise bean instance should store the reference to the context
  * object in an instance variable.
  *
  * This method is called with no transaction context.
  *
  * @throws EJBException Thrown if method fails due to system-level error.
  */
 public void setSessionContext(SessionContext newContext)
  throws EJBException {
  context = newContext;
 }

/**
* 自己新创建的业务方法
**/
 public String getMessage()throws EJBException
 {
  return this.message;
  //return new String("helloworld!");
 }
///////////////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////////////
/*
 * Generated by XDoclet - Do not edit!
 */
package com.ejb;

/**
 * Session layer for HelloWorld.
 * @xdoclet-generated at ${TODAY}
 * @copyright The XDoclet Team
 * @author XDoclet
 * @version ${version}
 */
public class HelloWorldSession
   extends com.ejb.HelloWorld
   implements javax.ejb.SessionBean
{
   public void ejbActivate() throws javax.ejb.EJBException, java.rmi.RemoteException
   {

      super.ejbActivate();
   }

   public void ejbPassivate() throws javax.ejb.EJBException, java.rmi.RemoteException
   {
      super.ejbPassivate();
   }

   public void setSessionContext(javax.ejb.SessionContext ctx) throws javax.ejb.EJBException
   {
      super.setSessionContext(ctx);
   }

   public void unsetSessionContext()
   {
   }

   public void ejbRemove() throws javax.ejb.EJBException, java.rmi.RemoteException
   {
      super.ejbRemove();
   }

   public void ejbCreate() throws javax.ejb.CreateException
   {
   }
}
//////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////

/*
 * Generated by XDoclet - Do not edit!
 */
package com.interfaces;

import javax.ejb.EJBException;
import java.rmi.*;

/**
 * Remote interface for HelloWorld.
 * @xdoclet-generated at ${TODAY}
 * @copyright The XDoclet Team
 * @author XDoclet
 * @version ${version}
 */
public interface HelloWorld
   extends javax.ejb.EJBObject
{
   /**
    * An example business method
    * @throws EJBException Thrown if method fails due to system-level error.    */
   /*public void replaceWithRealBusinessMethod(  )
      throws java.rmi.RemoteException;*/
   public String getMessage()throws EJBException,RemoteException;
}
//////////////////////////////////////////////////////////////////////////////分割线/////////////////////////////////////////////////////////////////////////////
/*
 * Generated by XDoclet - Do not edit!
 */
package com.interfaces;

/**
 * Home interface for HelloWorld.
 * @xdoclet-generated at ${TODAY}
 * @copyright The XDoclet Team
 * @author XDoclet
 * @version ${version}
 */
public interface HelloWorldHome
   extends javax.ejb.EJBHome
{
   public static final String COMP_NAME="java:comp/env/ejb/HelloWorld";
   public static final String JNDI_NAME="ejb/HelloWorld";

   public com.interfaces.HelloWorld create()
      throws javax.ejb.CreateException,java.rmi.RemoteException;

}
/////////////////////////////////////////////////////////////////////////////分割线/////////////////////////////////////////////////////////////////////////////
/*
 * Generated file - Do not edit!
 */
package com.interfaces;

/**
 * Utility class for HelloWorld.
 * @xdoclet-generated at ${TODAY}
 * @copyright The XDoclet Team
 * @author XDoclet
 * @version ${version}
 */
public class HelloWorldUtil
{
   /** Cached remote home (EJBHome). Uses lazy loading to obtain its value (loaded by getHome() methods). */
   private static com.interfaces.HelloWorldHome cachedRemoteHome = null;

   private static Object lookupHome(java.util.Hashtable environment, String jndiName, Class narrowTo) throws javax.naming.NamingException {
      // Obtain initial context
      javax.naming.InitialContext initialContext = new javax.naming.InitialContext(environment);
      try {
         Object objRef = initialContext.lookup(jndiName);
         // only narrow if necessary
         if (java.rmi.Remote.class.isAssignableFrom(narrowTo))
            return javax.rmi.PortableRemoteObject.narrow(objRef, narrowTo);
         else
            return objRef;
      } finally {
         initialContext.close();
      }
   }

   // Home interface lookup methods

   /**
    * Obtain remote home interface from default initial context
    * @return Home interface for HelloWorld. Lookup using COMP_NAME
    */
   public static com.interfaces.HelloWorldHome getHome() throws javax.naming.NamingException
   {
      if (cachedRemoteHome == null) {
            cachedRemoteHome = (com.interfaces.HelloWorldHome) lookupHome(null, com.interfaces.HelloWorldHome.COMP_NAME, com.interfaces.HelloWorldHome.class);
      }
      return cachedRemoteHome;
   }

   /**
    * Obtain remote home interface from parameterised initial context
    * @param environment Parameters to use for creating initial context
    * @return Home interface for HelloWorld. Lookup using COMP_NAME
    */
   public static com.interfaces.HelloWorldHome getHome( java.util.Hashtable environment ) throws javax.naming.NamingException
   {
       return (com.interfaces.HelloWorldHome) lookupHome(environment, com.interfaces.HelloWorldHome.COMP_NAME, com.interfaces.HelloWorldHome.class);
   }

   /** Cached per JVM server IP. */
   private static String hexServerIP = null;

   // initialise the secure random instance
   private static final java.security.SecureRandom seeder = new java.security.SecureRandom();

   /**
    * A 32 byte GUID generator (Globally Unique ID). These artificial keys SHOULD <strong>NOT </strong> be seen by the user,
    * not even touched by the DBA but with very rare exceptions, just manipulated by the database and the programs.
    *
    * Usage: Add an id field (type java.lang.String) to your EJB, and add setId(XXXUtil.generateGUID(this)); to the ejbCreate method.
    */
   public static final String generateGUID(Object o) {
       StringBuffer tmpBuffer = new StringBuffer(16);
       if (hexServerIP == null) {
           java.net.InetAddress localInetAddress = null;
           try {
               // get the inet address

               localInetAddress = java.net.InetAddress.getLocalHost();
           }
           catch (java.net.UnknownHostException uhe) {
               System.err.println("HelloWorldUtil: Could not get the local IP address using InetAddress.getLocalHost()!");
               // todo: find better way to get around this...
               uhe.printStackTrace();
               return null;
           }
           byte serverIP[] = localInetAddress.getAddress();
           hexServerIP = hexFormat(getInt(serverIP), 8);
       }

       String hashcode = hexFormat(System.identityHashCode(o), 8);
       tmpBuffer.append(hexServerIP);
       tmpBuffer.append(hashcode);

       long timeNow      = System.currentTimeMillis();
       int timeLow       = (int)timeNow & 0xFFFFFFFF;
       int node          = seeder.nextInt();

       StringBuffer guid = new StringBuffer(32);
       guid.append(hexFormat(timeLow, 8));
       guid.append(tmpBuffer.toString());
       guid.append(hexFormat(node, 8));
       return guid.toString();
   }

   private static int getInt(byte bytes[]) {
       int i = 0;
       int j = 24;
       for (int k = 0; j >= 0; k++) {
           int l = bytes[k] & 0xff;
           i += l << j;
           j -= 8;
       }
       return i;
   }

   private static String hexFormat(int i, int j) {
       String s = Integer.toHexString(i);
       return padHex(s, j) + s;
   }

   private static String padHex(String s, int i) {
       StringBuffer tmpBuffer = new StringBuffer();
       if (s.length() < i) {
           for (int j = 0; j < i - s.length(); j++) {
               tmpBuffer.append('0');
           }
       }
       return tmpBuffer.toString();
   }
}
////////////////////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////
配置文件如下:
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar >

   <description><![CDATA[No Description.]]></description>
   <display-name>Generated by XDoclet</display-name>

   <enterprise-beans>

      <!-- Session Beans -->
      <session >
         <description><![CDATA[Description for HelloWorld]]></description>
         <display-name>Name for HelloWorld</display-name>

         <ejb-name>HelloWorld</ejb-name>

         <home>com.interfaces.HelloWorldHome</home>
         <remote>com.interfaces.HelloWorld</remote>
         <ejb-class>com.ejb.HelloWorldSession</ejb-class>
         <session-type>Stateless</session-type>
         <transaction-type>Container</transaction-type>

      </session>

     <!--
       To add session beans that you have deployment descriptor info for, add
       a file to your XDoclet merge directory called session-beans.xml that contains
       the <session></session> markup for those beans.
     -->

      <!-- Entity Beans -->
     <!--
       To add entity beans that you have deployment descriptor info for, add
       a file to your XDoclet merge directory called entity-beans.xml that contains
       the <entity></entity> markup for those beans.
     -->

      <!-- Message Driven Beans -->
     <!--
       To add message driven beans that you have deployment descriptor info for, add
       a file to your XDoclet merge directory called message-driven-beans.xml that contains
       the <message-driven></message-driven> markup for those beans.
     -->

   </enterprise-beans>

   <!-- Relationships -->

   <!-- Assembly Descriptor -->
     <!--
       To specify your own assembly descriptor info here, add a file to your
       XDoclet merge directory called assembly-descriptor.xml that contains
       the <assembly-descriptor></assembly-descriptor> markup.
     -->

   <assembly-descriptor >
     <!--
       To specify additional security-role elements, add a file in the merge
       directory called ejb-security-roles.xml that contains them.
     -->

   <!-- method permissions -->
     <!--
       To specify additional method-permission elements, add a file in the merge
       directory called ejb-method-permissions.ent that contains them.
     -->

   <!-- transactions -->
     <!--
       To specify additional container-transaction elements, add a file in the merge
       directory called ejb-container-transactions.ent that contains them.
     -->

   <!-- finder transactions -->

   <!-- message destinations -->
     <!--
       To specify additional message-destination elements, add a file in the merge
       directory called ejb-message-destinations.ent that contains them.
     -->

   <!-- exclude list -->
     <!--
       To specify an exclude-list element, add a file in the merge directory
       called ejb-exclude-list.xml that contains it.
     -->
   </assembly-descriptor>
</ejb-jar>
//////////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////////////
weblogic-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN" "http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd">

<weblogic-ejb-jar>
 <description><![CDATA[Generated by XDoclet]]></description>
   <weblogic-enterprise-bean>
      <ejb-name>HelloWorld</ejb-name>
      <stateless-session-descriptor>
      </stateless-session-descriptor>
      <reference-descriptor>
      </reference-descriptor>

      <jndi-name>ejb/HelloWorld</jndi-name>
   </weblogic-enterprise-bean>
<!--
To add enterprise beans that you have deployment descriptor info for, add
a file to your XDoclet merge directory called weblogic-enterprise-beans.xml that contains
the <weblogic-enterprise-bean></weblogic-enterprise-bean> markup for those beans.
-->

 <!--
 To add a security-role-assignment section, add
 a file to your XDoclet merge directory called weblogic-security-role-assignment.xml that contains
 the <security-role-assignment></security-role-assignment> markup.
 --> 

 <!--
 To add a run-as-role-assignment section, add
 a file to your XDoclet merge directory called weblogic-run-as-role-assignment.xml that contains
 the <run-as-role-assignment></run-as-role-assignment> markup.
 -->
</weblogic-ejb-jar>
////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////////////////////
打成JIA包部署到WEBLOGIC服务器。
最后是调用代码:
package com;

import java.rmi.RemoteException;
import java.util.Properties;
 
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
import com.interfaces.HelloWorld;
import com.interfaces.HelloWorldHome;
import javax.rmi.PortableRemoteObject;

public class EJBTest {

     /**
      * @param args
     */
     public static void main(String[] args) throws Exception {
         // TODO 自动生成方法存根
         Properties properties=new Properties();
         properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
         properties.setProperty(Context.PROVIDER_URL,"t3://localhost:7001");
        
         Context context;
         try {
             context = new InitialContext(properties);
             HelloWorldHome hwh=(HelloWorldHome)context.lookup("ejb/HelloWorld");
             HelloWorld hw=hwh.create();
             String s=hw.getMessage();
             System.out.println(s);
         } catch (NamingException e) {
             // TODO 自动生成 catch 块
             e.printStackTrace();
         } catch (RemoteException e) {
             // TODO 自动生成 catch 块
             e.printStackTrace();
         } catch (CreateException e) {
             // TODO 自动生成 catch 块
             e.printStackTrace();
         }
      /*Properties properties=new Properties();
         properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
         properties.setProperty(Context.PROVIDER_URL,"t3://localhost:7001");
      Context context = new InitialContext(properties);
      Object obj = context.lookup("ejb/HelloWorld");
      HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(obj,HelloWorldHome.class );
      HelloWorld hello = home.create();
      System.out.println(hello.getMessage());*/
     } 
 }

部署EJB

1.         MyEclipse >Add and Remove Project Deployments

2.         点击 add ,添加部署服务器 weblogic

虽然能使用了,但还是有很多地方不太明白。慢慢进步咯!

posted on 2006-08-09 11:18 KanIT 阅读(1481) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: