Topic: ejb初学者毕读,如果大家反映好的话,请班主给加点分 |
Print this page |
1.ejb初学者毕读,如果大家反映好的话,请班主给加点分 | Copy to clipboard |
Posted by: ccic134302 Posted on: 2003-05-13 09:40 EJB,是企业JAVA BEAN的缩写,这里,想跟大家谈谈一些实质的问题,如果大家反映好的话,请班主给加点分!!!!!!! 为什么要使用EJB? EJB最大的诱人之处是她把应用程序和服务器分开了,我们再也不用和那些服务器上的复杂的资源打交道了,什么数据库,什么进程,线程,什么安全权限,什么套接字,都见鬼去吧,我们只需要专著于我们的商业逻辑的实现了. EJB的实质? EJB实际上是SUN的J2EE中的一套规范,并且规定了一系列的API用来实现把EJB概念转换成EJB产品.EJB是BEANS,BEANS是什么概念,那就是得有一个容纳她,让她可劲造腾的地方,就是得有容器.EJB必须生存在EJB容器中.这个容器可是功能强大之极!她首先要包装你BEAN,EJB的客户程序实际上从来就不和你编写的EJB直接打交道,他们之间是通过HOME/REMOTE接口来发生关系的.它负责你的BEAN的所有的吃喝拉萨睡,比如BEAN的持续化,安全性,事务管理... EJB服务器产品 各个WEB服务器开发商基本上都在他们WEB服务器中新捆绑了EJB容器,或者叫EJB服务器.其中最简单也是最根本的是J2EE开发环境带的J2EE的EJB容器,它很好的和J2EE的HTTP服务器和Servlet引擎一起构筑了一个很好的运行环境,由于配置简单,功能强大,因此成为我的最爱.另外象BEA的Weblogical是值得推荐的一个产品,它的WEB服务器功能相当强大,是当今很多网站构筑的理想WEB服务器,它也已经加入了EJB的行列,在EJB方面有着不俗的表现.Inprise的IAS更是一个功能强大的WEB服务器,同样,也嵌入了EJB容器,加之与本公司的JBuilder的无接缝结合,更使它人气攀升.还有象IBM的WebSphere也不错,不过Apache是否已经搭载了EJB容器,我不太清楚.另外,推荐一个EJBoss,是一个完全免费的EJB服务器,而且是原代码公开的. EJB容器如何包装你的BEAN. 这年头没有天上掉馅饼的好事情,EJB也不例外,你想让EJB容器替你管理你编写的EJB的吃喝拉萨睡,凭什么?!凭XML描述子,你通过一个XML文件告诉EJB容器BEAN的相关配置信息,比如我的EJB的HOME接口和REMOTE接口是哪一个类,比如我的EJB的别名(实际上是JNDI名称)叫什么,比如我的EJB是否是实体类型的EJB还是对话类型的EJB,比如告诉容器替我管理我的实体EJB中哪些自段,......总之,你得跟咱们的EJB大总管----EJB容器把所有都交代清楚.这样,剩下的,就看EJB容器的了!!!你是不是总共写过3个文件,BEAN定义,HOME接口定义,ROMOTE接口定义,当你DEPLOY他们时,容器会 (1).首先根据HOME和REMOTE接口生成他们的实现代码,我们不妨叫做HOME_IMPL和REMOTE_IMPL, (2).然后,利用RMIC产生HOME_IMPL和REMOTE_IMPL的STUB和SKELETON文件,2X2一共生成4个文件. (STUB和SKELETON请参见RMI的相关概念) 如此这般,最后,在服务器上,一共有 BEAN HOME_IMPL REMOTE_IMPL HOME_STUB HOME_SKELETON REMOTE_STUB REMOTE_SKELETON 7文件,才能让EJB工作起来. (3).生成实体EJB对应的数据库的库表 (4).注册你的EJB到JNDI服务 为什么除了写BEAN,还得写接口文件,而且干嘛要HOME和REMOTE两个接口. 我搅着吧,这两个接口完全是可以合并成一个接口的,其实他们的作用都只是一个接口,为了让那人家SUN干吗还拆成两个呢?我想,正如SUN所说的,为了将一些容器相关操作和客户商业方法分开,什么意思?说开了吧,HOME用来规范容器相关的操作方法,REMOTE负责专心致志的定制商业方法,而我们的BEAN才是最终的逻辑实现者.还是不明白?没关系,我在说的细些,举例说明:把我想象成一个BEAN,HOME接口就是我们家人的命令,REMOTE接口就是我们单位的领导的命令,我们家人的命令决定了我如何吃喝拉萨睡,领导的命令决定了我如何做一些真正的工作,请注意这里我使用了"决定"这个字眼,我并没有说我们家人,而是说了我们家人的命令,这个命令的含义就是接口,不是类,而我这个BEAN却是个类!还有,BEAN类不实现REMOTE和HOME接口,记住!记住! EJB的分类 EJB分为实体(Entity)EJB和对话(Session)EJB, >>>>>>实体EJB:>>>>>>对话EJB<<<<<<< 对话EJB根本根本不和数据库打交道,为什么,因为他根本不用序列化!他只负责来完成一些逻辑操作,比如算个帐什么的.为了和实体EJB较劲,他也一口气生了两个儿子, a.有状态(sessionful)对话EJB 他就跟servlet中的session对象似的,可以保存用户的session相关信息,而且他仅仅被一个用户的一次session所使用,不和别人共享,我管他叫对话,不过这"对话"翻出来这是够难听的,还不如就叫他session呢! b.无状态(sessionless)对话EJB 这个东东是最简单的EJB,他是可以被多个用户共享,注意!我所说的共享是指实例的共享! 一个BEAN管理持续化的实体EJB(BMP)小例子 说了半天了,大家珍贵的脑资源恐怕被我消耗的差不多了,好,让我们来剖析一个BEAN管理持续化的实体EJB(BMP)吧. -----------------------看看REMOTE接口------------------------------ public interface Account extends EJBObject {//必须从EJBObject继承 //这些都是商业方法,而且这里写了的,必须在BEAN中都实现 public void deposit(double amt) throws RemoteException; public double withdraw(double amt) throws AccountException, RemoteException; public double getBalance() throws RemoteException; public String getOwnerName() throws RemoteException; public void setOwnerName(String name)throws RemoteException; } -------------------------看看HOME接口--------------------------------- public interface AccountHome extends EJBHome { //这声明了create函数,由于是BMP,所以必须在BEAN中实现一个叫ejbCreate的对应函数 Account create(String accountID, String ownerName) throws CreateException, RemoteException; //按主键查询 //由于是BMP,所以必须在BEAN中实现一个叫ejbFindByPrimaryKey的对应函数 public Account findByPrimaryKey(AccountPK key) throws FinderException, RemoteException; //按其中的Name字段查询 //由于是BMP,所以必须在BEAN中实现一个叫ejbFindByOwnerName的对应函数 public Account findByOwnerName(String name) throws FinderException, RemoteException; } ---------------------------看看BEAN----------------------------------- public class AccountBean implements EntityBean { //三个PUBLIC字段,他们将来对应库表的三个字段 public String accountID public String ownerName; public double balance; //----HOME中声明的create方法的影射实现 //由于是BMP,所以必须自己来负责实例创建时实例到数据库的影射 public AccountPK ejbCreate(String accountID, String ownerName) throws CreateException, RemoteException { PreparedStatement pstmt = null; Connection conn = null; try { this.ownerName = ownerName; this.balance = 0; conn = getConnection(); pstmt = conn.prepareStatement("insert into accounts (id, ownerName, ba lance) values (?, ?, ?)"); pstmt.setString(1, accountID); pstmt.setString(2, ownerName); pstmt.setDouble(3, balance); //看这里,看这里!插进去了... pstmt.executeUpdate(); return new AccountPK(accountID); }catch (Exception e) { throw new CreateException(e.toString()); }finally { try { pstmt.close(); conn.close(); }catch (Exception e) { } } } //----HOME中声明的findByOwnerName方法的影射实现 //由于是BMP,所以必须自己来完成按照Name字段查找的工作 public AccountPK ejbFindByOwnerName(String name) throws FinderException, RemoteException { PreparedStatement pstmt = null; Connection conn = null; try { conn = getConnection(); pstmt = conn.prepareStatement("select id from accounts where ownerName = ?"); pstmt.setString(1, name); //看看看!找上了,根据名称... ResultSet rs = pstmt.executeQuery(); rs.next(); String id = rs.getString("id"); pstmt.close(); conn.close(); return new AccountPK(id); }catch (Exception e) { throw new FinderException(e.toString()); }finally { try { pstmt.close(); conn.close(); }catch (Exception e) { } } } //----REMOTE中声明的一个方法的实现 //这是一个商业方法,来完成帐户的存款查询 public double getBalance() { System.out.println("[AccountEJB-getBalance]getBalance() called."); return balance; } .......其他的方法,由于篇幅问题就不一一列出了,请大家参阅原代码! } |
2.給ejb初学者 [Re: ccic134302] | Copy to clipboard |
Posted by: why Posted on: 2003-05-13 10:02 如果是原創,應該會打分; 如果只是轉貼,這篇內容普通,而且格式不便閱讀,更未寫清楚原作者和出處,小的暫不會加分啦! 也許dapan版主會打分的哩 轉貼很花時間嗎?找一篇好文章可能很不容易,但是這樣剪貼卻不見得有什麼難處? 小標題可以加粗體或加顏色; 下面的不當斷行可以修葺 pstmt = conn.prepareStatement("insert into accounts (id, ownerName, ba lance) values (?, ?, ?)"); “ROMOTE接口定义”這種錯字可以改正; “不过Apache是否已经搭载了EJB容器”和“EJBoss”可以補充更新; 等等,或者加以引申討論,這才是小的心目中的不容易、花時間、用心嘛! “ejb初学者毕读,如果大家反映好的话,请班主给加点分”這個標題完全是從自我的立場出發,而不是為了清楚告訴讀者文章的主旨,很老實說,小的不喜歡這種態度。如果大俠還未有積分,小的覺得可以理解,但是大俠已經有四分嘛! 小的的標準可能比較嚴格,因為小的在這個論壇獲益良多,覺得分享和互相幫助就像天經地義的事情,所以要做得出色、用心才會打分囉! 最後,請看清楚、想一想“暫不會加分”的暫字。 PS 請教一下,“反映好”是“反應好”的誤寫還是國內的說法呢? |
3.Re:ejb初学者毕读,如果大家反映好的话,请班主给加点分 [Re: ccic134302] | Copy to clipboard |
Posted by: ccic134302 Posted on: 2003-05-13 11:51 是載貼那也的时间啊,你说对不对,再说我看了那么多的关于ejb的资料每一部都是长片大论,初学者看了一知半解(至少我是那样),我这片載貼通俗易懂 其中的比喻可以帮助初学者理解ejb的执行流程,我好不容易贴了出来,大家看吧 |
4.Re:ejb初学者毕读,如果大家反映好的话,请班主给加点分 [Re: ccic134302] | Copy to clipboard |
Posted by: haibo Posted on: 2003-05-15 15:44 文章写得挺诙谐的,这使我想起了上海的“林锐“ 博士的创作风格。 如果是原创,那作者可费了一番力气了。 |
5.Re:ejb初学者毕读,如果大家反映好的话,请班主给加点分 [Re: ccic134302] | Copy to clipboard |
Posted by: aaron_leo Posted on: 2003-05-16 09:08 一点指正: 作者说两个接口可以合而为一,不尽然; 在JNDI tree中发布的是远程OBJ,这就意味着每个client得到的是同一个obj的stub,由于stub在客户端可以充当obj的作用,所以就是说每个客户端得到的是同一个obj,这点可以看RMI-IIOP原理; 若合而为一的话,那么就会出现这种情况,成千上万个客户使用同一个EJB obj来进行商业运算等逻辑(可以吗,可以想想stateful session bean);其实是这样的,每种bean,也就是我们命名的,编写的每个ejb,部署后发布了一个唯一的home obj,每个客户得到它stub的一个copy,然后使用同一个home obj来产生自己专用的EJB obj来服务自己; |
6.Re:ejb初学者毕读,如果大家反映好的话,请班主给加点分 [Re: ccic134302] | Copy to clipboard |
Posted by: sharinglife Posted on: 2003-05-16 11:00 AccountPK 主键类还没有定义哈。如果把这个类的定义给出来展示给初学者,那就更好了:) |
7.Re:EJB趣味簡介 [Re: ccic134302] | Copy to clipboard |
Posted by: lovejava Posted on: 2003-05-19 19:55 我是个出学者看了很好给了我很大的启示是变量的插入和更改能不能给我看看! 以下與本話題內容無關,lovejava大俠把 http://www.cjsdn.com/post/view?bid=10&id=28064 上的問題扯過來啦! 我的代码编译通过但是数据不改还有在主方法能改数据这是怎么回事呀我在数据连接在public static void main(String[] args) throws SQLException, IOException, ClassNotFoundException{}在主方法时是改变数据的但是 用到用按扭这么就不改变了呢! public void actionPerformed(ActionEvent e) {if(e.getSource()=="添加") {new inset();}} class{ public void inset() throws SQLException, IOException, ClassNotFoundException{连接和操作跟上面主方法一样的但在按按钮时数据不改变} } 是不是在用Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String dsURL = "jdbc:odbc:sql"; Connection connection = DriverManager.getConnection(dsURL);是不是只在主方法里才能好用是吗? |
8.Re:ejb初学者毕读,如果大家反映好的话,请班主给加点分 [Re: ccic134302] | Copy to clipboard |
Posted by: bawanglongqiqi Posted on: 2003-06-08 15:37 不错啊,我也是刚刚开始学习,看了一些网上的资料,可很多基本概念还是不大明白! 这篇文章不错,很适合初学者! UP!!! 支持!!! 原地址在哪里呢?还有源代码? 可以贴出来么? |
9.Re:ejb初学者毕读,如果大家反映好的话,请班主给加点分 [Re: ccic134302] | Copy to clipboard |
Posted by: firesnow Posted on: 2003-06-10 10:11 不错,看了后很有启发,最好能给出些例子更好,我也在学习中! |
10.Re:ejb初学者毕读,如果大家反映好的话,请班主给加点分 [Re: ccic134302] | Copy to clipboard |
Posted by: Hodex Posted on: 2003-06-10 13:49 哈哈,写得不错,感觉文学水平比技术水平还高 --没说你技术水平低哦 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |