`
suhuanzheng7784877
  • 浏览: 692960 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47305
社区版块
存档分类
最新评论

JavaEE5学习笔记02之JNDI

阅读更多

1.       JNDI的理解

我觉得JNDI就好像是肯德基,在远端提供外卖服务。客户本身看到的,也就是肯德基对外公开的仅仅是一份外卖菜单而已,您需要什么直接打个电话向服务台要就行了,至于汉堡包、薯条是怎么做的,客户不用关心。客户只需要知道怎么打电话,告诉他您的联系方式就行了。而客户拿到套餐后就分为2种情况了,这就取决于服务商——肯德基了。比如说人家服务上需要回收您剩下的废弃物用于二次循环利用(对应于有状态的SessionBean);或者如果说人家服务商不管了,给你送过去就不管了(无状态的SessionBean),您爱怎么用就怎么用,无所谓。其中网上的菜谱和您最终拿到的对象是一个对应关系。菜谱是比较抽象的,您最后拿到的却是实实在在的,为您服务的对象。

官方的说法是:JNDI(Java Naming and Directory Interface)SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。JNDI可访问的现有的目录及服务有:DNSXNamNovell目录服务、LDAP(Lightweight Directory Access Protocol轻型目录访问协议)CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMIDSML v1&v2NIS

2.       JNDI的应用

1.JavaEE中一般是利用JNDI获取应用上下文档中的数据源对象

Context ctx = new InitialContext();

DataSource ds1 = (DataSource) ctx.lookup("java:/oracle1");

其中oracle1就是应用上下文中的JNDI名称。

2.利用JNDI获得EJBSessionBean

Context context = init();

 

Hello hello = (Hello) context.lookup("HelloEAOImpl/remote-ejb.sessionBean.Hello");

 

System.out.println(hello.hello("素还真"));

JNDI获取远程的SessionBean接口之后为自己的业务服务。

3.松耦合的方式访问远程、处在应用上下文的对象

对象-绑定代码

    //环境设置

    String factory = "org.jnp.interfaces.NamingContextFactory";

    String serverURL = "jnp://127.0.0.1:1099";

    Hashtable env = new Hashtable();

    env.put(Context.INITIAL_CONTEXT_FACTORY, factory);

    env.put(Context.PROVIDER_URL, serverURL);

   

    //正式绑定

    final String testName = "testName";

    Context ctx = new InitialContext(env);

    JFrame mainWin = new JFrame("服务端控件");

    mainWin.setBounds(20,30,400,300);

    ctx.rebind(testName,mainWin);

    out.print("绑定成功");

对象-获取代码

       String factory = "org.jnp.interfaces.NamingContextFactory";

       String serverURL = "jnp://127.0.0.1:1099";

       Hashtable env = new Hashtable();

       env.put(Context.INITIAL_CONTEXT_FACTORY, factory);

       env.put(Context.PROVIDER_URL, serverURL);

 

       Context context = new InitialContext(env);

       JFrame mainWin = (JFrame) context.lookup("testName");

       //mainWin.setBounds(20,30,400,300);

       mainWin.setVisible(true);

context.close();

3.       JNDI的使用步骤

1.创建应用上下文Context(可以自己加入配置)

       String factory = "org.jnp.interfaces.NamingContextFactory";

       String serverURL = "jnp://127.0.0.1:1099";

       Hashtable env = new Hashtable();

       env.put(Context.INITIAL_CONTEXT_FACTORY, factory);

       env.put(Context.PROVIDER_URL, serverURL);

 

       Context context = new InitialContext(env);

2.调用Contextlookup方法查找自己想要的对象

JFrame mainWin = (JFrame) context.lookup("testName");

3.用查找后的对象为自己的业务提供相关的服务

mainWin.setVisible(true);

4.关闭Context

context.close();

如此一个简单的调用JNDI流程完成。

4.       JbossJNDI支持

实际上上面的代码已经体现了JBossJNDI的支持了,数据源可以通过JBOSS管理界面进行配置,在代码中利用以下代码就可以获取数据源,(此代码有重复)

           Context ctx = new InitialContext();

           DataSource ds1 = (DataSource) ctx.lookup("java:/oracle1");

还有就是绑定EJBsessionBean,上面代码也有过交代。只是EJB必须以jar的方式部署到JBoss下面,或者打进war包中,和web项目一起发布到JBoss当中。最后一个就是以一种固定的配置上下文、硬编码的方式将命名和对象捆绑起来发布到JBoss中,获取的时候也通过固定的配置获取上下文,从而获取想要的对象。

所以可以看到,一般是数据源、EJBJNDI捆绑比较多,自己做一个捆绑服务对象、获取的情况相对来说少一些,也不太友好。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics