- 浏览: 55770 次
- 性别:
- 来自: 上海
最新评论
为什么要使用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-----------------------------------
================
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-----------------------------------
java 代码
- 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) { }
- }
- }
发表评论
-
JSP/Servlet的重定向技术综述
2007-08-08 19:28 1127有关JSP/Servlet的重定向技术综述如下 1.Reque ... -
对于Struts和Spring两种MVC框架的比较
2007-08-05 13:00 1105基于Web的MVC framework在J2E ... -
全面认识JAVA
2007-08-04 19:35 837以下是Java标准技术的一些要点: 一、Java的跨平台性 ... -
Java 学习历程
2007-08-04 18:26 1044最近论坛上看到好几个朋友都在问,如何学习 Java的问 ... -
初学者如何开发出一个高质量的J2EE系统
2007-08-04 17:32 756J2EE学习者越来越多,J2EE本身技术不断在发展,涌现出各 ... -
什么是ANT
2007-08-04 14:44 3219ANT是一个基于Java的自动化脚本引擎,脚本格式为XML。除 ... -
什么是JUnit
2007-08-04 14:39 1039JUnit是一个开发源 ... -
Hibernate 是什么
2007-08-04 14:34 1176官方网站http://www.hibe ... -
什么是JNDI
2007-08-04 14:23 1457JNDI全称 Java Naming and Director ... -
什么是Tomcat
2007-08-04 14:22 1081如今,基于Web的应 ... -
SWT:AWT和SWING的强大竞争者
2007-08-04 14:04 1143从Java诞生至今,已 ... -
什么是J2EE
2007-08-04 00:10 874什么是J2EE呢?从整 ... -
什么是RSS
2007-07-28 20:04 864名词解释:什么是RSS? ...
相关推荐
传统的两层C/S结构难于维护,稳定性极差,界面代码和数据库代码混淆在一起,牵一动百,多层结构使得界面和数据库完全分离,并且诞生了中间件这样的技术,如下图:Web+EJB能组成真正的多层结构为什么使用EJB我原先...
标题中的“pafa中使用ejb”指的是在Pafa(可能是某个特定的软件或框架的缩写)中集成和使用Enterprise JavaBeans(EJB)的技术。EJB是Java EE(现在被称为Jakarta EE)平台的一部分,它提供了一种标准的方式来创建可...
3. **配置部署描述符**:使用`ejb-jar.xml`文件指定EJB的部署属性。 **部署到应用服务器** 1. **打包**:将EJB类及其依赖项打包成`ejb-jar`文件。 2. **配置**:在应用服务器中配置EJB的部署信息。 3. **部署**:...
在这个"使用ejb2.0 ql教程代码"中,我们将会探讨EJB 2.0中的查询语言(QL)及其在实际应用中的使用。 EJB QL(Enterprise JavaBeans Query Language)是EJB 2.0引入的一种面向对象的查询语言,它允许开发者根据对象...
通过这个EJB例子,新手可以了解到如何设置EJB的配置,编写bean类和接口,以及如何在客户端使用EJB服务。通过实践,能够更好地理解EJB在分布式系统中的作用和优势,为以后的中间件开发打下坚实基础。
理论上任何Java类都可能被视为一个Bean,但在实践中,JavaBean通常具备无参数构造函数,并实现了`Serializable`接口以支持持久化。JavaBean类似于COM模型中的本地进程内组件,不具备跨进程访问能力。 - **...
EJB3则引入了依赖注入(Dependency Injection,DI)的概念,使用@EJB注解实现对象的自动装配,使得代码更加简洁和松耦合。比如: ```java @EJB private TestSessionLocal testbean; public void invoke() { ...
javax.ejb.AccessLocalException.class javax.ejb.CreateException.class javax.ejb.DuplicateKeyException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb....
企业Java Beans(EJB)是Java平台为企业级应用提供的一种组件模型。随着技术的发展,EJB经历了多个版本的迭代,其中EJB 2.0和EJB 3.0是两个重要的里程碑版本。本文将详细阐述这两个版本之间的主要区别。 #### 二、...
`@Clustered`注解是关键,它告诉JBOSS服务器要将此Bean部署为集群的一部分。 集群配置涉及到多个JBOSS服务器的设置。在这个例子中,JBOSS 4.0.5 GA被安装在两个不同的IP地址(192.168.1.88和192.168.1.99)上,并且...
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax....
总结来说,EJB中的JNDI使用主要包括了查找和绑定EJB组件,以及在EJB内部查找和使用其他资源。源码例子将提供具体实现细节,帮助你掌握这些关键点。通过学习和实践,你能够熟练地在实际项目中运用JNDI,提升企业级...
了解如何正确使用`find()`、`persist()`、`merge()`和`remove()`方法是学习EJB3的重点。 **六、EJB3-QL(Java Persistence Query Language)** EJB3-QL是JPA的查询语言,类似于SQL,但更加面向对象。你可以学习如何...
EJB(Enterprise JavaBeans)和Hibernate是两种在Java企业级应用开发中广泛使用的技术。EJB是Java EE(Java Enterprise Edition)的一部分,主要用于构建可扩展的、安全的、事务处理的分布式应用程序。而Hibernate则...
什么是EJB EJB(Enterprise JavaBeans)是Java平台的一种企业级组件模型标准,用于构建可重用的企业级应用组件。它由Sun Microsystems制定,并通过Java Community Process (JCP)来规范其版本更新和技术细节。 - *...
6. **测试EJB**:可以通过EJB客户端(如Java SE应用或另一个EJB)进行远程调用测试,也可以在Eclipse内使用JUnit进行单元测试。 7. **集成测试**:在完整的应用环境中测试EJB,确保它们能正确地与其他组件(如Web...
【标题】"Idea搭建EJB架构Demo项目源代码"涉及的是使用IntelliJ IDEA(简称Idea)这个强大的Java集成开发环境来构建一个基于EJB(Enterprise JavaBeans)架构的示例项目。EJB是Java EE(企业版)平台的核心部分,...
测试类通常会使用JNDI查找来获取远程或本地的EJB bean,并调用其方法进行实际的计算。 在个人所得税计算逻辑中,EJB可能会根据中国的税法规定,考虑工资、奖金、年终奖、社保公积金等不同收入类型,以及对应的免税...