JNDI——J2EE规范(一)

(1)概念

Java命名和目录接口

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

(2)图解

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

(3)何时使用JNDI

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

Web应用环境变量

EJBs和它们的环境变量

通过DataSources的数据库连接池

JMS目标和连接工厂

其它服务

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

JNDI对象储存在内存中

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

(4)JNDI树

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

(5)连接到JNDI的方法

<1>不带参数

//从服务器端对象连接到JNDI
Contextctx = 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 context
Bank 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 context
ctx.unbind("theBank");   //解除绑定到“theBank”的对象
ctx.close();

(12)可能的命名异常

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

AuthenticationException认证

CommunicationException通信

InvalidNameException无效名称

NameNotFoundException名字没有找到

NoInitialContextException没有连接initialcontext

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值