`
JAVA海洋
  • 浏览: 598512 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论
阅读更多
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, balance) 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;
}

.......其他的方法,由于篇幅问题就不一一列出了,请大家参阅原代码!
}
分享到:
评论

相关推荐

    EJB相关知识整理1

    EJB的底层是远程方法调用,本质上的目的是把业务逻辑放到服务器上,然后客户端远程调用服务器上的方法来工作,放在服务器上的那些java类就叫EJB,EJB容器是一

    基于Hibernate和Struts的J2EE应用开发 PDF

    应用的开发过程中也出现了一些问题:1)数据模型和逻辑模型之间的 矛盾。目前使用的数据库基本上都是关系型数据库,而Java本质上是一 种面向对象的语言,对象在存储和读取时使用SQL和JDBC进行数据 库操作,降低了...

    XML本质论

    XML已经取代Java、设计模式和对象技术,成为软件行业期盼已久的问题解决方案。本书从编程角度深入分析了如何将XML用作类似COM、CORBA的组件集成技术并通过实例说明了如何将XML用作独立开发的软件组件间的粘合剂。...

    xml本质论

    XML已经取代Java、设计模式和对象技术,成为软件行业期盼已久的问题解决方案。本书从编程角度深入分析了如何将XML用作类似COM、CORBA的组件集成技术并通过实例说明了如何将XML用作独立开发的软件组件间的粘合剂。...

    Java面试题

    “J2EE平台本质上是一个分布式的服务器应用程序设计环境——一个Java环境,它提供了: ?宿主应用的一个运行基础框架环境。 ?一套用来创建应用的Java扩展API。”(引自《J2EE服务器端高级编程》) 2. EJB与JAVA BEAN...

    MDB 消息驱动Bean

    MDB在本质上无状态的,也就是说EJB容器可以执行大量的MDB实例,并发地处理从各个应用程序或者JMS生产者而来的数百个JMS消息,并且还支持服务质量(quality of service,QoS),比如企业应用程序的高可用性和可靠性。

    Hibernate实战(第2版 中文高清版)

     10.1 事务本质   10.1.1 数据库和系统事务   10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   ...

    超级有影响力霸气的Java面试题大全文档

    但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理, EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 24、...

    java 面试题 总结

    但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 21、...

    java基础题 很全面

    以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 31 6. 写一段Jdbc连Oracle的程序. 32 7. 编码实现内部类 34 8. 输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按...

    Java的六大问题你都懂了吗

    这些问题对于认真学习java的人都要必知的,当然如果你只是初学者就没必要那么严格了,那如果你认为... 最后呢,还有些java的技术,包括EJB3.0等,可以选择学习,与三大轻量级框架相比,EJB就是当之无愧的重量级了。

    Java面试笔试资料大全

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    最新Java面试宝典pdf版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    Java面试宝典2010版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 4、编程用JAVA解析XML的方式. 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 七. 流行的框架与新技术 1、谈谈你对Struts的理解...

    JAVA面试宝典2010

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    Java面试宝典-经典

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    java面试题大全(2012版)

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    Java面试宝典2012版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、...

Global site tag (gtag.js) - Google Analytics