Mio Mi Blog

un blog de un ubuntero… para ubunteros =)

10. JNDI

Publicado por velorek en Junio 6, 2007

¿Qué es JNDI?

Es el sistema de nombrado en Java.

Un sistema de nombrado significa qué nombres están asociados con objetos y cómo se localizan los objetos basándose en sus nombres.

Cuando usamos cualquier programa o sistema, estamos nombrando un objeto u otro. Por ejemplo, cuando usamos un sistema de correo electrónico, debemos proporcionar el nombre del recipiente al que queremos enviar el correo. Para acceder a un fichero en el pc, debemos suministrar su nombre, entonces,un servicio de nombres nos permite localizar un objeto dando su nombre.

Arquitectura

JNDI es un API genérico, de tal manera que es necesario integrarlo con otros sistemas de nombres. Para ellos, la arquitectura JNDI incluye una interfaz de provision del servicio (SPI), que sirve como intermediario con otros proveedores de servicios de nombres.


Estos proveedores traducen las llamadas al API JNDI en llamadas reales sobre un servidor de nombres o directorios.

Necesitamos las clases del proveedor de servicio que hayamos elegido. Desde la versión 1.4.1 el JDK cuenta con los siguientes proveedores de servicio de nombres:

* Lightweight Directory Access Protocol (LDAP)
* DNS
* Common Object Request Broker Architecture (CORBA)
* Remote Method Invocation (RMI)

Cuando usamos como proveedor de servicios el sistema de ficheros, no necesitamos configurar el servidor, ya que el sistema de ficheros actúa como servidor.

Para bajar un proveedor de servicios pincha aquí.

Primeros Pasos con JNDI

Buscaremos un objeto,

Vamos a pedir al usuario un nombre de archivo o de directorio por teclado. La finalidad es que podamos obtener el objeto asociado. El inicio es utilizar un stream de teclado para pedir el nombre:

import java.util.*;
import javax.naming.*;
import java.io.*;

public class primeros_pasos01 {
public static void main(String[] args) {

BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));

try {

/* Pedir por teclado un nombre

System.out.print( “Indique un nombre:”);
String name = entrada.readLine();

Lo siguiente es definir una Hashtable en la que indicamos que usaremos un sistema de archivos. A continuación usamos el método lookup() para buscar el nombre. Este método devuelve el objeto asociado o produce una excepción:

/* Indicamos que el contexto tiene como proveedor de servicio el sistema de archivos (fsContext)*/

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.fscontext.RefFSContextFactory”);

Context ctx = new InitialContext(env);

/*Buscar el objeto*/

Object obj = ctx.lookup(name);

/ *Mostrar

System.out.println(“El nombre ” + name + ” esta ligado al objeto ” + obj.toString());

Evidentemente debemos manejar las excepciones:

catch ( NamingException e ) {
System.out.println( e.toString() ); }

catch ( IOException e ) {
System.out.println( e.toString() );
}

Si hemos indicado el directorio /Temporal obtenemos:

El nombre /Temporal esta ligado al objeto com.sun.jndi.fscontext.RefFSContext@15b7986

Si hemos indicado el archivo /Temporal/Presentacion.ppt obtenemos:

El nombre /Temporal/Presentacion.ppt esta ligado al objeto \Temporal\Presentacion.ppt


JNDI: acceso a propiedades de entorno (web.xml)

Ahora vamos a mostrar un servlet que usa de JNDI para acceder a propiedades definidas en el archivo web.xml. Supongamos que tenemos una serie de propiedades definidas en web.xml con la forma env-entry:

ejemplos/server
http://chunda.com
java.lang.String

El servlet en doGet() toma un contexto inicial vacio o “por defecto”, es decir, el conjunto de nombres definido en web.xml. Observar que llamamos a InitialContext() sin argumentos; esto implica pedir un contexto vacio de propiedades o, lo que es lo mismo, el contexto de nombres definido en web.xml.

Con lookup() buscamos la entrada “ejemplos/server”:


try {

contexto = new InitialContext(); /*Equivalente: new InitialContext(null).*/

/* Busca propiedad de entorno*/

servidorHttp = (String) contexto.lookup(“java:comp/env/ejemplos/server”);}
catch(NamingException e) {
resultado = new String(e.toString()); } /*Ha fallado lookup()*/

Invocar al servlet de ejemplo.

Código fuente.

Enumerar los vínculos
Podemos enumerar todos los vinculos (bindings):

NamingEnumeration bindings = contexto.listBindings(“java:comp/env/ejemplos”);
while (bindings.hasMore()) {

Binding bd = (Binding) bindings.next();
out.println( ”
” + bd.getName() + “: ” + bd.getObject() + “, ” +
bd.getObject().getClass().getName() +”");

}

Escribe un comentario

Debes ser Sesión como para publicar un comentario.