[转帖]J2EE技术规范-篇一about  JNDI_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3755 | 回复: 0   主题: [转帖]J2EE技术规范-篇一about  JNDI        下一篇 
ilikeorcl
注册用户
等级:中尉
经验:431
发帖:32
精华:1
注册:2012-12-17
状态:离线
发送短消息息给ilikeorcl 加好友    发送短消息息给ilikeorcl 发消息
发表于: IP:您无权察看 2012-12-21 11:07:17 | [全部帖] [楼主帖] 楼主

¡¡


学习Java,我们首先要掌握的就是十三种技术规范,我们接下来就一步一步的来学习。今天主要是讲讲JNDI

一、理解JNDI的用途:

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

二、那何时使用JNDI呢:

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

Web应用环境变量

EJBs和它们的环境变量

通过DataSources的数据库连接池

JMS目标和连接工厂

其他服务

2)不要将JNDI当作数据库使用

JNDI对象存储在内存中

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

接下来我们看一下JNDI树:


接下来我们理解理解图上的意思;我们看到Initial ContextJNDI树所有搜索的起点,那么如何重建Initial Context呢?

三、有两种途径,我们接下来一一讲解:

1)、从服务器端对象连接到JNDI

[java]view plaincopyprint?
1.   //创建一个InitialContext
2.   context ctx=new InitialContext();

//创建一个InitialContext
     context ctx=new InitialContext();

(2)、从任何一个地方连接到JNDI

创建Environment对象:

[java]view plaincopyprint?
1.   weblogic.jndi.Enviroment env=new
2.   weblogic.jndi.Enviroment();

weblogic.jndi.Enviroment env=new
    weblogic.jndi.Enviroment();

填写Environment

[java]view plaincopyprint?
1.   env.setProviderur("t3://127.0.0.1:7001");//Weblogic
2.   //Server的位置
3.   env.setSecurityPrincipal("system");//安全信息
4.   env.setSecurityCredentials("passWord");
5.   //使用Environment对象创建InitialContext
6.   context ctx=env.getInitialContext();

env.setProviderur("t3://127.0.0.1:7001");//Weblogic
//Server的位置
env.setSecurityPrincipal("system");//安全信息
env.setSecurityCredentials("passWord");
//使用Environment对象创建InitialContext
context ctx=env.getInitialContext();

创建Subcontext

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

[java]view plaincopyprint?
1.   //创建Environment对象
2.   Contextctx = env.getInitialContext();//首先必须获得存在的Subcontext或InitialContext
3.   //填写Environment
4.   Contextsubcontext = ctx.createSubcontext("newSubcontext");//在当前的Context下创建新的Subcontext
5.   subcontext.rebind("boundObject",object);//创建一个对象
6.   subcontext.close();//当结束时经常关闭访问的资源
7.   ctx.close();

//创建Environment对象
Contextctx = env.getInitialContext();//首先必须获得存在的Subcontext或InitialContext
//填写Environment
Contextsubcontext = ctx.createSubcontext("newSubcontext");//在当前的Context下创建新的Subcontext
subcontext.rebind("boundObject",object);//创建一个对象
subcontext.close();//当结束时经常关闭访问的资源
ctx.close();

其他连接到JNDI的方法:

1)使用‘Constant’Properties名和Hashtable类:

[java]view plaincopyprint?
1.   Hashtableenv = new Hashtable();
2.   env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
3.   env.put(Context.PROVIDER_URL,"t3://localhost:7001");
4.   env.put(Context.SECURITY_PRINCIPAL,"system");
5.   env.put(Context.SECURITY_CRRDENTIALS,"PassWord");
6.   Contextctx = new InitalContext(env);

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);

2)使用‘Hardcoded’名和Properties类:

[java]view plaincopyprint?
1.   Propertiesenv = new Properties();
2.   env.setProperty("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
3.   env.setProperty("java.naming.provider.url","t3://192.2.56.102:7001");
4.   env.setProperty("java.naming.security.principal","system");
5.   env.setProperty("java.naming.security.credentials","PassWrod");
6.   Contextctx = new InitialContext(env);

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);

五、一些JNDI环境属性:

jndi.properties:


(1)jndi.properties文件为所有的Initial Contexts设置默认的属性

(2)jndi.properties文件的搜索次序

A、CLASSPATH
B、$JAVA_HOME/lib/


我们看一下jndi.properties示例:

[java]view plaincopyprint?
1.   Java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
2.   Java.naming.provider.url=t3://localhost:7001
3.   Java.naming.security.principal=system
4.   Java.naming.security.credentials=password
5.   //使用这些默认值:
6.   Context ctx=new InitialContext();

Java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
Java.naming.provider.url=t3://localhost:7001
Java.naming.security.principal=system
Java.naming.security.credentials=password
//使用这些默认值:
Context ctx=new InitialContext();

六、从JNDI查找:

(1) Lookup()从JNDI树获得对象

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

[java]view plaincopyprint?
1. importjavax.naming.*;
2. try{
      3. Contextic = new Context();
      4. Objectobj;
      5. obj= ic.lookup("javax.transaction.UserTransaction");
      6. UserTransactionut = (UserTransaction)obj;
      7. ut.begin();
      8. ...
      9. ic.close();
10. }catch(NamingException e) {...}

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

七、远程绑定对象:

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

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


这两句话很重要:

a、绑定的对象是序列化到命名服务器的

b、查找的对象是序列化到客户的

我们接下来看一个Binding示例:

[java]view plaincopyprint?
1. public static Context getInitialContext()throws NamingException {
      2. Environmentenv = new Environment();
      3. env.setProviderUrl("t3://localhost:7001");
      4. env.setSecurityPrincipal("system");
      5. env.setSecurityCredentials("weblogic");
      6. Contextcontext = env.getInitialContext();
      7. returncontext;
8. }
9. Context ctx = getInitialContext(); //获得initial context
10. Bank myBank = new Bank(); //创建名为Bank的对象
11. ctx.rebind("theBank", myBank); //把对象绑定到JNDI树
12. ctx.close();

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();

还有一个Un-Binding示例:

[java]view plaincopyprint?
1. public static Context getInitialContext()throws NamingException {
      2. Environmentenv = new Environment();
      3. env.setProviderUrl("http://localhost:7001");
      4. env.setSecurityPrincipal("system");
      5. env.setSecurityCredentials("weblogic");
      6. Contextcontext = env.getInitialContext();
      7. returncontext;
8. }
9. Context ctx = getInitialContext(); //获得initial context
10. ctx.unbind("theBank"); //解除绑定到“theBank”的对象
11. ctx.close();

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();

八、可能的命名异常

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

AuthenticationException认证

CommunicationException通信

InvalidNameException无效名称

NameNotFoundException名字没有找到

NoInitialContextException没有连接initialcontext




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论