分类: java 基础2012-12-02 20:05 1539人阅读 评论(14) 收藏 举报

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

一、理解JNDI的用途:

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

二、那何时使用JNDI呢:

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

Web应用环境变量

EJBs和它们的环境变量

通过DataSources的数据库连接池

JMS目标和连接工厂

其他服务

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

JNDI对象存储在内存中

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

接下来我们看一下JNDI树:

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

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

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

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

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

创建Environment对象:

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

填写Environment:

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

创建Subcontext:

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

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

其他连接到JNDI的方法:

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

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

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

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

五、一些JNDI环境属性:

jndi.properties:

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

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

A、CLASSPATH

B、$JAVA_HOME/lib/

我们看一下jndi.properties示例:

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

六、从JNDI查找:

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

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

  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) {...}

七、远程绑定对象:

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

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

这两句话很重要:

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

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

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

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

还有一个Un-Binding示例:

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

八、可能的命名异常

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

AuthenticationException认证

CommunicationException通信

InvalidNameException无效名称

NameNotFoundException名字没有找到

NoInitialContextException没有连接initialcontext

JNDI 使用的更多相关文章

  1. Java学习笔记之JNDI(六)

    JNDI 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的 ...

  2. JNDI

    这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别 网上关于这两个的 ...

  3. Tomcat7.0+的JNDI问题

    上次搭建spring+springmvc+mybatis框架时用的第三方连接池jar包,但是部署到tomcat中后访问没有问题,但是启动时报了个JNDI的错,我没用JNDI你给我报什么,fuck!把错 ...

  4. Tomcat下使用c3p0配置jndi数据源

    下载c3p0包: 下载地址:https://sourceforge.net/projects/c3p0/files/?source=navbar 解压后得到包:c3p0-0.9.2.jar,mchan ...

  5. Spring配置JNDI和通过JNDI获取DataSource

    一.SpringJNDI数据源配置信息 <bean id="dataSource" class="org.springframework.jndi.JndiObje ...

  6. 帆软报表FineReport中数据连接之Weblogic配置JNDI连接

    1. 制作报表的原理 在帆软报表FineReport设计器中先用JDBC连接到数据库,建立数据库连接,然后用SQL或者其他方法创建数据集,使用数据集制作报表,然后把建立的数据库连接从JDBC连接改成J ...

  7. 帆软报表FineReport中数据连接之Jboss配置JNDI连接

    使用sqlsever 2000数据库数据源来做实例讲解,帆软报表FineReport数据连接中Jboss配置JNDI大概的过程和WEBSPHERE以及WEBLOGIC基本相同,用JDBC连接数据库制作 ...

  8. 帆软报表FineReport中数据连接之Websphere配置JNDI连接

    以oracle9i数据源制作的模板jndi.cpt为例来说明如何在FineReport中的Websphere配置JNDI连接.由于常用服务器的JNDI驱动过大,帆软报表FineReport中没有自带, ...

  9. 帆软报表FineReport中数据连接之Tomcat配置JNDI连接

    1. 问题描述 在帆软报表FineReport中,通过JNDI方式定义数据连接,首先在Tomcat服务器配置好JNDI,然后在设计器中直接调用JNDI的名字,即可成功使用JNDI连接,连接步骤如下: ...

  10. mysql连接超时与jndi数据源配置

    昨天有运营说添加活动不能用了,我就看了一下后台日志,发现访问数据库是报错: at java.lang.Thread.run(Thread.java:722) Caused by: com.mysql. ...

随机推荐

  1. 【转载】图灵AngularJS入门教程

    摘自图灵的AngularJS入门教程:http://www.ituring.com.cn/article/13471 感觉非常不错,所以推荐到首页一下! (一)Hello World! 开始学习Ang ...

  2. UNIX网络编程——sockatmark函数

    每当收到一个带外数据时,就有一个与之关联的带外标记.这是发送进程发送带外字节时该字节在发送端普通数据流中的位置.在从套接字读入期间,接收进程通过调用sockatmark函数确定是否处于带外标记. #i ...

  3. iOS 屏幕方向

    参考文章:http://www.tuicool.com/articles/e2q6zi 一般的应用,只会支持竖屏正方向一个方向,支持多个屏幕方向的应用还是比较少的. 当时也没搞明白,所以直接就设置了正 ...

  4. Git Bash+EGit在项目中配合使用最常用方法总结(根据场景使用)

    最近在项目中使用Git进行代码管理,之前一直用SVN进行管理,现在谈一谈Git在项目中如何与EGit插件配合使用,高效同步开发. 使用过SVN一段时间的人,初识Git一定感觉很别扭,发现会遇到各种各样 ...

  5. iOS开发之五:常用控件--UITextField的使用

    UITextField 是iOS开发中用的非常多的一种控件,主要是供用户输入单行信息的.下面来详细介绍UITextField. 1.常用属性 <span style="font-siz ...

  6. Get and Post(Unity3D开发之六)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=565 unity3d中的www直 ...

  7. iOS中 蓝牙2.0详解/ios蓝牙设备详解 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 整体布局如下:     程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang  ...

  8. Android开发-Listview中显示不同的视图布局

    1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...

  9. Cocos2D:塔防游戏制作之旅(十六)

    编译运行你的app,放置一些炮塔在你的地图上吧!你将看到炮塔在敌人移动如攻击范围时如何立即开始攻击,并且敌人的血条将随着攻击不断减少知道它们被人道毁灭!胜利即将来临了! 哦!Okay,这里只有少数细节 ...

  10. iOS模仿京东商城中的选择地区样式

    在ViewController文件中创建添加地址界面: @property(nonatomic,strong)UILabel *selectAreaLabel;//地区显示@property(nona ...