EJB学习笔记(转存)

转需,原文链接:http://blog.itpub.net/818/viewspace-787096/

2004-10-13     星期三      晴

服务器端计算(使用WSAD开发、调试以及测试EJB、JSP和Servlet(EJB第一天))

1.  单层(桌面系统)
答: 1) GUI客户端、应用程序以及资源全都在同一台机器(同一层);

2.  二层(服务器/客户端)
答: 1) 胖客户端;
    2) 应用和资源在同一层;
    3) 服务器端程序更新将导致所有客户端程序更新

3.  多层架构体系历史
答: 1) 多层架构体系经历了几个主要的改进:这种改进从单层(主机类型系统)到二层(服务器/客户端);
    2) 在早期九十年代期间,传统企业信息系统提供商开始将二层模型改进为更柔性的三层以及多层应用模型以满足客户需求;
    3) 多层模型将软件部署于一组机器,这些组成了整个应用程序。这个新式的模型将商业逻辑从系统服务以及用户界面分离出来,置于介于二者之间的中间层;
    4) 新的中间件服务的发展(事务监听器、消息导向器)给了这种新的架构体系额外的推动力;
    5) 此外,企业应用程序在互联网以及内部网中的增长使用,突显了以Web浏览器作为客户端的轻便、容易部署。
    6) 多层设置简化了企业应用程序的开发、部署以及维护。它使开发者能专注于商业化逻辑,依赖于不同的后端服务提供客户端应用以满足用户交互。
    7) 一旦完成开发,商业化逻辑能被部署于服务器满足一个组织既存的需求;
    8) 无论如何,没有标准组件结构体系存在于中间层,这迫使开发员专注于不同平台、开发系统以及中间件服务的细节。这限制了开发者部署单层应用程序于不同平台以及满足不同商业条件的挑战。

4.   EJB是多层架构体系的解决方案
答: 1) EJB(Enterprise JavaBeans)是一种服务器端组件架构,这种组件基于用Java写的分布式的应用程序;
    2) 拥有Java和多层架构体系的双重好处;
    3) 是一个标准的中间件;
    4) 自从几年前提出来,EJB技术已获得平台供应商和企业开发团队的充分支持。这是因为EJB组件简化了轻便、可扩展商业化组件的开发。
    5) 通过提供系统级别服务的自动支持,EJB服务器降低了开发商业化组件的复杂性?这些服务包括事务处理、安全以及数据库连接。这使得开发者开发者能集中精力开发商业化逻辑。
    6) EJB架构体系是一种开发和部署以组件为基础的商业化程序的组件架构。

5.  EJB规范的目标
答: 1) EJB规范的目标是定义一个标准,不同的供应商能实现这些标准;
    2) 因为这个标准定义了框架有关的每一个本质上的细节,应用EJB框架写的程序均是可扩展、事务处理以及多用户安全的。此类的应用程序只要写一次,然后可部署于任何支持EJB的服务器平台上。

6.  EJB环境总览
答:1) EJB组件运行于EJB服务器的容器中;
    2) 容器可连接数据库或其它组件;
    3) EJB客户端可访问同一虚拟机中或通过远端接口访问不同虚拟机中企业Bean;
    4) EJB home组件可以看成是EJB对象的工厂;
    5) 从home组件中得到EJB对象可以是在本地也可以是远端接口。

7.  EJB的好处
答:1) 众多网站打算以及正在使用Java,但没有得利用EJB技术。开发者已使用Servlet/JSP模式,在没有应用服务器的帮助下通过JDBC内置的提交和回滚技术进行事务处理。
    2) 这样做的时候,程序开发员面临许多挑战:一些最重要的包括并发处理,持久化以及事务处理。作为结果,开发员要么自行开发要么购买支持的框架。
    3) 通过使用企业Bean,这些问题都得到了解决。企业Bean的使用允许开发者专注于商业逻辑,将他们从基础结构以及中间件逻辑中解放出来。开发者因而变得更富生产力和效率。

