weblogic——远程/近程调用EJB的方法总结

1、      客户端程序中调用EJB
前提:EJB要实现了REMOTE接口
客户端调用的代码可以用EJB Test Client工具生成。自己写就是这个样子:


      String url="t3://localhost:7001";
     Properties prop=new Properties();
     prop.put(Context.PROVIDER_URL,url);
            prop.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
            prop.put(Context.SECURITY_PRINCIPAL, "
name");
         prop.put(Context.SECURITY_CREDENTIALS,"
code");
     Context
context =new InitialContext(prop);
  
//通过ejbJNDI name查找到EJBHome对象
  Object ref = context.lookup("
ejb/com/J2EE/first/ejb/HelloHome ");   
   //
得到EJBHome
 
HelloHome trH=(HelloHome) PortableRemoteObject.narrow(obj,HelloHome.class);
   //
得到EJBObject
    DigestSession digestSession = digestSessionHome.create();

     Hello tr=trH.create();
     System.out.println(tr.hello());

    byte[] ret = digestSession.md5(temp.getBytes());//ejb
方法调用

  注意:Context.SECURITY_PRINCIPALContext.SECURITY_CREDENTIALS是可选的,涉及到对ejb的操作的权限。

2、SERVLET中调用EJB
前提:被调用的EJB实现了REMOTE接口
Servlet中,调用的代码应该是这个样子:


    try {
      Context context = new InitialContext();
      Object ref = context.lookup("UserFacade");
      //look up jndi name and cast to Home interface
      UserFacadeHome userFacadeHome = (UserFacadeHome) PortableRemoteObject.
          narrow(ref, UserFacadeHome.class);
      UserFacade userFacade = userFacadeHome.create();
      userFacade.updateUser("002","
老二");    }
    catch (Exception ex) {
      ex.printStackTrace();
    }


跟客户端程序中调用EJB的差别是在Context的生成上,servlet中直接用
Context context = new InitialContext();
而客户端程序中是用
    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
    properties.put(Context.PROVIDER_URL, "t3://localhost:7001");

    Context context= new InitialContext(properties);

3、      EJB中调用其他的EJB(同一EJB模块)
前提:
(1)
被调用者实现了LOCAL接口,调用者则实现了REMOTE接口
(2)
调用者和被调用者应该在同一EJB模块打包文件(jar)
(3)
调用者的部署描述(ejb-jar.xml)中有关于Local ref的描述,如下所示:


   
      UserFacade
      UserFacade
      ejbtest.test.UserFacadeHome
      ejbtest.test.UserFacade
      ejbtest.test.UserFacadeBean
      Stateless
      Container
     
        ejb/user
        Entity
        ejbtest.test.UserHome
        ejbtest.test.User
        User
     

   

在调用者中,调用的程序代码应该是下面的样子:

package ejbtest.test;import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;

import javax.ejb.*;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.rmi.RemoteException;

public class UserFacadeBean
    implements SessionBean {
  SessionContext sessionContext;
  private UserHome userHome;
  private static Context context;

  public void ejbCreate() throws CreateException {
  }

  public void ejbRemove() {
  }

  public void ejbActivate() {
  }

  public void ejbPassivate() {
  }

  public void setSessionContext(SessionContext sessionContext) {
    System.out.println("@@@@@@@@@@@@@@@@ UserFacadeBean.setSessionContext()");
    this.sessionContext = sessionContext;
    try {
      findUserHome();
    }
    catch (Exception e) {
      throw new EJBException(e.getMessage());
    }
  }

  private void findUserHome() throws Exception {
    final String ENTITY_NAME = "java:comp/env/ejb/user";

    context = new InitialContext();

    if (userHome == null) {
      try {
        Object object = context.lookup(ENTITY_NAME);
        userHome = (UserHome) object;
      }
      catch (Exception e) {
        throw new EJBException(e.getMessage());
      }
    }
  }

  public void addUser(String id, String name) throws RemoteException {
    try {
      User user = userHome.create(id);
      user.setName(name);
    }
    catch (Exception ex) {
      throw new RemoteException(ex.getMessage());
    }
  }
}

4EJB中调用其他的EJB(不同的EJB模块)
前提:被调用者实现了REMOTE接口
最简单的方法是按客户端程序(或者SERVLET)中调用EJB的方法。

 

你可能感兴趣的:(Jdk5.0/6.0)