`

EJB 2.0:“本地”接口和“远程”接口

    博客分类:
  • EJB
 
阅读更多
当前的EJB 2.0规范有新的接口功能,这在原先的EJB 1.1中是没有的。学习运用这些新的功能,它们可以使你更容易地、更有效地访问EJB。

缺点是什么呢?你将牺牲位置的独立性,但有时侯,这种代价是值得的。了解何时、如何运用新的功能对编写设计良好的EJB应用程序是至关重要的。

EJB 1.1规范给EJB客户端提供了一个remote interface和一个remote home interface与EJB实例交互,得到位置的透明度。以类似的形式,EJB 2.0规范现在给EJB客户端提供了一个local interface和一个local home interface来与共享同一个JVM的EJB实例交互。

EJB remote interface(javax.ejb.EJBObject)和remote home interface(javax.ejb.EJBHome)在本质上是Java RMI接口。远程客户端运用接口和与Java RMI-IIOP兼容的参数与EJBs通讯。参数和方法的结果值在同一个容器中传递,或者跨网络传递到远程容器。

这种编程模式给EJB客户端提供了一种访问EJB组件的方法,就好像这些组件是本地的一样。然后,容器就可以透明地处理网络通讯和执行其它功能。这种方法很适合粗粒度的(coarse-grained)方法调用,其中客户端和EJBs之间的客户端通讯保持到最小限度。

相反,EJB local interface(javax.ejb.EJBLocalObject)和local home interface(javax.ejb.EJBLocalHome)不是Java RMI接口,它们是EJB 2.0的新功能。本地客户端——如其它EJBs,运用相同JVM中传递的参数直接与EJBs通讯。这种技术消除了网络潜在的问题、参数复制的问题以及需要与Java RMI-IIOP兼容的问题。也意味着,EJB客户端可以运用一个更轻量级的编程模式来访问服务。该方法很适合细粒度的(fine-grained)方法调用,因为作为EJB实例的位于同一个JVM中的EJB客户端可以用本地接口来避免不必要的费用。

引进本地客户端产生的另一个显著的变化就是类型的转换。所有的EJB实例在运用前必须转换到它们恰当的接口类型,所以,有时侯,在运用远程客户端时,要保证Java RMI-IIOP的兼容性,你必须在转换EJB实例前运用java.rmi.PortableRemoteObject.narrow()来缩小(narrow)它。

但本地客户端可以直接把EJB实例转换成local home interface类型,如下面的代码片段: InitialContext initCtx = new
InitialContext();
   ExampleLocalHome exampleLocalHome =
(ExampleLocalHome)initCtx.lookup("java:comp/
env/ejb/Example");



从local home创建了EJB实例: ExampleLocal exampleLocal =
exampleLocalHome.create();



也许EJB 2.0的最有趣、最容易被忽视的一个方面就是session和entity beans可以同时运用远程和本地接口,这就给了你很大的灵活性。运用两种接口给了潜在的bean客户端最大程度的自由,不管它们是不是在一起的。




<session>和<entity>元素描述了session和entity bean的部署属性。EJB 1.1和EJB 2.0规范定义了两个元素,<home>和<remote>。(以前的规范需要两个元素,但它们在2.0版中是可选的)。它们分别包含EJB remote home interface和remote interface的完全资格类名。

类似地,EJB 2.0规范定义了两个附加的元素,<local-home>和<local>。正如你预料的,它们包含EJB local home interface和local interface的完全资格类名。下面的代码显示了如何运用这些新元素: <ejb-jar>
   <enterprise-beans>
      <session>
         <ejb-name>...</ejb-name>
         <local-home>...</local-home>
         <local>...</local>
         <ejb-link>...</ejb-link>
         ...
      </session>
   </enterprise-beans>
   <assembly-descriptor>
...
   </assembly-descriptor>
</ejb-jar>




聪明地访问本地客户端的一个实例
本地EJB客户端的概念在如列表1所示的例子中得到了很好地阐明,其中显示了一个无状态session bean,它的local interface和它的local home interface。注意,接口不扩展java.rmi.Remote。

无状态session bean的XML部署描述如下面的代码所示,它也重点强调了<local>和<local-home>元素的运用: <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC
   '-//Sun Microsystems, Inc.//DTD Enterprise
JavaBeans 2.0//EN'
   'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
   <enterprise-beans>
      <session>
         <ejb-name>Example</ejb-name>
         <local-
home>com.acmecorp.ejb.ExampleLocalHome</
local-home>
         <local>com.acmecorp.ejb.ExampleLocal</local>
         <ejb-
class>com.acmecorp.ejb.ExampleBean</
ejb-class>
         <session-
type>Stateless</session-type>
         <transaction-
type>Container</transaction-type>
      </session>
   </enterprise-beans>
   <assembly-descriptor>
      <method-permission>
         <unchecked/>
         <method>
            <ejb-name>Example</ejb-name>
            <method-name>*</method-name>
         </method>
      </method-permission>
      <container-transaction>
         <method>
            <ejb-name>Example</ejb-name>
            <method-name>*</method-name>
         </method>
         <trans-
attribute>NotSupported</trans-attribute>
      </container-transaction>
   </assembly-descriptor>
</ejb-jar>







然后,一个本地的客户端创建并访问一个已经创建的enterprise bean的实例。下面的代码也显示了如何转换一个bean的实例,而不用先缩小它: <%@ page errorPage="/error.jsp"
import="javax.naming.*,
com.acmecorp.ejb.*"
%>
<%

   InitialContext initCtx = new InitialContext();
   ExampleLocalHome exampleLocalHome =
(ExampleLocalHome)initCtx.lookup("java:comp/env/
ejb/Example");
   ExampleLocal exampleLocal =
exampleLocalHome.create();

%>
<html>
<head>
   <title>Default</title>
   <link rel="STYLESHEET" type="text/css"
href="styles/default.css">
</head>
<body>
   <pre class="code"><%=
exampleLocal.getMessage() %></pre>
</body>
</html>




在这个例子中,本地客户端是一个JSP页面,因此是一个Web组件。(在有些情况中,当Web组件位于相同的JVM中时,它们访问EJB 2.0本地组件接口。)

最后是Web组件的部署描述: <web-app>
   <!-- EJB Reference information -->
   <ejb-local-ref>
      <ejb-ref-name>ejb/Example<
/ejb-ref-name>
      <ejb-ref-type>Session<
/ejb-ref-type>
      <local-home>com.acmecorp.ejb.ExampleLocalHome<
/local-home>
      <local>com.acmecorp.ejb.ExampleLocal<
/local>
      <ejb-link>Example</ejb-link>
   </ejb-local-ref>
</web-app>




注意用<ejb-local-ref>元素来声明本地EJB引用。通过<ejb-link>元素得到一个明显的与EJB的链接。它的值必须等于EJB XML描述符中的<ejb-name>元素。

未来会有更大的灵活性?
目前还是公开草案的EJB 2.1规范为访问无状态session beans定义了一个Web services客户端。远程客户端将以一种位置独立的方式与无状态session beans通讯,这种通讯主要运用SOAP 1.1通过HTTP进行基于XML的调用。因为XML、SOAP和HTTP是独立于语言的,所以客户端不需要是Java对象,可以是运行在不同平台上的其它类型的对象。

到那时,EJB 2.0的新功能就会更受Java开发人员的欢迎了,使他们能够创建代码,更有效地运用本地和远程接口。通过运用这些功能,并对你的设计能力进行正确的评估,你就可以创建应用程序,使它们最大限度地运用EJBs。

分享到:
评论

相关推荐

    weblogic部署EJB2.0 实现本地接口的SessionBean

    WebLogic是Oracle公司的一款企业级...总之,WebLogic部署EJB 2.0涉及编写Session Bean、本地接口、配置部署描述符和实际部署到服务器等多个步骤。理解和掌握这些概念对于开发和维护基于Java EE的企业级应用至关重要。

    EJB2.0

    EJB2.0是EJB规范的一个版本,它在1.1版的基础上进行了许多改进,旨在提高开发者的生产力,同时保持了企业级应用的可扩展性和可靠性。 EJB2.0的主要组成部分包括: 1. 会话Bean(Session Beans):它们代表客户端的...

    EJB2.0.pdf

    根据提供的文件信息“EJB2.0.pdf”,我们可以推断出这份文档主要涉及的是Enterprise JavaBeans(EJB)2.0版本的相关知识和技术细节。EJB是Java平台的一部分,用于开发分布式网络应用的企业级组件模型。下面将详细...

    websphere6 ejb2.0

    客户端可以通过远程接口(RMI或JNDI)或者本地接口来调用EJB方法。WebSphere提供了一套完整的API和服务来支持这些调用,确保了跨网络的透明性和性能。 9. **安全性**: WebSphere 6支持EJB的安全特性,如角色基础...

    EJB2.0 Entity bean(PDF)

    7. **远程接口和本地接口**:实体Bean可以提供远程接口供远程客户端调用,也可以提供本地接口供在同一应用内的其他组件调用。 8. **容器服务**:EJB容器提供诸如并发控制、持久化、事务、安全性和容错等服务,...

    ejb3.0培训教程与源码(绝对精品)

    比 EJB2.0 : 1) 省掉了Home 接口和组件接口; (了解) Home接口是用来创建和查找EJB Object 接口; 组件接口是不同类型的EJB要求实现的指定的接口; 比如: 会话Bean, 实现SessionBean, 导致 Bean类依赖容器; ...

    实战EJB 实战EJB 实战EJB

    EJB2.0引入了本地接口的概念,允许开发者使用本地接口访问EJB组件,提高性能。在这一部分,我们将学习如何使用本地接口实现CMP实体Bean。 **开发EJB2.0的CMP (EJBQL)** EJBQL (Enterprise JavaBeans Query ...

    实战EJB_cn

    EJB2.0规范引入了本地接口(Local Interface),允许在同一虚拟机内的组件直接调用EJB方法,提高了性能并简化了开发过程。 #### 八、实战EJB之七:开发EJB2.0的CMP(EJBQL) **8.1 实战EJB之七开发EJB2.0的CMP(EJBQL)*...

    Enterprise.JavaBeans.2.0

    ejb-ref用于引用远程实体Bean或会话Bean,而ejb-local-ref则用于引用本地Bean。 **ejb-link** ejb-link属性允许在部署描述符中明确指定引用的Bean实例,增强了模块化和可重用性。 **总结** Enterprise JavaBeans ...

    实战EJB

    EJB2.0引入了一系列新特性,包括本地接口、增强的安全性和事务管理、以及对XML配置的支持。本地接口的引入使得EJB组件之间的交互更加高效,减少了网络通信的开销。同时,EJB QL提供了类似SQL的查询语言,便于在实体...

    EJB3.0中文 版

    - **远程和本地接口**:同时支持远程和本地调用。 - **有状态Session Bean**: - 维护客户端会话状态。 - **生命周期**: - 无状态Bean在每个方法调用前创建新的实例。 - 有状态Bean在整个会话期间维护一个实例...

    实战EJB.pdf

    1. **定义接口**:首先定义远程接口(Remote Interface)和本地接口(Local Interface),这些接口定义了EJB组件对外提供的方法。 2. **实现组件类**:基于定义好的接口实现具体的EJB组件类,组件类需要实现接口中...

    Quartz,EJB资料

    在EJB 2.0版本中,提供了“本地”接口(Local Interface)和“远程”接口(Remote Interface)两种方式来访问EJB组件。 “本地”接口主要用于同一个Java EE应用内部的组件间通信,不需要进行网络调用,性能较高。而...

    Java EJB 经典面试题 面试时被问过几个

    EJB 2.0相比于1.1版本,引入了更丰富的接口和更多的事务管理选项,提升了组件的可移植性和可管理性。 95、EJB与Java Bean的区别: Java Bean是一种可复用的组件,它没有严格的规范,任何Java类理论上都可作为Bean。...

    EJB2.rar_ejb

    1. **远程接口(Remote Interface)**:客户端用来调用EJB的方法,它是Java RMI(Remote Method Invocation)的一部分。 2. **本地接口(Local Interface)**:仅在同一个JVM内部使用的接口,没有RMI开销。 3. **...

Global site tag (gtag.js) - Google Analytics