8.  何时使用EJB
答:1) 分布式对象
       当使用企业级的JavaBean, 分布式对象用于建立企业级别的系统。这意味着你的系统可以部署于不同的物理机器,由此可产生许多彼此独立的进程,以达到性能、可扩展性、可用性的系统目标。
    2) 可移殖地组件框架
       对于许多具有远见的用户,他们所关注的问题是是否可达到平台无关、供应商和应用服务无关。EJB架构,这个工业化标准架构,能帮助达到这些目标。例如:在WebSphere上开发的企业bean可用于非IBM的应用服务器。
    3) 对象持久化
       a. 对象持久化意味着他的状态(它变量的值)能被保存。大多数情况下,一个持久化对象保存在关系型数据库中。
       b. 不幸的是,对象和关系型数据库相互差异太大。和JAVA相比,关系型数据库拥有有限的模型化能力,诸如对象继承和封装。此外,最主要的转换问题是SQL数据类型和Java的数据类型并不完全匹配。所有的这些问题在使用CMP实体Bean时都得到了解决。
    4) 数据库架构无关
       EJB技术使商业逻辑从数据库访问中清楚地分隔开来。商业逻辑和数据库架构无关并能部署入不同或者变化的数据库架构中。
    5) 事务管理
       a. 对共享数据的并发访问是令开发者最头痛的问题之一。所有相关需要考虑的问题诸如数据库锁定,数据完整性丢失事件可以导致创建高度复杂的框架以管理数据库级别的共享数据的访问。
       b. EJB自动处理这些复杂的线程和并发的共享数据问题。正如前面提到的,EJB容器提供了所有必须的事务服务给企业Bean去管理后台的数据。
    6) 中间层架构
       a. 许多公司认为他们的应用软件,特别是商业规则和数据库架构,是一个有效的资产。因此他们关注在互联网情况下如何保护它们。
       b. EJB使得一个公司可使用中间层架构,因此表现层和逻辑层分隔开来。这种分隔使得第二个防火墙的使用成为可能。
    7) 多个服务器的产能和可用能力
       a. 在过去的几年,客户发现胖客户端简单,但扩展性差而基于Web的系统这方面却强。与此同时,软件分布式问题也使得胖客户端大为减少。
       b. 一周七天,一天二十四小时的正常运行时间是商业至关紧要的问题。开发者应能设计出合格的系统使这成为可能。
       c. 客户所需要的是一种写商业逻辑的方式以满足各种需求。WebSphere的EJB支持可提供这种高度的可扩展性。它利用以下特征实现:
          对象捕获和分享:WebSphere应用服务器自动在服务器层集中企业Bean,降低了花费于对象创建和垃圾收集的时间。在大多数据进程中这样使运行成为可能。
    8) 容错的克隆支持
       a. 有多个clones能够处理请求,这样故障不会破坏运行和可靠性。多个克隆分布于不同的节点,整个机器失败而不会产生灾难性的结果。   
       b. WebSphere应用服务网络部署支持分布、克隆和自动容错。

9.  J2EE和J2SE
答:1) J2EE代表Java 2的企业版本
    2) J2EE是用以服务器端开发的一组强健的中间件应用服务;
    3) J2EE是Java 2标准版的扩展
    4) J2EE使所有Java的企业级API和功能性成为可能,并以一个整体访问。这简化了开发、部署以及多层管理中的复杂问题。

10. J2EE平台技术
答:1) 组件(Servlet、JSP、EJB):
       a. 系统应用一层的单元;
       b. 由应用开发者实现;
       c. 运行于Container内;
       d. 提供相应的服务和通讯
    2) 服务
       a. 为J2EE提供相关功能;
       b. 由J2EE平台提供商实现API;
    3) 会话
       a. 由container提供,用以协作组件;

11. MVC架构模式
答:1) Model: 模型层,由EJB实现;
    2) Controller: 控制层,由Servlet实现;
    3) View: 界面层,由JSP实现。

12. Facade
答:1) 由封装的对象完成商业逻辑,暴露的对象完成任务接受以及完成的应答

13. J2EE技术
答:1) Servlet:
       a. 一种J2EE组件;
       b. servlet可被认为是运行在服务器端的applet;
       c. Servlets提供了基于组件、平台无关的方法用以构建基本Web的应用程序。
    2) JSP
       a. 一种J2EE组件;
       b. 代表Java服务器端页面;
       c. JSP技术是servlet的扩展,可以认为是HTML + JSP tags。
    3) EJB
       a. 一种J2EE组件;
       b. 代表企业级的Java Bean;
       c. EJB定义了服务器端组件是如何被编写以及提供了在组件和管理它们的服务器和组件间的标准架构协议;
    4) JDBC
       a. 一种J2EE服务;
       b. JDBC代表Java Database Connectivity;
       c. JDBC对大范围关系型数据库提供了统一的访问, JDBC2.0提供了数据库连接池的支持。
    5) RMI和RMI-IIOP
       a. 一种J2EE服务;
       b. RMI代表远端方法调用(remote method invocation);
       c. IIOP-Internet Inter-ORB协议;
       d. RMI是一种调用远端方法的一种机制。EJB依靠RMI作为同一机器或不同机器组件间的一种会话API;
    6) JNDI
       a. 一种J2EE服务;
       b. 代表Java命名和目录接口(Java Naming and Directory Interface);
       c. 在以EJB为基础的应用程序中,当客户端需要访问EJB组件,JNDI用于确定和得到组件以服务于客户端。
    7) JMS
       a. 一种J2EE服务;
       b. 代表Java消息服务(Java Messaging Service);
       c. 通过结合Java技术于企业消息,JMS API提供了一个新的,强有力的工具以解决企业计算问题。通过定义一组消息概念和编程策略,JMS API提升了程序员的生产效率;
       d. 异步通讯;
    8) JTA和JTS
       a. JTA代表Java Transaction API;
       b. JTS代表Java Transaction Service;
       c. JTA是高级别的传输API,允许应用程序和J2EE服务器管理事务;JTS表明了事务管理器的具体实现。
    9) security
       a. J2EE访问控制包括鉴定(authentication)和授权(authorization);
       b. 鉴定(authentication):确定用户身份(基于角色);
       c. 授权(authorization):确定用户是否有权访问请求资源;
    10) Containers
       a. 每个组件运行于J2EE平台提供商提供的容器内;
       b. 容器提供了特定的部署和运行服务(生命周期、安全,事务等);
       c. 能提供什么服务依赖于组件的类型。
    11) Web和EJB容器
       a. 通过调用JSP和servlet以及返回结果给客户端,Web组件提供给客户端以运行时支持;
       b. 简单的EJB容器提供事务、EJB组件状态管理以及lookup、安全等的自动支持;

2004-10-14     星期四      晴

