当前位置:七道奇文章资讯编程技术Java编程
日期:2011-01-26 02:54:00  来源:本站整理

<b>学习安闲地根究bean的Home接口</b>[Java编程]

赞助商链接



  本文“<b>学习安闲地根究bean的Home接口</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

         EJB 错误?不要慌!

  您已经在自己所钟爱的 Java 书籍中读过了关于企业 Javabean 技术的那一章,也已经操练过了简单的 HelloWorld bean,并遵守所倡议的布置历程公布了它.目前您得编写一个客户机,以便通过这个客户机来调用这个杰作.因此您写出了近似清单 1 中的代码:

  清单 1. 一个调用 bean 的非常简单的客户机

1 InitialContext ic = new InitialContext();
2 Object or = ic.lookup("ejb/HelloWorldHome");
3 if (or != null) {
4   // Narrow the return object to the Home class type
5     HelloWorldHome home =
6       (HelloWorldHome)PortableRemoteObject.narrow(or,
7         HelloWorldHome.class);
8   // Create an EJB object instance using the home interface.
9     HelloWorld hw = home.create();
10   // Invoke the method
11     System.out.Println(hw.hello());
12 }
13

  在号令行中运行这个客户机,利用手头最便利的一个 Java 安装 ―― 即利用服务器 style="COLOR: #000000" href="http://server.it168.com/" target=_blank>服务器利用的那一个.全部事情都很完善!带着成功的喜悦,您转移到第二台计算机上运行您的客户机.这回,您得到了一个可怕的错误消息.首先,您大概得到 java.lang.NoClassDefFoundError: javax/ejb/EJBObject ,然后是一大堆其他的 NoClassDefFoundError s,因为您忘掉提交一个带有必须的 stub 和 tie 的 JAR 文件,并且没有供应大概考虑到其他各种 EJB 相关的内容.不过终究,您的客户机运行到了第一行有意思的代码( InitialContext ic = new InitialContext(); ).在到达这一行时得到的非常 ―― 您几近必定会得到一个非常 ―― 将会按照您所挑选的特定 上下文 provider而有所差别.

  注释这些术语

  在我们持续往下之前,定义几个术语会很有帮忙.计算世界利用的都是一些奇特的术语、时髦的语汇和首字母缩写词,Java 技术也不例外(大概这应当是 JavaIsNoException ?).假如您碰到了上面所说的问题,那么这里面的术语大概会让您感到有些无所适从.所以让我们谈论在本文中将会碰到的术语,搞懂得它们的意思是一个好主张.

  名称空间、上下文、初始上下文和子上下文 这些术语都是有关位置的 ―― 是从客户机的角度看时 EJB 组件所在的概念性的位置.将一个 名称空间 想像为一个城镇,城镇中的商店由 EJB home接口(我们将在稍后谈论它)表示. 上下文是城镇中的一个位置. 初始上下文 是您开始时所在的位置 ―― 就像它是到城镇的道路.而 子上下文是街道名.

  home接口(home interface)和远程接口(remote interface) 企业 JavaBean 组件有三个部份.首先是 bean 代码本身.然后是 home接口,它定义了成立您自己的 EJB bean 的办法.home接口是在名称空间中公布的.当您有了home接口后,便可以调用 Create() 以从利用服务器得到远程接口.得到了远程接口后,便可以调用构成实际的 EJB 代码的办法了.

  若何将这些术语利用到您的城镇模拟中去呢?到达精确的城镇并找到精确的地址后,您需求走进商店大概按铃(调用 Create() ).这个历程关于您要去的全部商店都是一样的,不过,您所收到的呼应取决于是由谁来供应服务 ―― 比方是一位屠夫、一位面包师还是一位烛台制作者.这个呼应代表了 远程接口.每个人都是差别的并且可以要求他供应差别的东西.您必须知道与您扳谈的人(即 bean)的职业才能提出精确的问题(即调用精确的办法) ―― 向一位屠夫要一条面包可不当当.

  CosNaming、LDAP 和 JNDI Java 命名和目录接口(Java Naming and Directory Interface JNDI)供应了一个尺度接口,它指明您需求若何与名称空间交互.我们所提到的 LDAP和 CosNaming 就是 JDNI 名称空间范例.目前扩大我们的比方:JNDI 是城镇的模板,而 CosNaming 和 LDAP 是特定的城镇.它们以类似的方法操作,但是有差别的筹划.

  属性供应了一个映射

  让我们看一看若何利用全部这些元素以成功地从远程计算机上调用我们的 EJB 组件上的办法.为了让客户程序衔接到您尽心打造的 EJB 组件,需求几样东西.首先,它需求客户代码的全部 JAR 文件、普通性的 EJB 相关 JAR 文件如 J2EE.jar 以及在布置 bean 时生成的 stub 和 tie.这些文件让您的客户机可以一向到达初始上下文.

  接下来您的客户机需求的信息是一些属性的值.首先,您将需求几个 java.naming.factory.initial 的值.该属性指向一个供应初始上下文工厂的类.该属性的一个典型值是 com.sun.jndi.cosnaming.CNCtxFactory ,这也是我们在这里的几个例子中所利用的值.这个类存在于 rt.jar 中,因而它是基本 JVM 的一部份.工厂是由 CosNaming 命名服务器所利用的,但是 JVM 还包含一个 LDAP 工厂.我们在背面将会看到,差别的利用服务器供应它们自己的初始上下文工厂.

  这个类连同命名服务器 URL 和端口号的具体信息,用于生成与名称空间交互的 InitialContext 类.不过,假如没有 provider URL,那么它将衔接到 localhost 的 900 端口(大概您的上下文工厂的其他默许端口).要衔接到远程服务器,您需求有属性 java.naming.provider.url 的一个值.

  新程序员关于全部这些认为很难理解的缘由是:不管您在利用服务器本地运行任何东西,这东西普通城市听话地工作.这是由于环境照管了一切,当您要求一个 InitialContext 时,环境就会给您供应您想要的那个.但是当您将客户即转移到差别的计算机上时,就得靠自己了.您需求知道拷贝哪一个 JAR 文件,以及要做哪些设置.我知道有些人为使他们的客户机精确工作,将利用服务器上的全部 JAR 文件都拷贝到第二台计算机上!

  在默许情形下, InitialContext 工厂是在 jndi.properties 中定义的,这个工厂类有默许的服务器 URL 和端口号默许值.这个文件在类途径中(这普通意味着在本地目录)大概在您的类途径中的任何 JAR 中.差别的利用服务器大概在差别的 JAR 文件中供应它们的默许值,WebSphere Application Server 在 namingclient.jar 中储存一个默许副本.要指定您自己的默许值,只需求编辑在类途径中的第一个副本.这是配置属性的一种办法,假如贫乏号令行大概代码驱动的设置,那么客户机将利用 jndi.properties 中的值.不过,固然这大概合适于简单的设置,但是假如处理多个服务器和名称空间,那么您大概但愿一个客户一个客户地举行配置.

  这些属性是若何按照我们要利用的名称空间而利用差别的值的呢?正如前面提到的,有两种情势的 JNDI 名称空间:CosNaming 和 LDAP.此中每一个都有与之相关联的传输:辨别是 IIOP 和 LDAP.一个 LDAP 名称空间利用 LDAP 传输(您将用一个像 ldap://myldapnameserver 这样的 URL 衔接到它),而 CosNaming 利用一个 IIOP 传输(您将用一个像 iiop://mycosnamingserver 这样的 URL 衔接到它).CosNaming 的默许端口号是 900,而 LDAP 的默许端口号是 389.不过,任何给定的名称空间服务器实现利用的默许值大概是差别的.

1 package example.publisher;
2
3 import javax.naming.InitialContext;
4
5 public class Publish {
6
7     public static void main(String[] args) {
8         //
9         //This example creates a subcontext in a namespace
10         //
11         try{
12             InitialContext ic = new InitialContext();
13             ic.createSubcontext("Test");
14         }catch(Exception e){
15             System.out.println(e);
16             e.printStackTrace();
17             
18         }
19     }
20 }
21

  这个利用程序将假定为得到精确的初始上下文件所需的全部属性都是可用的.所以目前可以从号令行运行它并在运行时供应这些属性(此中 URL 要按照您的环境作调整):

1 java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
2      -Djava.naming.provider.url=iiop://mymachine:900
3        example.publisher.Publish
4

  一切正常,我们的客户会找到示例名称空间的上下文并成立名为 Test 的子上下文.您可以用名称空间浏览器确认这一点.

  目前试着在一台计算机上运行命名服务器,用同一个号令行(当然,对 URL 再次做了调整)在另一台计算机上运行清单 2 中的利用程序.它运行起来应当没有问题(您大概需求改正这个例子以改变所限定的内容,乃至删除子上下文而不是成立它,这样在第二次运行时您便可以确信它已经起过作用了).

  在利用程序中配置属性

  那么,假如不但愿在号令行中设置这些属性怎么办?还有别的一个办法.可以在程序中显式地声明这些属性.这意味着您不需求为 java 号令供应特别的选项.改变清单 2 中的代码以显式地设置所需求的属性后,它看起来与清单 3 中的代码一样:

  清单 3. 简单的 cosNaming 名称空间交互,在利用程序代码中设置属性

1 package example.publisher;
2
3 import javax.naming.InitialContext;
4
5 public class Publish {
6
7     public static void main(String[] args) {
8         //
9         //This example creates a subcontext in a namespace
10         //
11         try{
12             Properties prop = new Properties();
13             prop.setProperty("java.naming.factory.initial",
14               "com.sun.jndi.cosnaming.CNCtxFactory");
15             prop.setProperty("java.naming.provider.url",
16               "iiop://mymachine:900");
17             InitialContext ic = new InitialContext(prop);
18             ic.createSubcontext("Test");
19         }catch(Exception e){
20             System.out.println(e);
21             e.printStackTrace();
22             
23         }
24     }
25 }
26

  目前这个程序不再需求长长的号令行配置,不过要记着,以这种方法编写的利用程序硬编码了这些设置.


  以上是“<b>学习安闲地根究bean的Home接口</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .