分享
 
 
 

EJB实质问题

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

为什么要使用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) { }

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有