使用WSAD开发、调试以及测试EJB、JSP和Servlet(EJB第二天)

1.  EJB
答:1) EJB提供给服务器端以组件为基础的分布式计算的框架;
    2) EJB典型地代表一种商业处理过程,可以跨应用、跨网络。

2.  EJP角色
答:EJB规范对于EJB开发和部署定义了六种角色。每种角色在EJB开发过程中承担不同的责任:
    1) Bean provider:
       代码开发者,他负责将商业需求转化为物理代码。他提供必须的EJB、Class以及部署描述文件。
    2) Application assembler
       有点像Bean provider,或者高级的团队领导。它的职责是打包所有的EJB组件以及其它应用程序组件,最后的产品是EAR文件。
    3) Deployer
       将EAR文件部署到应用服务器
    4) Server provider
       提供EJB的服务器环境
    5) Container provider
       提供EJB的容器环境,通常和server provider一样。
    6) System administrator
       确保运行环境正确配置,程序功能正确。

3.  主要的EJB框架组件
答:这里有六种主要的EJB框架组件技术:
    1) EJB server: 
       提供给所有EJB主要的服务。包括一至多个EJB容器。通常也被称为EJS。
    2) EJB container:
       提供了EJB实例的运行环境,是服务器和EJB组件的中间层。
    3) EJB component:
       这些代表真正的EJB本身。有三种类型的企业beans:(实体Bean)entity、(会话Bean)session和(消息驱动Bean)message-driven bean。
    4) EJB interface and EJB bean:
       客户端访问的接口和EJB bean类;
    5) EJB deployment descriptor:
       定义了运行环境下,EJB的Container应该给EJB提供什么服务。Bean之外的一个文件。
    6) EJB client:
       访问EJB的客户端, 包括Servlet,其它EJB或者Java Application。

4.  EJB服务器
答:1) EJB服务器是应用程序服务器中有EJB容量的部分;
    2) 有时叫做EJS;
    3) 容器对于客户端是不可见的----没提供客户端操作容器的API,无法告之客户端企业bean被部署于哪个容器;
    4) EJB服务器提供给所有企业Java Bean公共服务的实现。EJB服务器有责任把复杂的东西隐藏。EJB规范略述了EJB服务器必须实现的七种服务:
       a. Naming(JNDI)
       b. Transaction(JTA and JTS)
       c. Security()
       d. Persistence(JDBC)
       e. Concurrency()
       f. Life cycle()
       g. Messaging(JMS)
    5) EJB容器和EJB服务器并没有清楚的分隔,EJB没有直接和EJB服务器打交道,而是通过EJB容器——它更像一个经济人,将EJB服务器的服务提供给EJB。因此,在EJB看来,EJB容器提供了这些服务。此外,规范只定义了bean和容器的合约。而没有定义容器-服务器合约。

5.  EJB容器
答:1) EJB容器是一个系统,它的功能类似于提供一个运行环境管理企业bean以及提供运行期间管理所需的主要服务。此外,作为EJB服务器提供的七种服务的中介,EJB容器也提供EJB实例的生命周期管理和EJB实例鉴定。
    2) EJB容器创建bean实例,管理实例池以及销毁它们。容器提供了部署描述符中指明的服务。例如,它将开始事务处理或较验安全。

6.  远程访问能力
答:1) 通常,EJB是远程、分布式对象,容器的主要责任之一是提供一种中介以访问这些远端对象。
    2) 远程访问使对网络组件的远程调用转为一个本地组件的调用。
    3) EJB容器使用Java RMI接口提供给EJB容器远程访问能力。

7.  主要的服务——命名
答:1) 客户端可通过在一个集中的命名空间——命名服务器——寻找bean的名字调用企业bean, 这种访问通过JNDI。当服务器启动时,容器有责任注册唯一的可寻找的名字于JNDI名址,并绑定适当的对象类型。

8.  主要的服务——事务
答:1) 一个事务被定义为必须在一起执行的一组任务:要么一起做要么一起不做。
    2) 当bean的事务被激活,EJB容器执行事务操作。EJB事务行为被描述于部署描述符中,这也被称为CMT(container-managed transactions)。因为容器管理着事务,容器可被重写而无须清楚的划分事务。

9.  主要的服务——安全
答:1) 对于企业bean, EJB容器提供了一个安全域。容器有责任使安全政策通过存取访问控制列表(ACL)在部署的时候被定义。
    2) 存取访问控制列表是一个有关用户、用户所属组以及也们的权限的一个列表。它确保用户只访问他们给定权限范围内的资源。

10. 主要的服务——持久化
答:1) 容器同样有责任管理bean的持久状态,它通过同步bean在内存中的状态于数据库中实现。

11. 主要的服务——并发访问
答:1) 并发访问是指同一个bean被二个及以上数量的客户端访问,容器根据bean类型进行并发管理。

12. 主要的服务——生命周期
答:1) 容器有责任控制部署组件的生命周期。当EJB客户端给容器发出请求,容器动态地初始化,销毁以及重用相应的bean。

13. 主要的服务——异步通讯
答:1) 容器必须提供异步通讯,特别是在客户端和消息驱动bean之间。

14. EJB组件
答:1) EJB组件指bean本身,这包括所有的类、接口以及其它。
    2) 有三种类型的企业bean:
       a. 实体bean
          . 代表商业实体或项目相关概念;
          . 一个企业bean对应一个table;
          . 一个实例对应table中一行;
          . bean中实例变量对应于table中字段。
       b. 会话bean
          对应于商业任务,完成一系列活动;
       c. 消息驱动bean
          完成一定的商业活动,通过异步通讯去监听动作。

