#副標=Start with J2EE #大標=J2EE的商業層(上):EJB的機制、分類與元素 #作者=文/陳俊吉 ================================================ public interface EJBHome extends Remote { public abstract EJBMetaData getEJBMetaData() throws RemoteException; public abstract HomeHandle getHomeHandle() throws RemoteException; public abstract void remove(Object obj) throws RemoteException, RemoveException; public abstract void remove(Handle handle) throws RemoteException, RemoveException; } ============================================= ===================================== public interface EJBObject extends Remote { public abstract EJBHome getEJBHome() throws RemoteException; public abstract Handle getHandle() throws RemoteException; public abstract Object getPrimaryKey() throws RemoteException; public abstract boolean isIdentical(EJBObject ejbobject) throws RemoteException; public abstract void remove() throws RemoteException, RemoveException; } ============================================= ============================================= public interface SessionBean extends EnterpriseBean { public abstract void ejbActivate() throws EJBException, RemoteException; public abstract void ejbPassivate() throws EJBException, RemoteException; public abstract void ejbRemove() throws EJBException, RemoteException; public abstract void setSessionContext(SessionContext sessioncontext) throws EJBException, RemoteException; } ============================================= ============================================= public interface EntityBean extends EnterpriseBean { public abstract void ejbActivate() throws EJBException, RemoteException; public abstract void ejbLoad() throws EJBException, RemoteException; public abstract void ejbPassivate() throws EJBException, RemoteException; public abstract void ejbRemove() throws RemoveException, EJBException, RemoteException; public abstract void ejbStore() throws EJBException, RemoteException; public abstract void setEntityContext(EntityContext entitycontext) throws EJBException, RemoteException; public abstract void unsetEntityContext() throws EJBException, RemoteException; } ============================================= ============================================= public interface MessageDrivenBean extends EnterpriseBean { public abstract void ejbRemove() throws EJBException; public abstract void setMessageDrivenContext(MessageDrivenContext messagedrivencontext) throws EJBException; } ============================================= # ============================================= import javax.ejb.CreateException; import javax.ejb.EJBHome; import java.rmi.RemoteException; public interface HelloSessionHome extends EJBHome { public HelloSession create() throws CreateException, RemoteException; } =============================================    ============================================= import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface HelloSession extends EJBObject { public String sayHello(String name) throws RemoteException; } =============================================    ============================================= import javax.ejb.CreateException; import javax.ejb.EJBException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class HelloSessionBean implements SessionBean { public HelloSessionBean() { } public void ejbActivate() throws EJBException { } public void ejbPassivate() throws EJBException { } public void ejbRemove() throws RemoveException, EJBException { } public void setSessionContext(SessionContext sessionContext) throws EJBException { } public void setSessionContext(SessionContext sessionContext) throws EJBException { } public void ejbCreate() throws CreateException { } public String sayHello(String name) { return "Hello, " + name; } } ============================================= ============================================= HelloSessionEJB HelloSessionHome HelloSession HelloSessionBean Stateless Container =============================================   ======================================= import javax.ejb.CreateException; import javax.ejb.RemoveException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import java.rmi.RemoteException; import java.util.Properties; public class HelloSessionClient { public static void main(String[] args) throws NamingException, CreateException, RemoteException, RemoveException { Properties props = new Properties(); props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); props.put(InitialContext.PROVIDER_URL, "jnp://localhost:1099"); Context ctx = new InitialContext(props); Object ref = ctx.lookup("HelloSessionEJB"); HelloSessionHome home = (HelloSessionHome) PortableRemoteObject.narrow(ref, HelloSessionHome.class); //Step 1 HelloSession remote = home.create(); //Step 2 System.out.println(remote.sayHello("EJB")); //Step 3 remote.remove(); //Step 4 } } ======================================   ====================================== import javax.ejb.CreateException; import javax.ejb.EJBHome; import javax.ejb.FinderException; import java.rmi.RemoteException; public interface HelloEntityHome extends EJBHome { public HelloEntity findByPrimaryKey(Integer id) throws RemoteException, FinderException; public HelloEntity create(Integer id) throws CreateException, RemoteException; } ======================================    ====================================== import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface HelloEntity extends EJBObject { public Integer getId() throws RemoteException; public void setId(Integer id) throws RemoteException; public String getName() throws RemoteException; public void setName(String name) throws RemoteException; } ======================================    ====================================== import javax.ejb.CreateException; import javax.ejb.EntityBean; import javax.ejb.EntityContext; public abstract class HelloEntityBean implements EntityBean { public HelloEntityBean() { } public void ejbActivate() throws EJBException { } public void ejbLoad() throws EJBException { } public void ejbPassivate() throws EJBException { } public void ejbRemove() throws RemoveException, EJBException { } public void ejbStore() throws EJBException { } public void setEntityContext(EntityContext entityContext) throws EJBException { } public void unsetEntityContext() throws EJBException { } public abstract Integer getId(); public abstract void setId(Integer id); public abstract String getName(); public abstract void setName(String name); public Integer ejbCreate(Integer id) throws CreateException { this.setId(id); return null; } public void ejbPostCreate(Integer key) throws CreateException { } } ======================================   ====================================== ……前略 HelloEntityEJB HelloEntityHome HelloEntity HelloEntityBean Container java.lang.Integer False 2.x       HelloEntityEJB id name id ======================================   ====================================== public class HelloEntityClient { public static void main(String[] args) throws NamingException, CreateException, RemoteException, FinderException { Properties props = new Properties(); props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); props.put(InitialContext.PROVIDER_URL, "jnp://localhost:1099"); Context ctx = new InitialContext(props); Object ref = ctx.lookup("HelloEntityEJB"); HelloEntityHome home = (HelloEntityHome) PortableRemoteObject.narrow(ref, HelloEntityHome.class); HelloEntity remote = home.create(new Integer(1)); System.out.println(remote.getId()); home.create(new Integer(2)); remote = home.findByPrimaryKey(new Integer("2")); System.out.println(remote.getId()); home.remove(new Integer(1)); home.remove(new Integer(2)); } } ======================================    ====================================== import javax.ejb.EJBException; import javax.ejb.MessageDrivenBean; import javax.ejb.MessageDrivenContext; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; public class HelloMDBBean implements MessageDrivenBean, MessageListener { public HelloMDBBean() { } public void ejbCreate() { } public void ejbRemove() { } public void setMessageDrivenContext(MessageDrivenContext messageDrivenContext) throws EJBException { } public void onMessage(Message message) { TextMessage txtMsg; txtMsg = (TextMessage) message; try { System.out.println("onMessage: " + txtMsg.getText()); } catch (Exception e) { System.out.println(e.getMessage()); } try { Context ctx = new InitialContext(); HelloSessionHome home = (HelloSessionHome) ctx.lookup("HelloSessionEJB"); HelloSession remote = home.create(); System.out.println(remote.sayHello(txtMsg.getText())); } catch (Exception e) { System.out.println(e.getMessage()); } } } ======================================    ====================================== ……前略 HelloMDBEJB HelloMDBBean Container javax.jms.Queue ======================================    ====================================== HelloMDBEJB queue/testQueue ====================================== ====================================== import javax.jms.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.util.Properties; public class HelloMDBClient { public static void main(String[] args) throws JMSException, NamingException { Properties props = new Properties(); props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); props.put(InitialContext.PROVIDER_URL, "jnp://localhost:1099"); Context ctx = new InitialContext(props); QueueConnectionFactory factory; factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory"); QueueConnection conn = factory.createQueueConnection(); Queue queue = (Queue) ctx.lookup("queue/testQueue"); QueueSession session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); QueueSender sender = session.createSender(queue); TextMessage message = session.createTextMessage("This is Sender"); sender.send(message); conn.start(); System.out.println("Send: " + message.getText()); conn.close(); } } ======================================