




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
信息学院 2008级信息管理专业JAVA EE实习指导 2011实验一 JNDI应用基础知识 JNDI简介(选读)一、 什么是 JNDIJNDI(Java Naming and Directory Interface JAVA命名和目录接口),是JAVA EE的核心技术之一,实现JAVA应用程序开发提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。JNDI是命名服务的抽象机制,通过命名(Naming)将Java对象以名称的形式,绑定(binding)到一个容器环境(Context)中,通过调用容器环境(Context)的查找(lookup)方法,实现查找出该名称所绑定的Java对象的功能。在实际的项目应用中,通常是由系统程序或框加程序先将资源对象绑定到JNDI环境中,则应用程序可以从JNDI环境中查找这些资源对象。如此吃力的优势在于,应用程序可以从JNDI环境中查询出所需对象进行使用,而不用关心这个对象是如何创建出来的。这种方式极大地增强了系统的可维护性,一旦系统工作参数发生变更时,只是系统管理员一个人要关心的事情,而与所有的应用程序开发人员无关。容器环境(Context)本身也是一个Java对象,也可以通过一个名称绑定到另一个容器环境(Context)中。将一个Context对象绑定到另外一个Context对象中,则形成一种父子级联关系,多个Context对象最终可以级联成一种树状结构,树中的每个Context对象中都可以绑定若干个Java对象,如图所示。图中的每个方框分别代表一个Context对象,它们绑定的名称分别为a、b、c、d、e,其中b和c是a的子Context,d是b的子Context,e又是d的子Context。图中各方框内的每个小椭圆分别代表一个Java对象,它们均分配一个绑定的名称,分别为dog、pig、sheet等。在同一个Context不能绑定两个相同名称的Java对象,在不同的Context中可以出现同名的绑定对象。可见,Context树的级联结构与文件系统中的目录结构非常类似,Context与其中绑定的Java对象的关系也非常类似于文件系统中的目录与文件的关系。从图中可以看到,要想得到Context树中的一个Java对象,首先要得到其所在的Context对象,只要得到了一个Context对象,通过调用查询(lookup)方法来获得其中绑定的Java对象。另外,通过调用Context对象的lookup方法。也可以获得Context树中的任意一个Context对象,这只需要在lookup方法中指定相应的Context路径即可。在JNDI中不存在着“根”Context的概念,也就是说,执行JNDI操作不是从一个“根”Context对象开始,而是可以从Context树中的任意一个Context开始。无论如何,程序必须获得一个作为操作入口的Context对象后才能执行各种JNDI命名操作。为此,JNDI API中提供一个InitialContext类来创建用作JNDI命名操作的入口Context对象。Context是一个接口,Context对象实际上是Context的某个实现类的实例对象,选择这个具体的Context实现类并创建其实例对象的过程是由一个Context工厂类来完成的,这个工厂类的类名可以通过JNDI的环境属性java.naming.factory.initial指定,也可以根据Context的操作方法的url参数的Schema选择。2目录的概念与应用JNDI的目录(Directory)是指将一个对象的所有属性信息保存到一个容器环境中,不同文件系统中的目录概念。JNDI的目录(Directory)原理与JNDI的命名(Naming)原理相似,主要的区别在于目录容器环境中保存的是对象的属性信息,而不是对象本身,故目录提供的是对属性的各种操作。事实上,JNDI的目录(Directory)与命名(Naming)是结合在一起使用的,JNDI API中提供的代表目录容器环境的类为DirContext,DirContext是Context的子类,除了能完成目录相关的操作外,也能完成所有的命名(Naming)操作。DirContext是对Context的扩展,它在Context的基础上增加了对目录属性的操作功能,可以在其中绑定和查找对象的属性信息。JNDI中的目录(Directory)的结构示意图如图所示。图中的每个最外层方框分别代表一个DirContext对象,它们绑定的名称分别为a和b,b是a的子DirContext。图中各个最外层的方框内的每个小椭圆分别代表一个Java对象,而各个里层的方框分别代表一个对象的属性。从名称为a的DirContext中的内容可以看到,一个DirContext容器环境中即可以绑定对象自身,也可以绑定对象的属性信息。绑定的对象和绑定的属性是完全独立的两个事物,即使它们的绑定名称相同,它们的操作也是完全独立的。另外,一个属性可以有多个属性值,例如,dog对象的category属性就设置了两个属性值:meat和pet。从名称为b的DirContext中的内容可以看到,一个DirContext容器环境中也可以只绑定对象的属性信息,而不绑定任何对象自身。与Context的操作原理类似,JNDI API中提供了一个InitialDirContext类来创建用作JNDI命名与目录属性操作的入口DirContext对象。利用JNDI的命名与服务功能来满足企业级API对命名服务的访问,诸如EJB、JMS、JDBC 2.0以及RMI等命名服务。二、 JNDI 体系结构JNDI程序包:包名功能1javax.naming命名操作:包含用于访问命名服务的类和接口。例,定义Context接口,即执行查找时命名服务的入口点。2javax.naming.directory目录操作::扩展命名包以提供用于访问目录服务的类和接口。例,增加了新的属性类,提供代表一个目录上下文的DirContext 接口,并且定义了用于检查和更新与目录对象相关的属性的方法。 3javax.naming.event请求事件通知:当访问命名和目录服务时,为事件通知提供支持。例如,它定义了一个NamingEvent类,用于表示由命名/目录服务生成的事件,以及一个监视NamingEvents 类的, NamingListener 接口。4javax.naming.ldap提供LDAP支持:为LDAP 版本 3 扩展操作和空间提供特定的支持,而普通的javax.naming.directory 包没有提供这些支持。5javax.naming.spi允许动态插入不同实现:提供方法以动态插入对javax.naming及相关包访问命名和目录服务的支持常用的JNDI方法:void bind(String sName,Object object)绑定:实现名称同对象关联的过程void rebind(String sName,Object object)重新绑定:重新命名已绑定的对象void unbind(String sName)释放:销毁绑定关系,释放对象void lookup(String sName,Object object)查找:返回目录符合参数条件的对象void rename(String sOldName,String sNewName)重命名:修改对象绑定的名称NamingEnumeration listBinding(String sName)清单:返回绑定上下文中对象的列表NamingEnumeration list(String sName)清单:返回绑定在特定上下文中对象三、JNDI 程序主要技术(1)获得名字服务的初始环境n 设置命名服务的默认初始环境Contect ctx=new InitailContext();获得的初始环境为默认的命名服务。n 定制的命名服务初始环境假如需要改变提供JNDI服务的类(或厂商)和提供JNDI服务的命名服务器,采用:Hashtable Env=new Hashtable();Env.put(Context.INITIAL_CONTEXT_FACTORY,”com.sun.enterprise.naming.SerialInitContextFactory”);/指定提供命名服务的类名Env.put(Context.PROVIDER_URL,”localhost:1099”);/指定提供命名服务的服务器名和端口Context ctx=new InitialContext(env);Context.INITIAL_CONTEXT_FACTORY:指定JNDI服务提供程序中工厂类的名称,可以取值有:Context.INITIAL_CONTEXT_FACTORY的值名称服务提供程序工厂文件系统com.sun.jndi.fscontext.RefFSContextFactoryLDAPcom.sun.jndi.ldap.LdapCtxFactoryRMIcom.sun.jndi.rmi.registry.RegistryContextFactoryCORBAcom.sun.jndi.cosnaming.CNCtxFactoryDNScom.sun.jndi.dns.DnsContextFactory其它容器环境的参数值,可参考容器配置技术规定的相关说明。(2)绑定对象bind(String name,Object o)将对象o与字符串名字name绑定例:import javax.naming.*;public class TestJNDI public static void main(String args)try Context ctx=new InitialContext();ctx.bind(“ABC”,obj);/把ABC字符串与obj对象绑定catch(NamingException e)e.printStackTrace(); 如果名字已绑定或命名服务器没有启动,则导致NamingException异常(3)重新绑定ctx.rebind(String name,Object o);重新绑定JNDI如:ctx.rebind(“ABCD”, obj);/ 将对象obj与字符串名字ABCD绑定(4)解除绑定ctx.unbind(String name);需要确保该名字存在,否则出现NameNotFoundException 异常(5)查找已绑定的对象ctx.lookup(String name);根据字符串名字name寻找对象(6)在EJB中的应用(查找EJB HOME对象)InitialContext ic=new InitialContext();Object o=ic.lookup(“java:comp/env/ejb/Hello”);/利用JNDI名查找EJB HOMEHelloHome home=(HelloHome)PortableRemoteObject.narrow(lookup,HelloHome.class);/定位EJB /HOME对象实验环境1、 硬件要求:CPU P,256M内存以上,1G硬盘工作空间2、 操作系统: Windows2000 或 XP3、 应用软件:兼容IE6的浏览器4、 开发平台:JDK1.6 / Java EE5、 工具软件:自由选择 如Editplus、eclipse等实验目的1、 理解命名与目录服务的实现机理2、 掌握JNDI Context接口的主要方法3、 掌握JNDI应用程序的基本编程方法实验要求1、 阅读实习指导书,明确实习目的,结合参照教学内容,总结本章主要的知识点,形成概括性的知识结构2、 按照实验指导中的实验内容和实验步骤,在实习课时内独立完成规定的实验内容。3、 实验的过程与结果,需要参照实习总结部分的规定项目,进行自我总结,并提交实验报告。实验内容1、 编写利用JNDI实现命名与目录服务的程序;2、 编写利用JNDI检索DNS中,实现SMTP协议属性的S应用程序;实验步骤1、 设置和部署JNDI编译和运行环境已建的运行环境基础:SUN SDK1.6实验将以操作系统的文件系统为服务环境,因此,需要将下面两个jar实验环境的文件,部署并加载到classpath的配置中。l fscontext.jarl providerutil.jar 网址/products/jndi/downloads/index.html提供下载2、 创建实验目录 file: temptutorial这是根据实验环境com.sun.jndi.fscontext.RefFSContextFactory,所决定的。例如:源程序在c盘,则需要建立c: temptutorial目录3、 程序设计实习程序1 命名服务 实现绑定程序功能:将一个对象与一个字符串名字进行绑定。调用方法:bind( )代码如下:import javax.naming.*;import java.io.File;import java.util.Hashtable;/* * 功能:在上下文中添加一个绑定 * 用法: java Bind */class Bind public static void main(String args) / 为创建初始上下文设置环境Hashtable env = new Hashtable ( ); env.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.fscontext.RefFSContextFactory); / 指定提供命名服务的类名env.put(Context.PROVIDER_URL, file:/temp/tutorial);/ 指定提供命名服务的服务器名和端口,这里根据上面设定的com.sun.jndi.fscontext.RefFSContextFactory,/ 指定为文件系统的一个目录file:/temp/tutorial,这个目录需要实际存在。/定义绑定的字符串String str=myname; try / 创建初始化环境 Context ctx = new InitialContext(env); / 实例一个用于绑定的对象 Test bind_ = new Test(nwsuaf); / 实现一个绑定 ctx.bind(str, bind_); / 查询绑定 Object obj = ctx.lookup(str); System.out.println(nt+str+字符串名字与对象+obj+实现绑定!); / 关闭 ctx.close(); catch (NamingException e) System.out.println(绑定失败: + e); 编译程序: javac Bind.java运行程序: java Bind显示结果:myname字符串名字与对象nwsuaf实现绑定!试验:不得修改当前程序的任何内容,再编译、运行一次程序编译程序:javac Bind.java运行程序:java Bind显示结果:绑定失败: javax.naming.NameAlreadyBoundException: myname!思考:根据显示结果,分析解疑产生原因,设法修正解决。提示:应该有两种方法解决这个问题。实习程序2 命名服务 显示上下文中的映射信息程序功能:显示上下文命名服务中对象与字符串名字的绑定关系。调用方法 list( )代码如下:import javax.naming.*;import java.util.Hashtable;/* * 功能:显示上下文中字符串名字与类对象 * 用法: java List */class List public static void main(String args) / 为创建初始上下文设置环境Hashtable env = new Hashtable ( );env.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.fscontext.RefFSContextFactory);env.put(Context.PROVIDER_URL, file:/temp/tutorial);try / 创建初始化环境 Context ctx = new InitialContext(env); / 获得上下文信息列表 NamingEnumeration list = ctx.list(.); / 遍历信息列表 while (list.hasMore() NameClassPair nc = (NameClassPair)list.next();System.out.println(nc); ctx.close();/ 关闭 catch (NamingException e) System.out.println(List failed: + e); 编译程序:javac List.java运行程序:java List显示结果:.bindings: java.io.Filereport.txt: java.io.Filemyname: Test 说明上下文环境中当前存在三对捆绑的JNDI对象实习程序3 命名服务 解除绑定程序功能:销毁上下文命名服务中指定字的绑定关系。调用方法 unbind ( )代码如下:import javax.naming.*;import java.io.File;import java.util.Hashtable;/* * 功能:销毁绑定. (前提:需要销毁的绑定在上下文中存在). * 用法: java Unbind */class Unbind public static void main(String args) / 为创建初始上下文,设置环境Hashtable env = new Hashtable ( );env.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.fscontext.RefFSContextFactory);env.put(Context.PROVIDER_URL, file:/temp/tutorial);try String unbind_name = abc;/ 定义解除绑定的名字/ 创建初始化环境 Context ctx = new InitialContext(env); / 解除绑定 ctx.unbind(unbind_name); / 完成销毁绑定后,实例一个没有命名关系的对象 Object obj = null; try obj = ctx.lookup(unbind_name); / 查找已经解除绑定关系的命名字符串 catch (NameNotFoundException ne) System.out.println(unbind successful); return; System.out.println(unbind failed; object still there: + obj); ctx.close(); / 关闭上下文环境 catch (NamingException e) System.out.println(Operation failed: + e); 编译程序:javac Unbind.java运行程序:java Unbind显示结果:unbind successful 表示解除绑定映射成功unbind failed; object still there:null 表示试图解除一个没有绑定的映射关系实习程序4 目录服务 获取DNS信息程序功能:使用JNDI API中目录服务,获得指定域的DNS信息,并从中提取出域中的一台SMTP或NS服务器的名称。程序设计关键:(1)指定环境属性l env.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.dns.DnsContextFactory);l env.put(Context.PROVIDER_URL, dns: + dnsServer);(2)引入目录服务的属性查询,l DirContext ctxl InitialDirContext()代码如下:import java.util.Hashtable;import javax.naming.Context;import javax.naming.NamingEnumeration;import javax.naming.NamingException;import javax.naming.directory.Attribute;import javax.naming.directory.Attributes;import javax.naming.directory.DirContext;import javax.naming.directory.InitialDirContext;/* * 功能:在DNS目录信息中查询NS或MX. 服务 * 用法: java DNSQuery DOMain_Name */public class DNSQuery public static void main(String args) throws NamingException /*第一个参数指定要查询的域或主机名,第二个参数指定查询的DNS服务器,为了程序的简单易读性,省略了严格的参数错误检查*/if (args.length=0)System.out.println(nnt程序运行缺少参数!);System.out.println(nnt使用方法1:java DNSQuery 域名);System.out.println(例:java DNSQuery );System.out.println(n或); System.out.println(nt使用方法2:java DNSQuery 域名 DNS-ip );System.out.println(例:java DNSQuery localhost );return;String domain = args0;String dnsServer = args.length2 ? : (/ + args1); String ns_name=MX; /指定dns的记录类型,作为JNDI处理DNS属性信息的目标,可以选用的参数,建议使用MX-指邮件服务器,使用使用NS-指域名服务器 /通过环境属性指定Context的工厂类Hashtable env = new Hashtable ( );env.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.dns.DnsContextFactory);env.put(Context.PROVIDER_URL, dns: + dnsServer);DirContext ctx = new InitialDirContext(env);/分别获取包含所有属性和只包含Mx属性的Attributes对象Attributes attrsAll = ctx.getAttributes(domain);Attributes attrsMx = ctx.getAttributes(domain, new Stringns_name);/*上面的整段程序代码也可以用下面这段程序代码来替代,下面这段程序代码通过查询URL中的Schema信息来自动选择Context的工厂类*/*DirContext ctx = new InitialDirContext();Attributes attrsAll = ctx.getAttributes(dns: + dnsServer + / + domain);Attributes attrsMx = ctx.getAttributes(dns: + dnsServer + / + domain, new Stringns_name);*/System.out.println(显示域 + domain + 的Attributes对象中的信息:);System.out.println(attrsAll);System.out.println(-);System.out.println(只显示检索域 + domain + 的+ns_name+记录的Attributes对象:);System.out.println(attrsMx);System.out.println(-);System.out.println(逐一显示出Attributes对象中的各个属性:);NamingEnumeration attributes = attrsAll.getAll();while(attributes.hasMore() System.out.println(attributes.next();System.out.println(-);/直接调用get方法从attrsMx集合检索指定属性System.out.println(直接检索Attributes对象中的+ns_name+属性:);Attribute attrMx = attrsAll.get(ns_name);System.out.println(attrMx);System.out.println(-);/获取指定属性中的第一个值:System.out.println(获取+ns_name+属性中的第一个值:);String recordMx = (String)attrMx.get();System.out.println(recordMx);/从属性的第一个值中提取服务器地址System.out.println(从+ns_name+属性值中提取的服务器地址:);String smtpServer = recordMx.substring( recordMx.indexOf( ) + 1);System.out.println(smtpServer);编译程序:javac DNSQuery.java 运行实例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全新装修别墅产权转让合同
- 2025版前期物业管理服务协议要点解析及执行
- 2025厂区食堂员工餐厅运营管理与承包合同范本
- 2025版三方劳务派遣公司参与跨境电商服务合同范本
- 2025年高端化妆品包装材料采购及质量保证合同
- 2025版企业员工劳动合同续签与变更服务合同
- 2025年房地产项目开发与品牌推广合作合同
- 2025不锈钢板材回收利用合作合同模板
- 2025版综合性土石方工程居间合作协议
- 2025保洁工劳务分包合同针对大型酒店全面清洁服务
- 2024年四川公安厅招聘警务辅助人员笔试真题
- 彩钢顶翻新施工方案
- 2022标准化数据中心机房建设项目设计方案
- 预防青少年药物滥用-主题班会课件
- 建筑工程八大员岗位职责
- 消防工程全套报验资料
- 建筑模型手工课件
- 创客空间运营方案
- 酒店工程技能培训
- 向量数量积说课课件-2023-2024学年高一下学期数学人教A版(2019)必修第二册
- 血液透析护理质量指标评价标准
评论
0/150
提交评论