15. 同步调用和异步调用
答:1) 同步调用:等待被调用的对象执行完成后才执行下一个调用;
    2) 异步调用: 对其它对象的调用无须等待,调用集中处理;

16. EJB接口和EJB bean
答:一个EJB组件由以下主要的元素组成:
    1) EJB组件(本地或远端)接口: 通过组件接口可以访问组件方法;
    2) EJB home接口:管理bean的生命周期;
    3) EJB bean 类:包括了所有真实的商业逻辑,提供了所有商业逻辑实现;
    4) 主键类

17. EJB组件接口
答:1) 客户端通过组件接口获得bean的访问能力。它定义了客户端可见的商业方法;
    2) 在bean class中必须有组件接口中对应的商业方法;
    3) 消息驱动bean没有组件接口,因为它不会被客户端调用;
    4) 客户端访问组件接口,容器获得请求,然后将请求转至具体bean;
    5) 有两种类型的组件接口:本地和远端。一个特定的用户自定组件接口也许只实现其中一种类型。

                                java.rmi.Remote
                                       ↑
                                       |
    javax.ejb.EJBLocalObject  javax.ejb.EJBObject(组件接口)
               ↑                      ↑
               |                       |
          MyBeanLocal               MyBean

2004-10-15     星期五      晴

使用WSAD开发、调试以及测试EJB、JSP和Servlet(EJB第三天)

1.  本地与远端接口
答:1) EJB中通常存在的是远端接口,这使得容器或虚拟机之外的EJB客户端能访问分布式对象;
    2) 在远端调用中,方法参数和返回对象都是通过值进行传递。两端对象序列化以及网络反复传递产生非常大的资源消耗,这降低了性能。但这样达到了位置无关。
    3) 本地接口(since EJB 2.0),为同一个虚拟机中的客户端访问EJB成为可能。
    4) 在本地调用中,方法参数通过引用传递,执行是在同一个虚拟机中,因此不存在序列化以及网络反复传递,更为高效。
    5) 假设实体bean仅被会话bean调用而没有直接被外部客户端调用,对于实体bean只提供本地接口更为有意义。

2.  商业方法定义
答:1) 作为一个bean的提供者,我们必须在我们组件接口中定义我们bean的商业方法。因为它是一个接口,我们仅需定义这个方法。
    2) bean class必须提供接口中定义方法的真实实现。

3.  EJB home接口
答:1) EJB home接口提供服务创建和查找bean的实例,这给EJB客户端提供了EJB的能力。
    2) Home接口定义了bean的生命周期方法,他提供了对bean生命周期的基本管理能力。
    3) 消息驱动bean没有home接口,因为他不直接被客户端调用。
    4) 客户端永远不会真正访问一个bean的实例,它访问的是EJBObject。
    5) EjbHome对象实现了home接口。起初,EJB容器初始化企业bean对应的EJBHome对象并在命名服务器中注册这个home。
    6) EJB客户端通过JNDI访问EJBHome对象。
    7) 有两种类型的组件接口:本地和远端。

                                java.rmi.Remote
                                       ↑
                                       |
    javax.ejb.EJBLocalHome     javax.ejb.EJBHome(主接口)
               ↑                      ↑
               |                       |
        MyBeanLocalHome            MyBeanHome

4.  Home接口的方法:生命周期方法
答:1) 作为一个bean的提供者,我们必须在home接口中定义企业bean所须的生命周期方法。
    2) Create方法:在home中,返回的值是bean的组件接口。Bean可能有零到多个创建方法,这依赖于bean的类型:
       a. 没有状态的session bean必须只有一个没有参数的创建方法;
       b. 有状态的session bean至少有一个创建(有或没有参数)方法;
       c. 实体bean可能拥有零或多个创建方法。
       在创建方法时发生的行为也依赖于bean的类型, 对于实体bean, 每Create一次可理解在table中插入一行。对于session bean, Create意味着创建bean实例。
       Finder方法:只对实体bean有效, 他们是在数据库中寻找实体bean代表的持久数据。每一个实体bean的home接口必须有一个以实例主键作为参数的方法:FindByPrimaryKey()。一个finder方法返回的值是bean组件接口或一个(组件接口)集合。

5.  EJB bean class
答:1) bean class包括所有真实的企业bean的商业逻辑;
    2) bean class没有直接的客户端视图,和客户端直接打交道的是组件或home接口。因此本地或远端视图这种思路不能应用于构建这种类。
    3) 有三种不同类型的bean class: 实体bean、会话bean以及消息驱动bean。
    4) 我们必须选择一种实体Bean接口去继承,要么是实体bean、要么是会话bean以及消息驱动bean。
    5) 此外,假如我们正构建一个消息驱动bean, 我们必须也实现MessageListener接口(具体的商业逻辑编写处)。

                                       javax.ejb.EnterpriseBean
                                                 ↑
                         |ˉˉˉˉˉˉˉˉˉˉˉˉ|ˉˉˉˉˉˉˉˉˉˉˉˉ|                    
                javax.ejb.EntityBean  javax.ejb.SessionBean   javax.ejb.MessageDriverBean
                        ↑                       ↑                       ↑
                   MyEntityBean             MySessionBean          MyMessageDriverBean
                                                                          ↓
                                                                javax.jms.MessageListener

