- 浏览: 919618 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
摘要:
本文详细介绍了JNDI的架构与实现,JNDI的工作原理,并给出了具体代码,帮助读者更理解J2EE主要常用技术---JNDI.本文为系列文章的第一篇,其它相关文章会在近期推出。
名词解释
jndi是Java 命名和目录接口(Java Naming and Directory Interface,JNDI)的简称.从一开始就一直是 Java 2 平台企业版(JEE)的核心技术之一。在JMS,JMail,JDBC,EJB等技术中,就大量应用的这种技术。
为什么会有jndi
jndi诞生的理由似乎很简单。随着分布式应用的发展,远程访问对象访问成为常用的方法。虽然说通过 Socket等编程手段仍然可实现远程通信,但按照模式的理论来说,仍是有其局限性的。RMI技术,RMI-IIOP技术的产生,使远程对象的查找成为了技术焦点。JNDI技术就应运而生。JNDI技术产生后,就可方便的查找远程或是本地对象。
JNDI的架构与实现
JNDI的架构与JDBC的架构非常类似.JNDI架构提供了一组标准命名系统的API,这些API在JDK1.3之前是作为一个单独的扩展包 jndi.jar(通过这个地址下载),这个基础API构建在与SPI之上。这个API提供如下五个包
* javax.naming
* javax.naming.directory
* javax.naming.event
* javax.naming.ldap
* javax.naming.spi
在应用程序中,我们实际上只使到用以上几个包的中类.具体调用类及通信过程对用户来说是透明的.
JNDI API提供了访问不同JNDI服务的一个标准的统一的实现,其具体实现可由不同的 Service Provider来完成。前面讲的为第一层JNDI API层.
最下层为JNDI SPI API及其具体实现。
图中所列的一些SPI可从http://java.sun.com/products/jndi/downloads/index.html下载.
attachments/200810/1170337664.gif
它包括了几个增强和下面的命名/目录服务提供者:
* LDAP(Lightweight Directory Access Protocol)服务提供者
* CORBA COS(Common Object Request Broker Architecture Common Object Services)命名服务提供者
* RMI(Java Remote Method Invocation)注册服务提供者
* DNS(Domain Name System)服务提供者.
* FSSP(File System Service Provider)文件系统服务提供者
* 其它服务提供者
中间层为命名管理层。其功能应该由JNDI SPI来完成。上层为JNDI API,这个API包在Java 2 SDK 1.3及以上的版本中已经包括。
前面讲解的只是作为应用程序客户端的架构实现,其服务端是由SPI对应的公司/厂商来实现的,我们只需将服务端的相关参数传给JNDI API就可以了,具体调用过程由SPI来完成.
JNDI工作原理
下面通过一个示例程序来说明JNDI工作原理(代码为自解释).
- /*
- * Created on 2005-3-4
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
- package com.sily.jndi;
- import java.io.FileInputStream;
- import java.util.Properties;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- /**
- * @author shizy
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
- public class TestJbossJNDI {
- /**
- *
- */
- public TestJbossJNDI() {
- super();
- // TODO Auto-generated constructor stub
- }
- public static void main(String[] args) { try {
- Properties env = new Properties();
- //载入jboss的SPI相关参数,包括初始上下文工厂,服务URL,等等
- env.load(new FileInputStream("jbossJndi.properties"));
- env.list(System.out);
- //通过JNDI api 初始化上下文
- InitialContext ctx = new javax.naming.InitialContext(env);
- System.out.println("Got context");
- //create a subContext
- ctx.createSubcontext("/sylilzy");
- ctx.createSubcontext("sylilzy/sily");
- //rebind a object
- ctx.rebind("sylilzy/sily/a", "I am sily a!");
- ctx.rebind("sylilzy/sily/b", "I am sily b!");
- //lookup context
- Context ctx1=(Context)ctx.lookup("sylilzy");
- Context ctx2=(Context)ctx1.lookup("/sylilzy/sily");
- ctx2.bind("/sylilzy/g", "this is g");
- //lookup binded object
- Object o;
- o=ctx1.lookup("sily/a");
- System.out.println("get object from jndi:"+"get object from jndi:"+o);
- //rename the object
- ctx2.rename("/sylilzy/g", "g1");
- o=ctx2.lookup("g1");
- System.out.println("get object from jndi:"+"get object from jndi:"+o);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- 结 果输出如下:
- -- listing properties --
- java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
- java.naming.provider.url=jnp://localhost:1099
- java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
- Got context
- get object from jndi:I am sily a!
- get object from jndi:this is g
/* * Created on 2005-3-4 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package com.sily.jndi; import java.io.FileInputStream; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; /** * @author shizy * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class TestJbossJNDI { /** * */ public TestJbossJNDI() { super(); // TODO Auto-generated constructor stub } public static void main(String[] args) { try { Properties env = new Properties(); //载入jboss的SPI相关参数,包括初始上下文工厂,服务URL,等等 env.load(new FileInputStream("jbossJndi.properties")); env.list(System.out); //通过JNDI api 初始化上下文 InitialContext ctx = new javax.naming.InitialContext(env); System.out.println("Got context"); //create a subContext ctx.createSubcontext("/sylilzy"); ctx.createSubcontext("sylilzy/sily"); //rebind a object ctx.rebind("sylilzy/sily/a", "I am sily a!"); ctx.rebind("sylilzy/sily/b", "I am sily b!"); //lookup context Context ctx1=(Context)ctx.lookup("sylilzy"); Context ctx2=(Context)ctx1.lookup("/sylilzy/sily"); ctx2.bind("/sylilzy/g", "this is g"); //lookup binded object Object o; o=ctx1.lookup("sily/a"); System.out.println("get object from jndi:"+"get object from jndi:"+o); //rename the object ctx2.rename("/sylilzy/g", "g1"); o=ctx2.lookup("g1"); System.out.println("get object from jndi:"+"get object from jndi:"+o); } catch (Exception e) { e.printStackTrace(); } } } 结果输出如下: -- listing properties -- java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces Got context get object from jndi:I am sily a! get object from jndi:this is g
程序中jbossJndi.properties文件的内容为:
- java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
- java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
- java.naming.provider.url=jnp://localhost:1099
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=jnp://localhost:1099
注意:要正确运行示例程序,请启动jboss,并将jboss的jbossall-client.jar文件放入classpath中。
上述示例程序在jboss服务器的jndi树上建立了几个上下文,并bind了几对象,大家可通过附录中的代码或其它工具查看
查看结果为:
- -----------------------------
- /sylilzy/sily
- -----------------------------
- /sylilzy/sily/b:I am sily b!
- /sylilzy/sily/a:I am sily a!
- /sylilzy/sily/g1:this is g
- -----------------------------
- -----------------------------
----------------------------- /sylilzy/sily ----------------------------- /sylilzy/sily/b:I am sily b! /sylilzy/sily/a:I am sily a! /sylilzy/sily/g1:this is g ----------------------------- -----------------------------
上述程序中,我们的代码只涉及到了jndi API,其它细节如初始化jboss jndi的初始上下文,建立网络连接,与服务器通信,对我们来说都是透明的,另外,我们将jboss jndi的spi包中的类名作为参数传入了程序中,要访问一个远程对象,我们所做的就这么多。
下面,再提供一个例子,与上例不同,我们不需要 jboss,我们使用sun的FSSP(File System Service Provider)文件系统服务提供者.注意在这个例子中要使用到前面所说的File System Service Provider for the java Naming and Directory InterfaceTM (JNDI)相关类(下载)。
- /*
- * Created on 2005-3-1
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
- package com.sily.jndi;
- import java.io.FileInputStream;
- import java.util.Properties;
- import javax.naming.*;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- /**
- * @author shizy
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
- public class JndiTest1 {
- /**
- *
- */
- public JndiTest1() {
- super();
- // TODO Auto-generated constructor stub
- }
- public static void main(String[] args) {
- try {
- Properties env = new Properties();
- env.load(new FileInputStream("fileSystemService.properties"));
- env.put(Context.PROVIDER_URL, "file:///c:/");
- Context ctx = new InitialContext(env);
- ctx.createSubcontext("sylilzy");
- NamingEnumeration list = ctx.list("/");
- while (list.hasMore()) {
- NameClassPair nc = (NameClassPair) list.next();
- System.out.println(nc);
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
/* * Created on 2005-3-1 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package com.sily.jndi; import java.io.FileInputStream; import java.util.Properties; import javax.naming.*; import javax.naming.Context; import javax.naming.InitialContext; /** * @author shizy * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class JndiTest1 { /** * */ public JndiTest1() { super(); // TODO Auto-generated constructor stub } public static void main(String[] args) { try { Properties env = new Properties(); env.load(new FileInputStream("fileSystemService.properties")); env.put(Context.PROVIDER_URL, "file:///c:/"); Context ctx = new InitialContext(env); ctx.createSubcontext("sylilzy"); NamingEnumeration list = ctx.list("/"); while (list.hasMore()) { NameClassPair nc = (NameClassPair) list.next(); System.out.println(nc); } } catch (Exception e) { e.printStackTrace(); } } }
上例中fileSystemService.properties文件的内容为:java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory
这个例子较简单,运行后,它会列出C:\下所有的文件和目录,另外你会发现有一个新目录被创建了.本例不同于上例,它并不需要服务端,因为它访问的是文件系统.有关帮助可查阅包内的相关文档。
通过对比这两个例子,应该JNDI的工作原理有了一个大致的了解。
总结:
jndi技术体现了分布式应用的优点,同进它的产生也为分布式对象提供了统一的访问接口。由于篇幅所限,对目录的操作本文未作介绍,其它内容将在接下来的系列中讨论。要对JNDI技术作全面的了解,请参阅参考资料.要对于JNDI技术深入学习,仍有许多地方值得进一步了解,例如EJB容器所使用的 JNDI所提供的对象就有 Local和Remote之分,对于Local Object,对于不同的JVM是不可访问的;对于远程对象的访问,还涉及到Java安全机制。
附录:
查看jboss jndi内容的代码:
- //----------------------------------------
- /*
- * Created on 2005-3-4
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
- package com.sily.jndi;
- import java.io.FileInputStream;
- import java.util.Properties;
- import javax.naming.*;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- /**
- * @author shizy
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
- public class ListJbossJndi {
- /**
- *
- */
- public ListJbossJndi() {
- super();
- // TODO Auto-generated constructor stub
- }
- public static void main(String[] args) {
- try {
- Properties env = new Properties();
- env.load(new FileInputStream("jbossJndi.properties"));
- //env.list(System.out);
- Context ctx = new InitialContext(env);
- listCtx(ctx.lookup("sylilzy"));
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- static void listCtx(Object o){
- if(!(o instanceof Context))log(":"+o);
- else {
- log("\n-----------------------------");
- try {
- Context ctx=(Context)o;
- //log(ctx.getNameInNamespace()+"/:");
- NamingEnumeration list=ctx.listBindings("");
- while(list.hasMore()){
- Binding bind=(Binding)list.next();
- log("\n/"+ctx.getNameInNamespace()+"/"+bind.getName());
- listCtx(bind.getObject());
- }
- log("\n-----------------------------");
- }
- catch (NamingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- static void log(Object o){
- System.out.print(o);
- }
- }
发表评论
-
maven 在Mac OS下运行的问题总结
2014-05-16 17:24 834在maven下生成基本的项目结构。 生成eclipse项 ... -
【zz】 java函数参数类型后添加三点的用法
2012-07-02 09:48 1052今天看到一个没见过的函数参数列表test(int... a), ... -
【zz】Java编码的理解和Java加载器的理解
2012-06-08 15:59 757一,我对java中编码的理解1. 编码的产生 对电脑而言 ... -
类加载器入门级应用
2012-06-08 15:17 9311、类加载器负责加载 Ja ... -
ClassLoader详解
2012-06-08 14:23 1253Point One 将J2EE应用程序移植到W ... -
Java静态代理与动态代理
2012-05-29 10:32 945JAVA的静态代理与动态代 ... -
JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
2012-05-29 10:31 5195调用处理器InvocationHandle ... -
zz 动态反射实现AOP的简单原理
2012-05-28 17:46 904其实AOP的意思就是面向切面编程. OO注重的是我们 ... -
理解Java枚举在单例模式的应用
2012-06-05 15:50 12825.3.9 单例和枚举 按照《高效Java 第二版》中的说 ... -
Java 枚举的介绍
2012-05-23 16:50 0一、使用简单程序完成枚举的功能 例:使用简单类完成枚举操作 ... -
枚举类型的用法
2012-06-05 15:50 1436DK1.5引入了新的类型——枚举。在 Java 中它虽然算 ... -
单例模式的七种写法 (包括1.5新特性)
2012-05-23 16:18 0第一种(懒汉,线程不安全): <!--<br / ... -
重写hashCode方法的意义
2012-05-23 16:01 1652Java中的很多对象都override了equ ... -
JDK Log的设计思想
2012-05-23 14:39 1316最近在看《Agile Java》,看到日志一节,收获颇多,所以 ... -
[zz] Synchronized和Static Synchronized区别
2012-05-23 14:07 790通过分析这两个用法的分析,我们可以理解java中锁的概念。一 ... -
双精度、单精度的有效位数
2012-05-22 17:25 5118浮点数7位有效数字。(应该是单精度数) 双精度数16位有效 ... -
DecimalFormat 使用方法
2012-05-22 16:44 1031我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Ja ... -
Java Applet 无法运行的一个问题
2012-04-28 15:09 2541当你用JDK1.6开发出的新功能,在JDK1.6上re ... -
JDK1.5之中的Map相关的类
2012-04-26 10:14 1872java5的java.util包提供了大量集合类。其中最常用的 ... -
设计模式应用场景总结
2012-04-11 16:47 1276在J2EE的开发和测试中,其实不知不觉已经使用了许多设计模式。 ...
相关推荐
在IT领域,特别是Java应用服务器环境下,JBoss与MySQL数据库的集成是常见需求之一,而JNDI(Java Naming and Directory Interface)在此过程中扮演着关键角色。本文将深入解析如何在JBoss中配置MySQL的JNDI数据源,...
1.16 如何在Eclipse中调试JBoss应用 1.17 JBoss 5.0 安装与配置详解 1.18 JBOSS安装配置 1.19 Oracle,MySql,SQL server分页 1.20 Jboss下的第一个EJB程序 1.21 JNDI 1.22 JNDI配置原理详解 1.23 JSF+Seam...
【JBoss配置JNDI详解】 在Java应用服务器中,JNDI(Java Naming and Directory Interface)是一个关键组件,用于查找和绑定资源,如数据源、EJB等。JBoss,作为一款开源的企业级应用服务器,对JNDI的支持使得开发者...
在本案例中,"jboss-web.xml"、"jndi.properties"和"oracle-ds.xml"是针对EJB+JPA在JBoss应用服务器中的配置文件,它们各自承担着不同的职责。 首先,"jboss-web.xml"是JBoss特定的Web应用程序部署描述符,它是...
jboss 配置jndi数据源,deploy下配置oracle-ds.xml
**JBoss 6.0.0 M4 配置 JNDI 和 Hibernate 深度解析** JBoss 是一个开源的应用服务器,版本6.0.0 M4是它的一个里程碑版本,提供了对Java EE 5规范的支持。在这个版本中,配置JNDI(Java Naming and Directory ...
【JBoss与MySQL整合JNDI配置详解】 在Java企业级应用开发中,JBoss作为一款流行的开源应用服务器,常被用于部署和管理Java应用程序。同时,MySQL是广泛使用的开源数据库系统,两者结合能构建高性能的后端服务。本文...
在JBOSS 环境中配置JMS,在程序中可以通过JNDI 获取连接,如消息启动Bean 就可以通过JNDI获取:@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue ...
Jboss 项目部署文档是指在 Jboss 服务器上部署项目的详细步骤,包括环境变量的配置、项目打包、配置文件的修改、JNDI 的配置等。以下是 Jboss 项目部署文档的详细知识点: 一、环境变量配置 在部署 Jboss 项目之前...
《JBoss安装与JNDI配置详解》 JBoss,作为一个开源的应用服务器,广泛应用于Java EE应用程序的部署和管理。本文将详细介绍JBoss的安装过程以及JNDI(Java Naming and Directory Interface)的配置,旨在帮助开发者...
本文档提供了jboss7开发和部署的详细指导,涵盖了jboss7的下载与安装、Eclipse中配置jboss7、项目部署和JNDI获取等方面的内容,旨在帮助开发者快速上手jboss7,并将jboss4.2版本平滑地移植到jboss7。
【JBoss + MySQL + JNDI 整合详解】 在Java企业级开发中,JBoss是一个广泛应用的开源应用服务器,而MySQL是常见的关系型数据库管理系统。JNDI(Java Naming and Directory Interface)则是Java平台中用于查找和绑定...
JBOSS7提供了一个JNDI命名空间,可以在其中注册和查找EJB。 6. **事务管理** EJB3支持声明式事务管理,开发者可以通过`@TransactionAttribute`注解来指定事务的传播行为和隔离级别。 7. **安全性** JBOSS7集成了...
3. JNDI(Java Naming and Directory Interface):提供对象的命名和查找服务。 4. JMS(Java Message Service):支持异步消息传递。 5. JTA(Java Transaction API):处理分布式事务管理。 总的来说,JBoss 作为...
它提供了企业级的功能,如EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTS/JTA(Java Transaction Service / Java Transaction API)、Servlet和JSP(JavaServer Pages)、JNDI(Java Naming and ...
JNDI(Java Naming and Directory Interface)用于查找并绑定EJB的引用。 6. **readme.txt**:这个文件通常是项目说明文档,可能包含了如何运行和测试EJB的步骤,包括环境设置、配置文件修改、命令行启动等信息。 ...
这个文件允许开发者针对特定的JBoss实现进行更细致的定制,比如JNDI绑定、资源引用、缓存策略、线程池配置等。例如,如果你想自定义JNDI名称,可以在`jboss-ejb3.xml`中这样设置: ```xml <ejb-name>MyBean ...
- **jndicontext-agent-applying.properties**:同样位于`jboss-4.0.2\server\default\deploy\jms`目录下,包含了JNDI服务的连接信息。 #### 4. 修改端口号 下面详细介绍每个配置文件的具体修改步骤: ##### 4.1 ...
确保`JndiName`与你在`jboss-service.xml`中定义的JNDI名称匹配。 最后,重启JBoss服务器,使更改生效。现在,你的应用程序可以通过在代码中查找`java:jboss/datasources/OracleDS`来获取数据源,并使用JDBC API...