科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道关于EJB返回值的解决方案

关于EJB返回值的解决方案

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

相信很多人都有如此之困惑,得此解决方法不敢独享,公之于众,以利后来人。   声明:此方法的至于彭璐大侠,彭大侠可能不常上网,这麽好的方法也不告诉我等之小虾米,只好代劳了。

作者:中国IT实验室 来源:中国IT实验室 2007年9月7日

关键字: EJB

  • 评论
  • 分享微博
  • 分享邮件
 相信很多人都有如此之困惑,得此解决方法不敢独享,公之于众,以利后来人。
  声明:此方法的至于彭璐大侠,彭大侠可能不常上网,这麽好的方法也不告诉我等之小虾米,只好代劳了。
  好了,不废话了,有两种方法:
  1、用vector:
  /**
  * Finds all EJBeans with a balance greater than a given amount.
  * Returns an Enumeration of found EJBean primary keys.
  *
  * @param balanceGreaterThan double Test Amount
  * @return Enumeration EJBean Primary Keys
  * @exception javax.ejb.EJBException
  * if there is a communications or systems failure
  */
  public Enumeration ejbFindBigAccounts(double balanceGreaterThan) {
  log("ejbFindBigAccounts (balance > " + balanceGreaterThan + ")");
  Connection con = null;
  PreparedStatement ps = null;
  try {
  con = getConnection();
  ps = con.prepareStatement("select id from ejbAccounts where bal ?");
  ps.setDouble(1, balanceGreaterThan);
  ps.executeQuery();
  ResultSet rs = ps.getResultSet();
  Vector v = new Vector();
  String pk;
  while (rs.next()) {
  pk = rs.getString(1);
  v.addElement(pk);
  return v.elements();
  } catch (SQLException sqe) {
  log("SQLException: " + sqe);
  throw new EJBException (sqe);
  } finally {
  cleanup(con, ps);
  }
  }
  结论:不爽,不方便。
  2、RowSet
  RowSet tutorial chapter :
  http://developer.java.sun.com/developer/Books/JDBCTutorial/chapter5.html
  rowset是个interface,需要有东西去实现它,sun的规范中给了三个class:cachedrowset,jdbcrowset,webrowset,如果去查jdk1.4 doc和j2skee1.2,有rowset,却没有那三个class,一般的开发工具(至少我的wsad)中也是这样,所以需要下jdbc2.0 opt-pack:
  http://developer.java.sun.com/developer/earlyAccess/crs/
  下下来了再怎么办呢?
  装呗!
  怎么装呢?
  setup呀!
  没有呀?
  啊,没setup呀,sun干什么吃的,连setup都不做个,也太懒了吧。
  哎,我们确实是都被ms惯坏了,看到只有jar,没setup就没辙了,大家好好想想,java最大的特性是什么,就是它的类库可以自由扩充呀,现在明白该怎么做了吧:
  1、解包,得到rowset.jar,放在哪随您的意,别丢了就行。
  2、在您的开发工具中增加一个路径,如:ROWSET_PATH对应:d:\jdk1.4\jre\rowset.jar(和1的路径对应就行)。
  3、右键您的工程文件,出现:property(大多数工具应该都有吧),加上rowset_path。
  4、在您的源文件中:import sun.jdbc.rowset.*;
  OK,搞定!下面就看您的了。(当然也可以把rowset压到jre里去)
  应该说rowset(其实主要是CachedRowSet)真的是个好东西,和ms ado的resultset和borland的tclientset非常相似,最大的好处是Cache功能!
  好了,看例子吧:
  ////server端///
  package example4;
  import java.sql.*;
  import javax.sql.*;
  import sun.jdbc.rowset.*;
  import javax.naming.*;
  import javax.ejb.*;
  public class CoffeesBean implements SessionBean {
  private SessionContext sc = null;
  private Context ctx = null;
  private DataSource ds = null;
  public CoffeesBean () {}
  public void ejbCreate() throws CreateException {
  try {
  ctx = new InitialContext();
  ds = (DataSource)ctx.lookup("jdbc/CoffeesDB");
  }
  catch (Exception e) {
  System.out.println(e.getMessage());
  throw new CreateException();
  }
  }
  public RowSet getCoffees() throws SQLException {
  Connection con = null;
  ResultSet rs;
  CachedRowSet crs;
  try {
  con = ds.getConnection("webCustomer", "webPassword");
  Statement stmt = con.createStatement();
  rs = stmt.executeQuery("select * from coffees");
  
  crs = new CachedRowSet();
  crs.populate(rs);
  // the writer needs this because JDBC drivers
  // don't provide this meta-data.
  crs.setTableName("coffees");
  rs.close();
  stmt.close();
  } finally {
  if (con != null)
  con.close();
  }
  return rset;
  }
  public updateCoffees(RowSet rs) throws SQLException {
  Connection con = null;
  try {
  CachedRowSet crs = (CachedRowSet)rs;
  con = ds.getConnection("webCustomer", "webPassword");
  // moves the changes back to the database
  crs.acceptChanges(con);
  } finally {
  if (con != null)
  con.close();
  }
  }
  //
  // Methods inherited from SessionBean
  //
  public void setSessionContext(SessionContext sc) {
  this.sc = sc;
  public void ejbRemove() {}
  public void ejbPassivate() {}
  public void ejbActivate() {}
  }
  //////////////////client端//////////////
  package example4;
  import java.sql.*;
  import javax.sql.*;
  import sun.jdbc.rowset.*;
  import javax.naming.*;
  import javax.ejb.*;
  import javax.rmi.*;
  class CoffeesClient {
  public static void main(String[] args) {
  
  try {
  // init the bean
  Context ctx = new InitialContext();
  Object obj = ctx.lookup("ejb/Coffees");
  CoffeesHome coffeesHome = (CoffeesHome)
  PortableRemoteObject.narrow(obj, CoffeesHome.class);
  Coffees coffees = coffeesHome.create();
  
  // get the rowset from the bean
  CachedRowSet rset = (CachedRowSet)coffees.getCoffees();
  
  // find the Columbian coffee
  while (rset.next()) {
  String coffeeName = rset.getString("COF_NAME");
  if (coffeeName.equalsIgnoreCase(new String("Columbian"))) {
  // columbian coffee has gone up 10%
  rset.updateFloat("PRICE",
  (float)(rset.getFloat("PRICE") * 1.10));
  rset.updateRow();
  }
  }
  // finally send the updated back to the bean...
  System.out.println("Calling update method");
  coffees.updateCoffees((RowSet)rset);
  }
  catch (Exception e) {
  System.out.println(e.getMessage());
  }
  }
  }
  例子很简单就不多讲了。
  cheers.
  Robin

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章