6.  实现bean class接口的回调方法
答:1) 在bean class中必须实现的方法依赖于我们选择的接口类型。这些方法不是提供给客户端控制,而是给容器以管理这些Bean。
    2) 这些方法称为容器的回调方法,是之前我们讨论的bean和容器中合约的一部分。
    3) 对于这些方法,容器没有任何的常规行为。我们必须在自己的bean class中具体实现他们。
       javax.ejb.EntityBean
       . void ejbActivate() 
       . void ejbLoad()
       . void ejbPassivate() 
       . void ejbRemove() 
       . void ejbStore() 
       . void setEntityContext(EntityContext ctx)
       . void unsetEntityContext()  
       javax.ejb.SessionBean
       . void ejbActivate() 
       . void ejbPassivate() 
       . void ejbRemove() 
       . void setSessionContext(SessionContext ctx) 
       javax.ejb.MessageDriverBean
       . void ejbRemove() 
       . void setMessageDrivenContext(MessageDrivenContext ctx) 
       javax.jms.MessageListener 
       . void onMessage(Message message) 
 
2004-10-18     星期一      晴

使用WSAD开发、调试以及测试EJB、JSP和Servlet(EJB第四天)

1.  构建bean class
答:1) 构建bean class意味着商业逻辑的实现;
    2) 作为bean的提供者,在bean class中我们必须实现所有必要的方法。有以下四种类型的方法:
       a. 实现组件接口中申明的商业方法:
          必须确信在bean class中有与组件接口中对应的方法(名称、参数个数、数量、顺序一样,抛出异常、返回类型可不同);
       b. 实现主接口(Home interface)中的生命周期方法:
          bean class必须实现定义于主接口中的生命周期方法。与组件接口中实现不同的是,方法可不完全一致:
          i.  Create方法:与定义于主接口中每个create方法对应,ejbCreate方法和ejbPostCreate方法必须存在于bean class中。在bean class创建之前,ejbCreate方法被容器调用以为bean的创建作些准备。ejbPostCreate方法在bean class创建后由容器调用。主接口中Create方法返回一个组件接口(Componet interface),bean class中ejbCreate方法返回主键(或主键的集合)。
          ii. findByPrimaryKey: 只对实体bean有效。主接口中find方法返回一个组件接口(Componet interface),bean class中find方法返回主键。
          iv. find方法:主接口中findXXX 方法对应于bean class中ejbFindXXX 方法。
          v . Home方法:主接口中Xxx 方法对应于bean class中eejbHomeXxx 方法。
       c. 实现容器的回调方法:
          bean class必须提供在其超类中定义的容器回调方法。
       d. 其他方法:
          例如message-driven bean的MessageListener接口中的onMessage()方法,以及一些自定义的方法。

2.  EJB部署描述符
答:1) 运行时bean如何被管理的有关信息并不位于先前我们讨论的接口和类中,而是位于部署描述符中。
    2) 部署描述符文件是一个XML文档,它描述了组成一个应用程序的bean的一些结构化的信息。这些信息包括bean的类型、组成接口以及扩展信息、运行时如何动作等。它描述了诸如安全、事务、命名以及容器的其他服务。
    3) 部署描述符文件是必须打包入EJB的JAR文件中的组件之一。

3.  EJB客户端
答:1) 按照先前提到的,从EJB客户端看来,所有的交互作用对象都实现了home和component接口。EJBHome接口是实现了home接口的真正对象,用于管理bean的生命周期方法(create,find,remove)。EJBObject是实现了component接口的真正对象,被客户端用于访问bean的商业方法。在部署时,这二者由容器产生。
    2) 应该记住的是我们永远不直接和EJB bean实例打交道,因为每件事都通过EJBObject和EJBHome被管理。
    3) 在分布式对象代理间存在会话,但于EJB而言,它不管这种调用是通过远端还是本地接口实现。

4.  远端与本地客户端视图
答:1) 两个不同的JVM间,EJBHome和EJBObject用于响应远端客户端的调用。这样实现了位置无关,不管是不同JVM之间还是同一个JVM都能正常工作。
    2) 同一个JVM,EJBLocalHome和EJBLocalObject用于响应客户端调用。这种情况不存在网络传输,速度更快,但达不到位置无关。

5.  客户端与EJB的交互
答:1) 通过命名服务寻找home对象:
       a. EJB的home对象绑定于命名服务器,并通过JNDI访问。我们使用java.naming.InitialContext对象,提供一个JNDI名字给它去寻找我们的home接口。这是一个和我们EJB联系的逻辑名称。代码示例:
          InitialContext ctx = new InitialContext();
          Object objHome = ctx.lookup("ejb/itso/Customer");
          //Object objHome = ctx.lookup("java:comp/env/ejb/itso/Customer");
          CustomerHome home = (CustomerHome)javax.rmi.PortableRemoteObject.narrow(objHome, CustomerHome.class);
       b. JNDI名字是一个字符串,它代表了部署时对象的名字。这个名字可以是全局的EJB命名空间元素。
       c. lookup方法返回的是一个对象,你必须进行强制转换。
    2) 使用home对象创建或查找到EJB对象
       a. 一旦得到home对象,我们可以用它去确定我们的bean。对于实体bean,我们能够查找既存的实体bean或创建一个新的bean:
          Customer customer = home.findByPrimaryKey(aKey);
          或者
          Customer customer = home.Create(aKey);
       b. key是bean的主键,它可以是一个Integer(不能是原始数据类型);
       c. 对于没有状态的session bean, 我们只能调用create方法;
       d. 调用home的这些方法将会调用服务器中真正bean实例中对应的ejbCreate和ejbPostCreate, 或者ejbFindXxxx方法。
    3) 调用bean中的商业方法
       一旦我们得到了bean的句柄,我们便可执行它的任何的商业方法。
    4) 清除Bean
       我们可以选择去清除bean。对于实体bean,这意味着从数据表中删除记录。有二种移除bean的方法:
       home.remove(customer);              //调用home接口的remove方法
       或者
       customer.remove();                  //调用EJB对象(组件接口)的remove方法
       以上方法功能相同,它们最后都最终由容器去调用真正bean实例的ejbRemove方法

