`
isiqi
  • 浏览: 16651237 次
  • 性别: 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;
}

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

相关推荐

    EJB3.0与EJB2.0的区别

    综上所述,EJB3.0确实带来了实质性的简化,它通过注解和依赖注入等机制降低了开发难度,使得EJB更接近轻量级的Java开发。同时,EJB3.0保持了EJB2.0的核心功能,并在许多方面进行了优化,从而提升了开发效率和代码...

    EJB介绍

    EJB的出现旨在解决大型企业系统中常见的复杂性问题,如服务集群、事务管理、安全性以及资源的高效利用。EJB允许开发者将业务逻辑封装在服务器上的组件中,从而实现客户端与服务器之间的松耦合。 1. **服务集群和...

    ejb设计模式.pdf

    - **GOF中的Facade模式**:Session Façade模式本质上是对GOF Facade模式的一种扩展应用,它简化了对EJB服务的调用。 ##### 2.4. Fast-Lane Reader 模式 - **意图**:提供一种快速读取大量数据的方法。 - **动机**...

    ejb 学习笔记

    在EJB 3.0中,会话Bean本质上是一个Plain Old Java Object (POJO)类,这意味着它们的设计和实现更加简洁,易于理解和维护。 会话Bean的生命周期短暂,其存在时间依赖于客户端与会话Bean交互的时间长度。这种特性...

    J2EE Persistence Options - JDO, Hibernate and EJB 3.0.pdf

    由于对象模型与关系型数据库之间存在本质上的不匹配,即所谓的“对象-关系阻抗失配”,因此需要特定的技术来解决这种差异。 #### 持久化技术概览 - **Entity EJB**:这是早期J2EE中使用的一种持久化技术,它通过...

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

    1. **数据模型与逻辑模型之间的矛盾**:当前大多数数据库都是关系型数据库,而Java语言本质上是一种面向对象的语言。当对象需要通过SQL和JDBC进行数据库操作时,这种面向对象与面向关系的差异会导致编程效率降低,...

    XML本质论

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

    real_world_java_ee_patterns.pdf

    2. **EJB3特性**:EJB 3.0及更高版本中的组件本质上只是带有注解的Java类。当然,如果你偏爱XML配置,仍然可以选择使用部署描述符来替代注解。 3. **容器服务实现**:诸如事务管理、安全控制、并发处理等服务通常...

    xml本质论

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

    华为IBM的java面试题

    - **联系**:JSP本质上会被编译成Servlet,两者都是基于Java的技术,都可以用来处理HTTP请求。 - **区别**: - **语法**:JSP使用HTML为基础,混合了Java代码;而Servlet则完全使用Java编写。 - **应用场景**:JSP...

    Killtest提供 IBM 000-232 资料下载

    这是局部会话具有会话关联性的本质特性 **正确答案:** C **解析:** 在高负载的集群环境中,如果Web容器线程池的大小配置得太小(C项),那么可能会导致线程资源不足,进而影响会话关联性的正常处理。因此,适当...

    MDB 消息驱动Bean

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

    javaSE编程常见细节问题

    ### Java SE 编程常见细节问题解析 #### Java 语言本质与 JVM 相关知识点概述 根据提供的描述,本文将...通过上述内容的学习,我们可以更好地理解 Java 语言的本质以及如何利用这些基础知识来解决实际开发中的问题。

    Enterprise JavaBeans 3

    EJB 3.0 采用 Plain Old Java Object (POJO) 的形式开发,这意味着它们本质上是普通的 Java 对象,通过元数据注解来定义容器的管理策略。 #### EJB 的类型 EJB 主要有三种类型:会话 Bean、实体 Bean 和消息驱动的...

    如何开发出一个高质量的J2EE系统

    总的来说,开发高质量的J2EE系统需要深入理解Java和J2EE的本质,熟练掌握Web、EJB和JMS等核心技术,合理利用组件和框架,以及精心设计系统架构以确保解耦性。此外,选择合适的开发工具和容器,以及优化数据库连接...

    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面试题完整版(含参考答案).doc

    抽象类和接口都是Java中实现抽象化的方式,但它们有着本质的不同。抽象类是一种可以包含抽象方法和非抽象方法的类,它可以有构造函数,但不能实例化。抽象类的主要目的是定义一个类族的公共接口,强制子类实现抽象...

    企业级开发与架构--J2EE框架.

    J2EE本质上是面向企业计算的分布式框架,它定义了一系列规范,这些规范覆盖了容器和应用程序两个层面。一方面,容器提供商需确保其产品符合J2EE规范,为开发者提供稳定、可靠的运行环境;另一方面,应用程序的开发也...

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

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

Global site tag (gtag.js) - Google Analytics