全局(Entity)EJB的应用 
1、全局EJB的作用 
     (1)、可以和数据库的数据结合操作,全局EJB提供各种数据操作的方法。      (2)、全局EJB的数据可以被多个客户端共享使用,全局EJB引入主键的应用,主键可以标识每个全局EJB。 2、全局EJB的分类       全局EJB分为Bean持续性和容器持续性。它们的区别如下:       (1)、Bean持续性将SQL语句写入代码         (2)、容器持续性EJB代码没用SQL处理语句,作用XML文件进行写义,且适应不同的数据库。 3、全局EJB生命周期结构图
   缓冲状态EJB不与数据表的数据建立联系,不存在主键;缓冲状态EJB通过ejbCreate方法和ejbPostCreate方法或者ejbFind方法获得主键,建立与数据表的数据的关系,当缓冲状态EJB取得主键后便处于准备使用状态,如果EJB内的远程方法被使用,ejbLoad方法首先被激活,运行远程方法,然后ejbStore被激活。一个全局EJB可以有多个缓冲状态和准备使用状态。 
EJB主文件: package hello; 
import java.rmi.*; import java.sql.*; import javax.ejb.*; 
public class HelloBean     implements EntityBean {   EntityContext entityContext;   String name; 
   public String ejbCreate() throws CreateException {     System.out.println("ejbCreate");     this.name = name;     return "";   } 
  //在ejbCreate后执行   public void ejbPostCreate() throws CreateException {     System.out.println("ejbPostCreate");   } 
  public void ejbRemove() throws RemoveException {     System.out.println("ejbRemove");   } 
  
  public String getName() {     System.out.println("getName");     return name;   } 
  public String ejbFindByPrimaryKey(String name) throws       FinderException, SQLException {     System.out.println("ejbFindByPrimaryKey");     Connection conn = this.getConnection();     Statement stmt = conn.createStatement();     ResultSet rs = stmt.executeQuery(         "SELECT user, password FROM usertable where user = '" + name + "'");     while (rs.next()) {       String s2 = rs.getString("user");       String s3 = rs.getString("password");       System.out.println("\tUser: " + s2 + "\tPassword: " + s3);     } 
    return "hufei";   } 
  //在执行远程方法前被激活   public void ejbLoad() {     System.out.println("ejbCreate");   } 
  //在执行远程方法后被激活   public void ejbStore() {     System.out.println("ejbStore");   } 
  public void ejbActivate() {     System.out.println("ejbActivate");   } 
  public void ejbPassivate() {     System.out.println("ejbPassivate");   } 
  //当第1次引用创建接口方法时,该方法被激活   public void setEntityContext(EntityContext entityContext) {     System.out.println("----------------------------------------------------");     System.out.println("setEntityContext");     this.entityContext = entityContext;   } 
  public void unsetEntityContext() {     System.out.println("unsetEntityContext");     this.entityContext = null;   } 
  public Connection getConnection() {     System.out.println("getConnection");     try {       Class.forName("org.gjt.mm.mysql.Driver"); // MySQL       String url =           "jdbc:mysql://172.16.87.10/test?useUnicode=true&characterEncoding=SJIS";       //database name hellodb ,change to your characterEncoding       Connection con = (Connection) DriverManager.getConnection(url, "root", "");       //this.conn = con;       return con;     }     catch (Exception ex) {       ex.printStackTrace();     }     return null;   } 
  public boolean addUser(String user, String password) {     try {       Connection conn = this.getConnection();       Statement stmt = conn.createStatement();       String sql = "insert into usertable values('" + user + "','" + password + "')";       System.out.println("SQL: "  + sql);       boolean success = stmt.execute(sql);       return success;     }     catch (Exception ex) {       ex.printStackTrace();     }     return false;   } 
} 
EJB远程接口: package hello; 
import javax.ejb.EJBObject; import java.rmi.RemoteException; 
public interface HelloRemote     extends EJBObject { 
  public String getName() throws RemoteException; 
  public boolean addUser(String user, String password) throws RemoteException; } EJB创建接口: package hello; 
import javax.ejb.EJBHome; import javax.ejb.CreateException; import java.rmi.RemoteException; import javax.ejb.FinderException; import java.sql.SQLException; 
public interface HelloRemoteHome     extends EJBHome { 
  public HelloRemote create() throws CreateException, RemoteException; 
  public HelloRemote findByPrimaryKey(String name) throws FinderException,       SQLException, RemoteException; }
  客户端: /**  * <p>Title: </p>  * <p>Description: </p>  * <p>Copyright: Copyright (c) 2004</p>  * <p>Company: </p>  * @author 胡斐  * @version 1.0  */ 
import java.util.*; import javax.naming.*; import javax.rmi.*; 
import hello.*; 
public class HelloClient { 
  public static void main(String[] args) throws Exception {     //声明链接jboss服务器的属性类     Properties properties;     //声明寻找服务器对象的Context类     Context ctx;     //设置访问jboss服务器的参数     properties = new Properties();     properties.put("java.naming.factory.initial",                    "org.jnp.interfaces.NamingContextFactory");     properties.put("java.naming.provider.url", "localhost:1099");     //创建JNDI对象的搜索器     ctx = new InitialContext(properties);     //使用lookup方法寻找UserTableRemote对象     Object UserTableJNDI = ctx.lookup("Hello");     //取得EJB的Home接口     HelloRemoteHome home = (HelloRemoteHome) PortableRemoteObject.narrow(         UserTableJNDI, HelloRemoteHome.class);     //声明EJB的的Remote接口     HelloRemote jackUser;     try {       //取得EJB的Remote接口       jackUser = (HelloRemote) PortableRemoteObject.narrow(home.           findByPrimaryKey("wfz"),           HelloRemote.class);       System.out.println(jackUser.getName());       jackUser.addUser("hx", "san1");     }     catch (Exception ex) {       ex.printStackTrace();     } 
  } 
} 注意:不能在一个方法内抛出两个异常,将会引起nesting错误.  
 
  |