JNDI——J2EE规范(一)

来源:互联网 发布:西安财经行知怎么样 编辑:程序博客网 时间:2024/06/10 17:39

(1)概念

Java命名和目录接口

命名和目录服务把标识符和资源关联起来

(2)图解

JNDI是用于访问不同的命名和目录服务的统一API接口

(3)何时使用JNDI

JNDI是一种查找服务,用于查找:

      Web应用环境变量

      EJBs和它们的环境变量

      通过DataSources的数据库连接池

      JMS目标和连接工厂

      其它服务

不要将JNDI当作数据库使用:

      JNDI对象储存在内存中

      访问JNDI对象与网络性能有关

(4)JNDI树

Initial Context,对象(叶子结点),Context(结点)

(5)连接到JNDI的方法

<1>不带参数

//从服务器端对象连接到JNDIContextctx = new InitialContext(); 

<2>跟Environment

weblogic.jndi.Environmentenv = new weblogic.jndi.Environment();env.setProviderurl("t3://127.0.0.1:7001");env.setSecurityPrincipal("system");env.setSecurityCredentials("PassWord");contextctx = env.getInitialContext(); 

         创建Environment对象:

         填写Environment:

         WebLogicServer的位置

         安全信息

         使用Environment对象创建InitialContext                 

创建Subcontext

创建一个用于绑定对象的新Subcontext:

Contextctx = env.getInitialContext();Contextsubcontext = ctx.createSubcontext("newSubcontext");subcontext.rebind("boundObject",object);subcontext.close();ctx.close();

         //首先必须获得存在的Subcontext或InitialContext

         //在当前的Context下创建新的Subcontext

         //绑定一个对象

         //当结束时关闭访问的资源

<3>跟Hashtable

Hashtableenv = new Hashtable();env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");env.put(Context.PROVIDER_URL,"t3://localhost:7001");env.put(Context.SECURITY_PRINCIPAL,"system");env.put(Context.SECURITY_CRRDENTIALS,"PassWord");Contextctx = new InitalContext(env); 

<4>使用Properties

Propertiesenv = new Properties();env.setProperty("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");env.setProperty("java.naming.provider.url","t3://192.2.56.102:7001");env.setProperty("java.naming.security.principal","system");env.setProperty("java.naming.security.credentials","PassWrod");Contextctx = new InitialContext(env);

(6)一些JNDI环境属性

环境属性等同的Environment方法作用java.naming.factory.initialEnvironment.setInitialContextFactory(java.lang.StringfactoryName)上下文工厂的类名。这是服务提供者给定的类名。java.naming.provider.urlEnvironment.setProviderUrl(java.lang.Stringurl)服务提供者所使用的配置信息。在这里指出网络位置信息。java.naming.security.principalEnvironment.setSecurityPrincipal(java.lang.Stringprincipal)使用服务提供者的人员身份标识java.naming.security.credentialsEnvironment.setSecurityCredenttials(java.lang.Objectcredentials)该身份的密码

 

(7)jndi.properties

jndi.properties文件为所有的InitialContexts设置默认的属性

jndi.properties文件的搜索次序:CLASSPATH,$JAVA_HOME/lib/

(8)从JNDI查找

Lookup()从JNDI树获得对象

通过lookup()返回的对象必须映射到它们合适的类型

         importjavax.naming.*;         try{                   Contextic = new Context();                   Objectobj;                   obj= ic.lookup("javax.transaction.UserTransaction");                   UserTransactionut = (UserTransaction)obj;                   ut.begin();                   ...                   ic.close();         }catch(NamingException e) {...} 

(9)远程绑定对象

绑定到远程命名服务的对象必须是序列化的

访问命名服务时,对象是采用复制机制

(绑定的对象是序列化到命名服务器的,查找的对象是序列化到客户的) 

(10)一个Binding示例

public static Context getInitialContext()throws NamingException {         Environmentenv = new Environment();         env.setProviderUrl("t3://localhost:7001");         env.setSecurityPrincipal("system");         env.setSecurityCredentials("weblogic");         Contextcontext = env.getInitialContext();         returncontext;}Context ctx = getInitialContext();   //获得initial contextBank myBank = new Bank();    //创建名为Bank的对象ctx.rebind("theBank", myBank);     //把对象绑定到JNDI树ctx.close();

(11)一个Un-Binding示例

public static Context getInitialContext()throws NamingException {         Environmentenv = new Environment();         env.setProviderUrl("http://localhost:7001");         env.setSecurityPrincipal("system");         env.setSecurityCredentials("weblogic");         Contextcontext = env.getInitialContext();         returncontext;}Context ctx = getInitialContext();   //获得initial contextctx.unbind("theBank");   //解除绑定到“theBank”的对象ctx.close();

(12)可能的命名异常

当与JNDI交互时可能发生的例外i:

         AuthenticationException认证

         CommunicationException通信

         InvalidNameException无效名称

         NameNotFoundException名字没有找到

         NoInitialContextException没有连接initialcontext

原创粉丝点击