6.  远程和本地接口的区别与联系
答:远程接口                           |     本地接口
    Interface extends EJBObject        |     Interface extends EJBLocalObject
    Home extends EJBHome               |     Home extends EJBLocalHome
    Remote method calls                |     More efficient local calls
    Location Independent               |     Client and EJB in the same JVM
    Parms passed by value              |     Parms passed by reference
    Remote exception thrown On methods |     Regular Java Exceptions
    Use narrow() to cast               |     Use regular Java class cast

7.  本地接口强制转换
答:1) 在本地接口中,通过使用类的强制转换访问EJBHome的代码大为简化:
       InitialContext ctx = new InitialContext();
       Object objHome = ctx.lookup("ejb/itso/Customer");
       CustomerHome home = (CustomerHome)objHome;

8.  EJB框架(远程)时序图
答:Remote      Stub          ORB           Tie            EJB         EJB           EJB
    Client                                                 Object      Container     Implementation
    |             |            
    |business_Meth(Param)      
    |------------>|            
    |             |forward(Parm)
    |             |----------->| 
    |             |            |business_Meth(Parm)
    |             |            |------------>|   
    |             |            |             |business_Meth(Parm)
    |             |            |             |------------>|
    |             |            |             |             |pre_Invoke()
    |             |            |             |             |------------>| 
    |             |            |             |             |             |callback_Methos()
    |             |            |             |             |             |------------>|
    |             |            |             |             |             |Invoke_Context()
    |             |            |             |             |             |<------------|
    |             |            |             |             |             |             |
    |             |            |             |             | business_Meth(Param)      |             
    |             |            |             |             | ------------------------->|
    |             |            |             |             |             | Invoke_Context()
    |             |            |             |             |             |<------------|
    |             |            |             |             | post_invoke()             |           
    |             |            |             |             |             |callback_Method()
    |             |            |             |             |             |------------>|           
    |             |            |             |             |             |Invoke_Context()           
    |             |            |             |             |             |<------------|
    |             |            |             |             |             |             |

9.  EJB框架(本地)时序图
答:Local      EJB_Local   EJB_Local     EJB
    Client     Object      Container     Implementation

    |business_Meth(Parm)
    |------------>|
    |             |pre_Invoke()
    |             |------------>| 
    |             |             |callback_Methos()
    |             |             |------------>|
    |             |             |Invoke_Context()
    |             |             |<------------|
    |             |             |             |
    |             | business_Meth(Param)      |             
    |             | ------------------------->|
    |             |             | Invoke_Context()
    |             |             |<------------|
    |             | post_invoke()             |           
    |             |             |callback_Method()
    |             |             |------------>|           
    |             |             |Invoke_Context()           
    |             |             |<------------|
    |             |             |             |

10. EJB类型
答:                  
                                    EJB
                                     ↑
                         |ˉˉˉˉˉˉˉˉˉˉˉˉ|
                   Synchronous               Asynchronous
                        ↑                        ↑
           |ˉˉˉˉˉˉˉˉˉˉˉˉ|        Message-Driven
        Entity                   Session
           ↑                       ↑
      |ˉˉˉˉˉ|             |ˉˉˉˉˉ|
     CMP        BMP        Stateless   Stateful

2004-10-19     星期二      晴

使用WSAD开发、调试以及测试EJB、JSP和Servlet(EJB第五天)

WSAD预览

1.  WS家族
答:1) WSSD(面向网站开发者)
       . 用于开发Web Service、Service、JSP、Servlet、XML
       . Websphere应用服务器以及基本的团队开发支持
    2) WSAD(面向应用程序开发者)
       . 拥有所有WSSD的功能
       . 用于J2EE开发以及数据库应用程序
    3) WSAD Integration Edition
       . 通过使用J2EE集成框架,增加了企业综合应用

2.  WSAD工作台
答:1) 不是一个工具,不是一个产品,也不销售;
    2) 一个便携的、统一的工具平台和集成技术;
    3) 一个开源项目的基础;
    4) 公共的,容易使用的接口;
    5) 对于所有的工具具有同样的感官.

