jndi 小案例

JNDI就是为JAVA中命名和目录服务定义的JAVA API,是命名服务的抽象机制。在J2EE中,JNDI的目的是用来查找J2EE服务器的注册资源。只要该对象在命名服务器上注册过,且你知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。这样你就可以在无需知道对象位置的情况下获取和使用对象。SUN对JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现。

现在我们就可以在main()中启动基于RMI的JNDI服务并且绑一个对象到JNDI上。注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了

在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就需要自己扩展一个。其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问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服务。

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

}

  

时间: 2024-10-07 23:33:32

jndi 小案例的相关文章

Windows Server之浅谈SMB以及SMB小案例分享

SMB由来 服务器消息区块(英语:Server Message Block,缩写为SMB,服务器消息区块),又称网络文件共享系统(英语:Common Internet File System,缩写为CIFS),一种应用层网络传输协议,由微软开发,主要功能是使网络上的机器能够计算机文件.打印机.串行端口和通讯等资源.它也提供经认证的进程间通信机能.它主要用在装有Microsoft Windows的机器上,在这样的机器上被称为Microsoft Windows Network. SMB版本 OS W

Thinkphp 生成订单号小案例

Thinkphp 生成订单号小案例小伙伴们在日常的商城项目开发中,都会遇到订单号生成的问题,今天呢思梦PHP就带领大家去解读一下生成订单号的问题!首先,订单号我们要明确它有有3个性质:1.唯一性 2.不可推测性 3.效率性,唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复.况且满足这些条件的同时订单号还要足够的短.不知道小伙伴们在日常的项目中是否也和我一样去思考过生成订单的一些小问题,可能你也会说,这些东西不用想的那么复杂,其实呢,小编也是同意大家的看法,但是殊不知我们做程

几个数据库的小案例(一):将文本文件中的信息导入数据库的表中

从文本文件添加到数据库用户表的记录(有两个文件:frmMain.cs  SqlHelper.cs  ) //FrmMain.cs//作者:Meusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo

Java小案例(行星移动)

Java小案例 行星移动:参考:三百集 使用软件:idea2017,java 1,图片集:这里  (idea图片源放在target目录下,才能访问到),建议从小往上看... 2,定义MyFrame package my.university; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MyFrame extends Frame {

图书借阅的小案例

这个小案例,主要练习类和方法的创建与调用 void Main() { while (true) { Console.WriteLine ("请输入标题或作者"); var key = Console.ReadLine().Trim(); Library.Search(key).Dump(); Console.WriteLine ("请输入要借阅/归还的图书编号"); var id = Convert.ToInt32(Console.ReadLine()); var

Cookie小案例-----记住浏览过的商品记录

Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中很常见.这里处理请求和页面显示都是由servlet实现,主要是为了体现cookie的作用, 实现功能如下: 1,点击购买的商品后,显示到另一页面 2,记住用户浏览过的商品,并在页面时中显示 3,当浏览过的数量超过最大值限度时,最下面一个商品被挤下去 4,当浏览过的商品本身就在浏览记录中,显示列表将其从中间移到最上面 显示一打开网站的样子和显示用户的浏览记录: package cn.itcast.cookie; im

Session小案例-----简单购物车的使用

Session小案例-----简单购物车的使用 同上篇一样,这里的处理请求和页面显示同样用的都是servlet. 功能实现如下: 1,显示网站的所有商品 2,用户点击购买后,能够记住用户选择的商品 3,实现了多个会话共享一个session 4, 实现了浏览器禁用cookie后数据共享问题的处理 首页: package cn.itcast.shopping; import java.io.IOException; import java.io.PrintWriter; import java.io

Session小案例------完成用户登陆

Session小案例------完成用户登陆 在项目开发中,用户登陆功能再寻常不过啦,当用户完成用户名和密码校验后,进入主界面,需要在主界面中显示用户的信息,此时用session来记住用户是最为合适不过了. 功能实现如下: 1,完成用户登陆功能 2,在主界面记住用户 3,完成用户注销功能 用户类: package cn.itcast.login; public class User{ private String username; private String password; public

两个小案例

今天收获了两个小案例.其实对工作都很有启发,把案例和心得在这里记录下来,希望对别人也有帮助. 案例1: 测试人员在测试系统发现在系统A和系统B之间通过总线通讯,偶尔会出现timeout现象.反馈开发后,开发难以重现.根据简要分析后,认为是测试系统性能不行,拍胸脯保证在生产系统,用于系统通讯的总线不会出现这种问题.测试人员加强了性能测试强度,发现硬件提高后,的确性能测试场景中未能重现timeout.最终否决了缺陷.结果上到生产上后,timeout又出现了,而且对核心业务产生了一定影响(多亏有补救办