`

JNDI简单入门

    博客分类:
  • java
阅读更多

NDI就是为JAVA中命名和目录服务定义的JAVA API,是命名服务的抽象机制。在J2EE中,JNDI的目的是用来查找J2EE服务器的注册资源只要该对象在命名服务器上注册过,且你知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。这样你就可以在无需知道对象位置的情况下获取和使用对象。SUN对JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现
使用main方法做JNDI的demo时出现NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中了,于是直接new InitialContext()就搞定了。但是在单机环境下,可没有JNDI服务在运行,那就需要手动启动一个JNDI服务。在JDK 5的rt.jar中一共找到了4种SUN自带的JNDI实现:LDAP,CORBA,RMI,DNS。 
这4种JNDI要正常运行还需要底层的相应服务。一般我们没有LDAP或CORBA服务器,也就无法启动这两种JNDI服务,DNS用于查域名的,以后再研究,唯一可以在main()中启动的就是基于RMI的JNDI服务。
现在我们就可以在main()中启动基于RMI的JNDI服务并且绑一个对象到JNDI上。注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了

在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就需要自己扩展一个。其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。下面是两个使用JNDI的简单例子的代码,可以直接运行。

package com.ellen.jndi;

import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

//在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
class Person implements Remote, Serializable {
 private static final long serialVersionUID = -8592182872966400365L;

 private String name;
 private String pass;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getPass() {
  return pass;
 }

 public void setPass(String pass) {
  this.pass = pass;
 }

 public String toString() {
  return "name=" + this.getName() + "&pass=" + this.getPass();
 }

}

// 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
// 外部扩展,可以内部扩展也可以外部扩展
class RemoteDate extends Date implements Remote {
};

public class Demo {
 public static void initDate() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  // 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
  // 内部扩展,可以内部扩展也可以外部扩展
  class RemoteDate extends Date implements Remote {
  }
  ;
  ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
  ctx.close();
 }

 public static void initDate2() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  // 自己扩展,可以内部扩展也可以外部扩展
  // class RemoteDate extends Date implements Remote {
  // }
  // ;
  ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
  ctx.close();
 }

 public static void findDate() throws NamingException, RemoteException {
  // 直接使用
  InitialContext ctx = new InitialContext();
  Date startTime = (Date) ctx.lookup("java:comp/env/systemStartTime");
  System.out.println("+++++++++++++++++++++++" + startTime.toString());
  ctx.close();
 }

 public static void jndiDate() throws NamingException, RemoteException {
  // Demo.initDate();
  Demo.initDate2();
  Demo.findDate();
 }

 public static void initPerson() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  // Person person = new Person();
  // person.setName("ellen");
  // person.setPass("000727");
  ctx.bind("java:comp/env/person", new Person());
  ctx.close();
 }

 public static void initPerson2() throws NamingException, RemoteException {
  // 设置参数
  LocateRegistry.createRegistry(1099);
  System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
  System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
  InitialContext ctx = new InitialContext();
  Person person = new Person();
  person.setName("ellen");
  person.setPass("000727");
  ctx.bind("java:comp/env/person", person);
  ctx.close();
 }

 public static void findPerson() throws NamingException, RemoteException {
  // 直接使用
  InitialContext ctx = new InitialContext();
  Person person = (Person) ctx.lookup("java:comp/env/person");
  System.out.println("------" + person.toString());
  System.out.println("------" + person.getName());
  System.out.println("------" + person.getPass());
  ctx.close();
 }

 public static void jndiPerson() throws NamingException, RemoteException {
  // Demo.initPerson();
  Demo.initPerson2();
  Demo.findPerson();
 }

 public static void main(String[] args) throws NamingException, RemoteException {
  // 为什么两个jndi的例子不能同时运行
  // internal error: ObjID already in use
  // Demo.jndiDate();
  Demo.jndiPerson();
 }

}
 

分享到:
评论

相关推荐

    jndi.rar_jndi_site:www.pudn.com

    在“jndi.rar_jndi_site:www.pudn.com”这个压缩包中,包含了学习JNDI的基础材料,特别适合初学者入门。** 首先,让我们详细了解一下JNDI的核心概念和功能: 1. **命名服务**:命名服务允许我们将对象绑定到一个...

    一个EJB项目入门例程

    **EJB(Enterprise JavaBeans)**是...通过这个入门例程,你将学习到如何创建和配置EJB组件,如何在Java EE环境中部署和测试它们,以及如何编写客户端代码来调用EJB服务。这将为你进一步深入Java EE开发打下坚实基础。

    一个简单的J2EE入门系统

    【标题】"一个简单的J2EE入门系统"指的是基于Java 2 Platform, Enterprise Edition (J2EE)技术构建的基础教学项目。J2EE是Oracle公司(原Sun Microsystems)推出的企业级应用开发平台,用于构建分布式、多层的、面向...

    Seam简单入门学习教程.docx

    Seam 是一个强大的Java EE框架,它主要起到了EJB3和JSF(JavaServer Faces)...它通过注解驱动的编程模型,使得组件之间的通信变得简单,同时也保留了对传统Java EE模式的灵活性,使得在需要时依然可以使用这些模式。

    JSP快速入门教程---全十讲

    以上就是JSP快速入门教程的主要内容,包括JSP与Java的关系、JSP涉及的技术、运行环境、开发环境、Tomcat目录结构、简单的JSP实例、JSP的运行原理以及HTML表格的语法。这些基础知识构成了JSP学习的基石,为进一步深入...

    《EJB 3.0从入门到精通》

    此外,熟悉Java EE的其他组件,如JMS(Java Message Service)、JNDI(Java Naming and Directory Interface)等,也是提高开发效率的关键。 总之,《EJB 3.0从入门到精通》教程是一本全面覆盖EJB 3.0及其相关技术...

    EJB3.0入门教程 PDF

    2. **熟悉JNDI查找** - EJBs通过Java命名和目录接口(JNDI)被客户端查找和引用。 3. **异常处理** - 学习如何正确地处理和抛出EJB相关的异常。 4. **事务管理** - 了解EJB的自动事务管理机制,以及何时需要手动控制...

    jms 入门的几个小项目

    - **创建ConnectionFactory**:使用JNDI(Java Naming and Directory Interface)查找或直接实例化ConnectionFactory。 - **创建Destination**:根据项目需求,创建队列或主题。 - **创建Session**:配置事务支持...

    ibatis快速入门(仅需两天)绝对经典,值得收藏.doc

    ibatis提供了多种数据源类型,包括简单的数据库连接池(`SIMPLE`)和基于JNDI的容器数据源(`JNDI`)。开发者可根据应用环境和需求选择合适的数据源类型。 4. **SQL Map**:引用具体的SQL映射文件,这些文件包含了...

    jsp入门入门教程

    JSP 与 Java 标准版(Java SE)不同,它属于企业级Java平台(Java EE),在这个平台上,还可以找到其他组件如EJB(Enterprise JavaBeans)以及各种服务,如JNDI(Java Naming and Directory Interface)、JDBC(Java...

    java入门-txt

    ### Java入门核心知识点详解 #### 一、JDK概述与安装 **JDK**(Java Development Kit)作为Java开发的基础工具包,对于学习Java编程语言至关重要。它包含了Java运行环境(Java Runtime Environment, JRE)、Java...

    grails中文入门简介

    例如,数据源的配置既可以在环境配置中直接设置,也可以通过JNDI数据源来管理。此外,还可以配置自动数据库移植功能,它会在应用启动时根据域类(domain class)结构自动创建数据库表。 Grails的命令行工具非常强大...

    javaweb快速入门

    - **其他服务**: JNDI (Java Naming and Directory Interface)、JDBC、RMI (Remote Method Invocation)、JAA (Java Authentication and Authorization Service)、JavaMail等。 #### 二、JSP与Servlet的基本原理 - ...

    Spring基础与快速入门

    其他还有一些特点不是Spring的核心,这里只做简单陈述,如:对JDBC的封装与简化,提供事务管理功能,对O/R mapping工具(hibernate、iBATIS)的整合;提供MVC解决方案,也可以与其他web框架(Struts、JSF)进行整合...

    JAVA入门教程

    - **1.2.1 简单、安全可靠** - Java吸取了C和C++的优点,同时去除了它们的一些复杂特性,比如运算符重载和多重继承。此外,Java不支持指针,从而避免了内存非法访问的问题。 - Java具有自动内存管理机制,能够有效...

    tomcat spring jms 异步消息传递入门实例

    本教程将带你逐步了解如何利用Tomcat、Spring和JMS(Java Message Service)构建一个简单的异步消息传递入门实例。 首先,让我们来理解一下核心组件: 1. **Tomcat**:这是一个流行的开源Java Servlet容器,用于...

    Java Web快速入门——全十讲

    ### Java Web快速入门——全十讲 #### 一、Java与Web开发的融合:JavaEE标准框架 在探讨Java Web开发之前,我们首先要理解Java在Web领域的定位。Java不仅仅是一种编程语言,它还是一套完整的生态系统,适用于各种...

    spring jms tomcat 异步消息传递入门实例

    在这个"spring jms tomcat 异步消息传递入门实例"中,我们将探讨如何在Spring框架下利用JMS和Tomcat实现异步消息传递,以提高系统性能和可扩展性。 首先,理解异步消息传递的概念至关重要。在同步通信中,发送方...

Global site tag (gtag.js) - Google Analytics