3.  WSAD术语
答:1) 透视图
       对同一个项目,依据角色提供不同的透视图。每一个透视图适合于特定的角色,提供该角色必备的工具以完成特定角色相关的工作。有Java、Web、J2EE、服务器、XML、数据透视图等。通过“Window->Preferences->Workbench->Perspective”可指定启动WSAD调用的默认透视图。
    2) 视图
       . 一个视图显示了特定的信息;
       . 一个视图可以显示于一个单个的窗格中,或几个视图能堆叠于一个具有标签的窗格;
       . 关于视图的信息更新立刻得到存储。
    3) 编辑器
       . 一个编辑器用于编辑或浏览资源;
       . 编辑器中的资源只有存盘后才能被保存。
    4) 在线帮助
       . 选择帮助菜单中“帮助->帮助菜单”;
       . 按F1键;
    5) 定义Java类的路径变量
       . 设置自己工作台时一个重要的任务是定义增加的类的路径变量。WSAD已创建了一组黙认的类的路径变量。
       . 具体设置方法“Window->Perferences->Java->Classpath Variables”

4.  Java编辑器属性
答:1) 代码格式
       工作台上的Java编辑器可根据个人喜好配置格式。修改黙认的代码格式步骤选择:Windows->Preferences->Java->Code Formatter
    2) Java编辑器首选项
       通过“Windows->Preferences->Java->Java Editor”可以修改编辑器的字体等。
    3) 组织导入
       你可以指定你希望Java编辑器处理导入语句排列的先后顺序,以及使用“*”号之前限定导定的数目。
    4) 重构
       在开发过程中,会经常碰到诸如重命名类、在不同包间移动类以及将一段代码做成一个单独方法之间的操作。重构用于描述这种变化。在传统编程环境下,这样的任务非常耗时并且容易出错。
       通过菜单“Window->Preferences->Java->Refactoring”可以指定重构工作的某些特性。
    5) 选择JRE
       通过“Windows->Preferences->Java->Installed”可以指定WSAD的JRE。
    6) 自动构建
       黙认情况下,当源文件被修改后自动被构建。当你完成一组大量的修改后没有值时,你希望手动构建。这种情况下,可以执行菜单“Windows->Preferences->Workbench”将“对资源修改执行自动构建”选项去除。
       WSAD中构建是增量式的,手动构建和重新构建将替代增量构建重新编译所有资源。

EJB项目的基本分析

1.  EJB建模
答:1) 对一个真实的应用,用例图描述了我们实际系统执行行为的轮廓。
    2) 在用例图中,用UML描绘了类和接口等。
    3) 你可以产生这些UML图形而不管是否是一个EJB应用程序。判断是否在应用程序中采用EJB是一个比设计更为架构上的行为。
    4) 当构建以及与你的EJB交互时确定最佳的行为和模式是一个设计级别的行为。
    5) 通过这种方式,设计模式将最终影响你是如何构建程序的行为。因此,EJB的设计受影响于一组设计原则。
    6) 实现商业逻辑是bean开发者的责任。

2.  何时使用实体bean?
答:1) 实体bean代表了业务中主要概念, 它们通常是我们系统中的名词。他们所代表的数据存储于持久的介质中,例如数据库。
    2) 在实体bean模型和数据库模型之间存在许多相似之处。在你系统的设计中,数据库中任何既存的东西都可以成为实体bean。
    3) 根据实际需求,我们可以选择实体bean类型为CMP或者BMP。

3.  何时使用无状态的会话bean?
答:1) 无状态的会话bean是纯粹的业务逻辑,为你的应用程序提供服务。他们能用于控制一个用户使用情形中的一系列步骤,虽然他们不记得交互过程中的任何状态。
    2) 在任何事件中,你系统中动词都是好的bean方法的侯选人。会话bean在实体bean的配合下执行持续行为要好于直接访问数据库。

4.  何时使用有状态的会话bean?
答:1) 也是处理商业方法的bean类型,但是能维护用户的会话状态。
    2) 因为他们能够记忆会话状态,他们能够提供无状态会话bean的一些额外功能。一个例子是在线购物车系统,它保存了你的订单信息,这样你能持续购物。
 
5.  何时使用消息驱动bean?
答:1) 无状态bean和消息驱动bean最主要的不同是他们被调用的方式。除此以外,对于处理纯粹的业务过程无状态bean和消息驱动bean是一样的。
    2) 值得一提的是,消息驱动bean能截取消息,然后指向一个普通的无状态bean进行处理。不同之处在于一个是同步调用,另一个是异步调用。这为你的系统提供了完整的双重服务模式。

6.  项目描述
答:1) 我们描述了一个非常简单的银行系统轮廓去帮助你理解我们的EJB建模;
    2) 我们定义了有关帐户的一些概念:客户、帐户以及交易;
    3) bank类定义了所有有关客户和帐户的行为,诸如:转帐、开户。一些行为是同步调用而另一些是异步调用。各种有关帐户的报表是需要的,并且在产生这些报表时,客户能维持一个绘话。

7.  EJB的侯选人
答:1) 实体bean:在我们系统中可能的实体bean是一些名词:客户、帐户、交易。
    2) 无状态会话bean:我们所描述的银行执行一些业务处理过程,诸如:转帐、开户。因此,银行是一个会话bean的好的侯选人,这代表了银行所能提供的服务。确信“银行”是无状态的是因为在我们例子中无须会话状态。
    3) 有状态会话bean:我们认为请求报表的处理过程可能是一个会话过程。对报表的请求处理将会是一系列的菜单,这用于一份报表。
    4) 消息驱动bean:对我们系统是否需要消息驱动bean的了解意味着对我们怎么选择并提供我们系统服务方式的了解。事实是,我们指定某些交互动作必须是异步的。我们可以允许事务被EJB客户端直接调用,或者通过发送消息不直接调用。对于后者,我们使用消息驱动Bean调用服务。

