学习J2EE_(2)

类别:Java 点击:0 评论:0 推荐:

全局(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错误.

本文地址:http://com.8s8s.com/it/it15318.htm