第三讲 JNDI.ppt
第三讲第三讲 JNDI内容回顾内容回顾J2EE体系结构体系结构本课程应用环境本课程应用环境l开发工具开发工具:MyEclipsel数据库服务器:数据库服务器:MySQL 5.0l应用服务器:应用服务器:BEA Weblogic Server 9.2本讲教学本讲教学教学目标:教学目标:3.1 JNDI简介简介3.2 JNDI的体系结构的体系结构3.3 命名服务的应用编程命名服务的应用编程教学重点:教学重点:JNDI的的API;应用编程;应用编程教学难点:教学难点:创建上下文创建上下文3.1 JNDI简介简介为什么需要为什么需要JNDI?应应用用程程序序必必须须能能在在不不知知道道外外部部信信息息是是如如何何命命名名和和组组织织在在其其运运行行环环境境中中的的情情况况下下来来存存取取资资源源和和外外部部信信息息,JNDI命名上下文命名上下文和和Java语言的语言的注释注释提供了这种能力提供了这种能力JNDI和和注注释释(Annotation)是是存存取取外外部部资资源源和和信信息息的的机机制制应应用用程程序序在在运运行行环环境境中中查查找找的的资资源源(如如数数据据源源、Servlet、EJB)和和外外部部信信息息必必须须在在命命名名服服务务中中注注册册,否否则无法找到则无法找到用用一一个个有有意意义义的的文文本本名名与与对对象象关关联联。通通过过分分布布式式系系统统的的命命名名和和目目录录服服务务能能够够对对分分布布式式系系统统中中的的资资源源(文文件件、分布式对象、服务)进行方便的访问和管理分布式对象、服务)进行方便的访问和管理3.1 JNDI简介简介JNDI(Java Naming and Directory Interface)JNDI是是Java EE中中的的核核心心技技术术之之一一,它它允允许许组组件件定定位位其其他他组组件件和和资资源源,提提供供了了企企业业级级应应用用所所需需要要的的资资源源和和外外部部信信息息的的注注册册、存存储储以以及及获获取取组组件件等等功功能能,许许多多J2EE组组件的使用需要件的使用需要JNDI 的支持的支持在在JMS、JMail、JDBC、EJB等等技技术术中中,大大量量应应用用这这种技术种技术l例例如如,要要定定位位JDBC资资源源,EJB调调用用JNDI的的lookup方方法法,lookup方方法法传传递递一一个个JNDI名名称称参参数数,返返回回相相关关的的对对象象3.1.1 访问对象的基本方式访问对象的基本方式 凭借对象名称(name)与对象体(object)的绑定(binding),使用者通过上下文(context)来存取欲使用的对象 命名服务系统示例命名服务系统示例 yRMI注册表注册表 远程对象名远程对象名远程对象远程对象yDNS 主机名称主机名称IP Address202.120.144.2y文件系统文件系统 文件名或路径文件名或路径文件句柄文件句柄3.1.1 访问对象的基本方式访问对象的基本方式目录服务 目目录录服服务务是是命命名名服服务务的的扩扩充充,也也是是凭凭借借名名称称 与与对对象象 的的绑绑定定来来存存取取欲欲使使用用的的对对象象。但但允允许许对对象象拥拥有有属属性性(attributes)以以记记录录额额外外的的信信息息。于于是是,使使用用者者可可以以通通过过名名称称来来查查看看(look up)对对象象并并获获得得该该对对象象的的属属性性信信息息,或是利用或是利用属性属性作为搜寻的作为搜寻的过滤条件过滤条件(search filter)目录服务是目录服务是命名服务命名服务,命名服务命名服务不需要是目录不需要是目录服务服务 3.1.1 访问对象的基本方式访问对象的基本方式例如:电话公司的电话服务系统,记录每个单位登记的电话号码。对于单位对象,有地址等属性可利用 名字名字电话电话地址地址东华大学东华大学6779367867793678 人民北路人民北路29992999号号对对象象属性属性名名属性值属性值什么是目录?什么是目录?目目录录类类似似于于一一个个数数据据库库,它它通通常常包包含含一一些些基基于于属性属性(名名-值值结构)的描述性信息结构)的描述性信息由由于于目目录录中中的的信信息息被被读读的的频频率率比比写写的的频频率率高高许多,所以目录没有复杂的许多,所以目录没有复杂的事务事务和和回滚回滚机制机制3.1.1 访问对象的基本方式访问对象的基本方式3.1.1 访问对象的基本方式访问对象的基本方式目录与数据库的区别目录与数据库的区别(目录服务的特殊性目录服务的特殊性)检检索索功功能能强强大大,而而增增、删删、改改等等数数据据库库更更新新功功能能则则较较弱弱,更更新新只只是是简简单单的的更更改改操操作作。因因为为目目录录服服务务器器是是专专门为那些检索频率多于更新频率的数据服务而设计的门为那些检索频率多于更新频率的数据服务而设计的对对大大量量的的信信息息查查找找或或信信息息检检索索,目目录录应应该该快快速速给给出出应答应答为为提提高高性性能能和和可可靠靠性性,并并降降低低应应答答时时间间,分分布布式式的的目目录录信信息息要要在在广广阔阔的的网网络络范范围围内内进进行行复复制制。复复制制点点之之间间,暂时的不一致是难免的,只要最终能同步即可暂时的不一致是难免的,只要最终能同步即可3.1.1 访问对象的基本方式访问对象的基本方式目前使用目前使用DirectoryDirectory较著名的应用系统与架构较著名的应用系统与架构lNovell公司的公司的 NDS(Novell Directory Services)lSun公司的公司的NIS(Network Information Service)lLDAP(Lightweight Directory Access Protocol)3.1.2 JNDI基本概念基本概念名称名称l描述对象的名称字符串描述对象的名称字符串 一一个个名名称称空空间间中中所所有有的的命命名名必必须须遵遵循循相相应应的的规规则则该该名名称称空空间间的的命名惯例命名惯例,如,如DNS的命名惯例的命名惯例l类型类型l原子名字:原子名字:不可再分不可再分的名字的名字l混合名字(混合名字(Compound Name):按照按照命名约定命名约定组成的零个或多个原子名字序列组成的零个或多个原子名字序列l复合名字(复合名字(Composite Name):跨跨越越多多个个命命名名系系统统的的名名字字,由由多多个个部部分分组组成成,每每个个部部分分处处于于不不同的命名空间同的命名空间 3.1.2 JNDI基本概念基本概念绑定(binding)JNDI命名服务有一组将命名服务有一组将原子名字原子名字与与对象对象关联在一起关联在一起的绑定的绑定上下文(Context)JNDI提提供供了了一一个个命命名名上上下下文文对对象象,即即一一组组名名称称到到对对象象绑绑定定,被被绑绑定定在在一一个个上上下下文文中中的的名名称称是是对对象象的的JNDI名名称称,所所有有的的命命名名操操作作相相对对于于一一个个上上下下文文。其其状状态态是是不不同同原原子子名名字字到到对对象象的的绑绑定定集集合合,其其操操作作有有解解析析名名字字、绑绑定定名名字字、解解绑绑定定名名字字、列列举举绑绑定定名名字字、注注销销名名字字、重重新新命命名对象等名对象等3.1.2 JNDI基本概念基本概念命名系统命名系统l一一个个具具有有相相同同类类型型(有有相相同同命命名名约约定定)的的上上下下文文对对象的集合象的集合l命命名名系系统统的的主主要要功功能能是是从从名名字字映映射射到到对对象象,对对象象可可以是任何类型以是任何类型l一一个个目目录录系系统统用用于于表表现现一一个个计计算算机机环环境境中中各各种种信信息息的的特特殊殊类类型型的的对对象象。一一个个目目录录对对象象和和它它的的属属性性相相关关联,属性表现为一个标识符和一个值的集合联,属性表现为一个标识符和一个值的集合名称空间名称空间 一个一个命名命名/目录目录系统中系统中名字名字的集合的集合3.1.2 JNDI基本概念基本概念目录的属性与子上下文目录的属性与子上下文l一一个个上上下下文文内内部部可可以以具具有有另另一一个个上上下下文文,称称为为子子上上下下文文,与与文文件件系系统统中中的的目目录录非非常常相相象象,这这种种分分层层结结构构可可以更好地组织信息以更好地组织信息l子子上上下下文文仅仅在在目目录录服服务务中中有有效效,而而在在命命名名服服务务中中无无效效,因为命名服务未安排在类似分层树的结构中因为命名服务未安排在类似分层树的结构中l对对于于支支持持子子上上下下文文的的命命名名服服务务,Context类类也也提提供供创创建和销毁子上下文的方法建和销毁子上下文的方法3.1.2 JNDI基本概念基本概念为避免与为避免与JNDI名称空间中的其他企业资源的名称空间中的其他企业资源的名称冲突,并且避免可移植性问题,名称冲突,并且避免可移植性问题,J2EE应应用程序中的所有名称应该以字符串用程序中的所有名称应该以字符串java:comp/env开始开始3.2 JNDI的体系结构的体系结构JNDI包含一组包含一组API和一组和一组SPI(Service Provider Interface)Java程序通过程序通过JNDI API 存取各种存取各种naming和和directory 服务服务3.2 JNDI的体系结构的体系结构JNDI的的思思想想是是提提供供一一个个通通用用的的接接口口。底底层层的的名名字字服服务务实实现现可可以以是是各各种种类类型,型,JNDI通过通过SPI实现代码实现代码屏蔽了各种名字和目录服务实现的区别屏蔽了各种名字和目录服务实现的区别3.2.1 JNDI的包和类的包和类JNDI由由若干个若干个独立的独立的包组成包组成l基础包基础包javax.naming 从中获得从中获得JNDI核心概念核心概念的定义的定义l服务提供程序包服务提供程序包javax.naming.spil特定服务提供程序的实际实现存放在特定服务提供程序的实际实现存放在独立的独立的包中包中 javax.naming.directory javax.naming.event javax.naming.ldap3.2.1 JNDI的包和类的包和类基础包基础包javax.namingl包含命名服务的类包含命名服务的类(classes)和存取接口和存取接口(interfaces for accessing)lContext接接口口让让用用户户定定义义对对象象在在名名称称空空间间中中的的相相对对位位置置,naming服服务务以以context为为接接口口,提提供供查查看看、绑绑定定、对象更名对象更名(renaming objects)等功能等功能lInitialContext提提供供naming或或directory服服务务的的一一个个起起始始位位置置。因因为为在在JNDI的的世世界界中中没没有有绝绝对对的的root观观念念,所所有有的的动动作作都都建建立立在在context上上;有有了了起起始始位位置置,使使用用者者才才能能借助它对其借助它对其context上的对象进行存取上的对象进行存取 lNamingException api则则为为JNDI定定义义的的一一组组类类,负负责责捕捕获获(catch)所所有有发发生生在在 naming或或directory 服服务务里里的的异异常常(exceptions)3.2.1 JNDI的包和类的包和类javax.naming.directory 包包l由由 javax.naming扩扩充充而而来来,提提供供存存取取 directory服服务务的的 功功 能能 建建 立立 在在 naming 服服 务务 之之 上上,增增 加加 对对directory中中的的对对象象检检索索其其属属性性(retrieve attributes)和通过指定属性为和通过指定属性为条件条件来来搜寻搜寻(search)等功能。)等功能。l其其中中DirContext api提提供供对对象象在在directory内内context的的接接口口,与与 Context api的的运运作作方方式式类类似似,但但更更进进一一步步定定义义了了查查询询和和更更新新directory中中对对象象属属性性的的方方法法(methods)3.2.1 JNDI的包和类的包和类javax.naming.spi 让让系系统统开开发发者者为为特特定定的的naming或或 directory系系统统来来撰撰写写使使用用JNDI的的应应用用程程式式,例例如如在在 Plug-ins、Java Object Support及及 Multiple Naming Systems(Federation)等方面的应用等方面的应用3.3 命名服务的应用编程命名服务的应用编程命名服务的应用编程 类类似似于于数数据据库库编编程程,需需要要在在用用户户代代码码和和数数据据库库之之间间建建立连接立连接使用JNDIl连接对象连接对象l连接连接JDBC资源资源 l连接连接JMS资源资源l连接连接JavaMail资源资源3.3.1 连接对象连接对象步骤1.1.引入引入JNDIJNDI类类 ContextContext、InitialContextInitialContext、NamingExceptionNamingExceptionimport javax.naming.*;2.2.创建初始上下文空间创建初始上下文空间通过一个属性对象把相应的信息传递给通过一个属性对象把相应的信息传递给InitialContextInitialContext构造器构造器3.3.JNDIJNDI对象绑定对象绑定使用使用bindbind方法建立名字和对象间的映射方法建立名字和对象间的映射4.4.JNDIJNDI对象重新绑定对象重新绑定:rebind:rebind5.5.删除删除JNDIJNDI对象对象:unbind:unbind6.6.通过上下文查找对象通过上下文查找对象:lookup:lookup7.7.捕获异常捕获异常 3.3.1 连接对象连接对象创建初始上下文空间创建Context实例try ctx=new InitialContext(p);Context ctx=null;/InitialContext建立建立JNDI属性属性Properties p=new Properties();p.put(Context.INITIAL_CONTEXT_FACTORY,weblogic.jndi.WLInitialContextFactory);p.put(Context.PROVIDER_URL,t3:/localhost:7001);属性对象属性对象上下文工厂对象上下文工厂对象连接字符串连接字符串3.3.1 连接对象连接对象创建并析构一创建并析构一个子命名空间个子命名空间l在上下文空间的接口中,包含了创建并析构在上下文空间的接口中,包含了创建并析构子空间子空间(在(在file system中相当于中相当于子文件夹子文件夹)的方法。)的方法。语句为:语句为:Context result=ctx.createSubcontext(“”);ctx.destroySubcontext(“”);3.3.1 连接对象连接对象绑定对象绑定对象ljavax.naming包中的包中的Binding,此类中有,此类中有4个方法个方法lContext接口中的接口中的bind()和和rebind()方法方法 ctx.bind(String name,Object obj)ctx.rebind(String name,Object obj)ctx.unbind(String name)/JNDI对象绑定对象绑定String test=JNDI Test example;ctx.bind(name,test);3.3.1 连接对象连接对象注注意意:绑绑定定的的对对象象必必须须是是引引用用对对象象和和可可引引用用的的对对象象。如如果果是是普通类,则不能运行,而抛出如下异常普通类,则不能运行,而抛出如下异常Lookup failed:javax.naming.OperationNotSupportedException:Can only bind References or Referenceable objects 相应技术相应技术 http:/ str=welcome to you;ctx.rebind(name,str);3.3.1 连接对象连接对象查找一个对象查找一个对象l用用ctx.lookup(String name)lookup(String name)函数函数参数为对象的名字参数为对象的名字返回当前上下文中参数返回当前上下文中参数namename对应的绑定对象。返回对对应的绑定对象。返回对象类型由象类型由底层命名系统底层命名系统和对象本身关联的和对象本身关联的数据数据共同决定。共同决定。一个命名系统中可能包含多种类型的对象一个命名系统中可能包含多种类型的对象 String s=(String)ctx.lookup(name);3.3.2 连接连接JDBC资源资源(1)创建一个创建一个InitalContext对象对象(2)使使 用用 lookup方方 法法 返返 回回 一一 个个 DataSource对对 象象,调调 用用lookup方方法法时时,需需要要给给出出数数据据源源的的JNDI名名称称。JNDI名名称称必必须须与与在在deployment descriptory文文件件或或web应应用用程程序序环环境定义文件中定义一致。境定义文件中定义一致。/获得获得WebLogic Server JNDI初始上下文信息初始上下文信息 Properties properties=new Properties();properties.put(Context.INITIAL_CONTEXT_FACTORY,weblogic.jndi.WLInitialContextFactory);properties.put(Context.PROVIDER_URL,t3:/localhost:7001);ctx=new InitialContext(properties);/建立数据源对象建立数据源对象 ds=(javax.sql.DataSource)ctx.lookup(mysqlDS);3.3.3 连接连接JMS资源资源(1)创建一个创建一个InitalContext对象对象(2)使用使用lookup方法返回一个方法返回一个javax.jms.TopicConnectionFactory对对象象或或一一个个javax.jms.queueConnectionFactory对对象。象。javax.jms.Topic topic=NULL;try InitialContext nctx=new InitalContext();topic=(javax.jms.Topic)nctx.lookup(“jms/Topic”);catch(namingException ex)3.3.4 连接连接JavaMail资源资源(1)创建一个创建一个InitalContext对象对象(2)使用使用lookup方法返回一个方法返回一个javax.mail.Session对象。对象。javax.mail.Sessionsession=NULL;try InitialContext nctx=new InitalContext();session=(javax.mail.Session)nctx.lookup(“mail/MailSession”);catch(namingException ex)3.3.4 连接连接JavaMail资源资源其它服务器资源的连接方式类似其它服务器资源的连接方式类似url资源的资源的JNDI名称为名称为“url/XXX”,连接接口类的名称,连接接口类的名称为为.URL;Connector资源的资源的JNDI名称为名称为“eis/XXX”,连接接口类,连接接口类的名称为的名称为javax.resource.cci;EJB/CosNaming资源的资源的JNDI名称为名称为“ejb/XXX”,连接连接接口类的名称为宿主类名。接口类的名称为宿主类名。小结JNDI概述和体系结构JNDI包和类命名服务的应用编程实例练习练习任务:在在MyEclipseMyEclipse环境中编写连接对象程序环境中编写连接对象程序重点思考:MyEclipseMyEclipse环境配置环境配置MyEclipseMyEclipse中应用程序的创建和运行中应用程序的创建和运行 运行前后运行前后JNDIJNDI树的变化树的变化