8.  银行模型
答:银行模型由一系列实体和关系组成。
    Customer: 银行的一个客户
    Account: 一个银行帐户。一个客户可能有多个帐户,一个帐户可能被多个客户拥有。一个帐户要么是核算(Checking)帐户,要么是存款(Saving)帐户。
    Checking: 一个银行帐户的子类;
    Saving: 一个银行帐户的子类;
    TransRecord: 银行交易过程中产生的交易记录。例如:存款,取消,或者二个帐户间的转帐。一个帐户可以有多个交易记录。

9.  模型关系图
答:                        Customer
                               ↑
                 relationship  | m:m
                               |         relationship
                               ↓<------------------------->TransRecord
                            Account        1:m                  ↑
                               ↑<------------------------------|  update create
                               |                                |
                      |ˉˉˉˉˉˉˉˉ|                        |
                      |   inheritance  |                  Money Transfer
                      |                |
                   Checking         Savings

10. EJB归类
答:1) 实体bean: Customer, Account, Checking, Savings, TransRecord
    2) 无状态会话bean: Banking
    3) 有状态会话bean: Reports
    4) 消息驱动bean: Transfer

11. 会话bean的facade
答:1) 一个通常的做法是使用一个facade位于保护了数据层的实体bean的前端,控制所有客户端的访问。在这种方式下,这个会话bean可将多个数据源访问集在一块作为一个单个的入口点进入业务层。这为我们系统的业务层和综合层中提供了一个清晰的分隔。
    2) 因为所有对实体bean的访问必须只在facade bean处发生,因此我们只能使用实体bean的本地端接口。这为系统提供了更高的效率。

WSAD的数据透视图

1. J2EE服务之JDBC
答:1) 提供了对多种关系型数据库的连通性,这种连通性与具体数据库无关;
    2) JDBC有点类似于ODBC,是基于X/Open SQL 调用层接口规范;
    3) 通过JDBC,你的Java应用程序或Java小应用程序可以动态地调用数据库;
    4) 在JDBC2.0中我们可以通过数据源对象访问数据源的一个连接的池子,使用连接池有下列优势:
       a. 它提高了性能。创建一个连接是费时的,而一个数据源对象一初始化就创建了一个连接池。
       b. 它简化了资源的配置。资源仅从数据源对象被配置,而不是代码中任意位置。

2.  数据源的工作步骤
答:1) 当一个Servlet或其它客户端想使用一个连接时,它从JNDI服务器上通过名称寻找一个数据源对象;
    2) Servlet或客户端向数据源对象请求一个连接;
    3) 假设数据源对象没有足够多的连接,它可以向数据库管理者请求更多的连接(只要没有达到最大允许的连接数);
    4) 当客户端完成了连接,它释放该连接。数据源对象然后将连接返回到更用连接池中。

3.  XMI和DDL
答:1) XML元数据交换接口(XMI)是一个对象组织标准接口,用于交换元数据信息;
    2) WSAD使用XMI格式存储数据库、表和模式的所有本地描述符。XMI文件能使用编辑器进行查看和修改;
    3) 当你导入一个即存的数据库模式,它是使用XMI格式存储的;
    4) 数据定义语言(DDL)是一种被关系统型数据库系统用于存储关于如何创建数据库对象的格式。WSAD允许你从XMI文件中产生DDL。

4.  数据透视图
答:数据透视图用于处理数据库、数据表和SQL声明,在该透视图中存在三种主要的视图:
    1) 数据库服务器视图
       显示了到数据库的活动连接并允许你创建新的连接,该视图与任何项目无关。连接可以钝化,这时没有数据库和数据表显示。通过选择连接右键菜单的“重新连接”可以重新激活连接。
    2) 数据定义视图
       显示了WSAD中当前既存的数据库模型,这些模型既包括通过数据库服务器视图导入的也包括在工作台上创建的。数据库模型存储相联系于WSAD项目,项目可以是一个简单的项目,一个有数据库访问的Web项目,或者是一个带有实体Bean的EJB项目。数据库定义视图是数据库对象的层次视图,它并没有显示这些定义是如何存储于真实的文件中。
    3) 导航视图
       在该视图中你可以看见代表数据库对象的本地描述符文件。每一个文件都有一个编辑器相联系于它。双击该文件可以打开与它所描述对象类型相适合的编辑器。这些对象类型可以是一个数据库、一个模式、或者一个数据表。

5.  使用数据库服务器视图
答:1) 你可以连接到既存的数据库并查看他们的对象。这些对象能导入WSAD并用于你的系统;
    2) 数据库服务器视图允许你过滤,显示部分模式或视图。你也可以使用数据库服务器视图产生DDL和XML模式。
    3) 重点:数据库服务器视图是只读的,在你能够编辑任何数据库项目之前,你必须将它们导入WSAD项目。

6.  创建数据库连接
答:1) 你应该为这个连接建立唯一的名字。假如需要可能要提供user ID和密码,以及你连接的数据库类型,JDBC驱动器可能用得到。对于DB2数据库有二种类型的JDBC:
    . COM.ibm.db2.jdbc.app.DB2Driver: 用于连接本地数据库或定义于本地的远端数据库;
    . COM.ibm.db2.jdbc.net.DB2Driver: 用于连接远端数据库;

7.  导入数据库
答:1) 创建一个简单的服务器项目例如Its

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值