• 相关软件
    >weblogic——远程/近程调用EJB的方法总结 创建者:webmaster 更新时间:2005-05-16 22:08

    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);
      //通过ejb的JNDI 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_PRINCIPAL和Context.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());
      }
    }
    }



    4、EJB中调用其他的EJB(不同的EJB模块)
    前提:被调用者实现了REMOTE接口
    最简单的方法是按客户端程序(或者SERVLET)中调用EJB的方法。
    相关文章
    本页查看次数: