V predchádzajúcich článkoch sme niekoľkokrát spomenuli výraz „previazanie“ (binding). Napriek tomu, že v JNDI API sa nachádza aj trieda s rovnakým názvom, oveľa častejšie sa budete stretávať s niečím, čo označujeme ako kontext (context). Kontext hrá hlavnú úlohu v celom JNDI. Je používaný na previazanie, rozviazanie a vyhľadávanie objektov, ktoré boli asociované s konkrétnym menom v prostredí JNDI.

Kontext je reprezentovaný rozhraním javax.naming.Context. Toto rozhranie poskytuje potrebné metódy na umiestnenie objektu do mennej služby a rovnako aj na jeho vyhľadanie. Nasledujúca tabuľka obsahuje zoznam najpoužívanejších metód rozhrania Context pri práci s EJB:

Návratový typ Názov metódy Popis
Object lookup(String name) Vráti objekt asociovaný s poskytnutým menom.
NamingEnumeration listBindings(String name) Vráti zoznam previazaní odpovedajúcich poskytnutému menu.
Hashtable getEnvironment() Vráti nastavenie prostredia pre daný kontext.
void close() Uzatvorí kontext.

Všetky menné služby musia mať určitý vstupný bod, ktorý považujeme za začiatok menného priestoru. Všetci klienti musia niekde začínať a tento začiatok označujeme v JNDI ako úvodný kontext. Preto prvým krokom pre klienta, ktorý chce využívať menné služby, bude vytvorenie inštancie triedy javax.naming.InitialContext, ktorá reprezentuje štartovací bod JNDI a zároveň implementuje rozhranie Context.

Na vytvorenie inštancie triedy InitialContext stačí použiť jej konštruktor. Objekt tejto triedy musí byť schopný lokalizovať a načítať premenné prostredia, o ktorých sme pojednávali v predchádzajúcej časti. Ktoré z týchto premenných sú povinné, záleží od implementácie JNDI, ktorú používate. Minimálne musíme špecifikovať tieto dve premenné:

  • java.naming.factory.initial
  • java.naming.provider.url

Aby sme boli presní, musíte uskutočniť presne tri kroky, aby ste obdržali objekt InitialContext:

  1. Vybrať si poskytovateľa mennej služby, ku ktorej chcete pristupovať.
  2. Špecifikovať všetky povinné a potrebné premenné prostredia.
  3. Zavolať konštruktor triedy InitialContext a predať mu hodnoty premenných, respektíve umožniť mu načítať tieto hodnoty z externého súboru.

Ako som spomenul, existujú minimálne dve základné premenné prostredia, ktoré musíte špecifikovať. Prvá z nich hovorí, aký typ úvodného kontextu budeme chcieť využívať. Ten závisí od konkrétnej implementácie JNDI, ale uveďme si príklad, pri ktorom ako menný priestor budeme využívať file systém:

/* Hodnota konštanty INITIAL_CONTEXT_FACTORY musí byť plne kvalifikované meno triedy, ktorá bude vytvárať úvodný kontext.*/
Context.INITIAL_CONTEXT_FACTORY =
com.sun.jndi.fscontext.RefFSContextFactory

Druhá premenná prostredia, ktorú je nutné špecifikovať, je URL poskytovateľa. V prípade použitia file systému to bude adresár, ktorý chceme, aby bol koreňovým adresárom pre celú hierarchiu. Ako sme už spomenuli, formát hodnoty tejto premennej je závislý od špecifikácie danej poskytovateľom služby. Pre súborový systém by mohol vyzerať nasledovne:

/* Napríklad tento poskytovateľ služby vyžaduje, aby pred koreňový adresár bol pridaný prefix file:/// */
Context.PROVIDER_URL=file:///c:/jndi_root/

Čo sa týka predania premenných prostredia, v tomto prípade využijeme konštruktor triedy InitialContext. URL poskytovateľa služby budeme predávať cez command line, pretože každý môže chcieť nastaviť iný koreňový adresár. Ako som už spomenul dávnejšie, umiestnenie všetkých premenných do súboru jndi.properties nie je vždy najlepšie riešenie.

ClientJNDI.java:

import javax.naming.*;
import java.util.Hashtable;
import java.util.Properties;
public class ClientJNDI {
 // Konštruktor
 public ClientJNDI(){
  super();
 }
 /* Metóda vráti objekt InitialContext s použitím premenných, ktoré jej boli predané v objekte Hashtable */
 public Context getInitialContext(Hashtable env)
                             throws NamingException{
  return new InitialContext(env) ;
 }
 public static void main(String[] args){
  // Referencia na InitialContext
  Context initCtx = null;
  // Overíme si, či nám bol predaný potrebný vstupný parameter
  if(args.length == 0){
   System.out.println(„Syntax: ClientJNDI <providerURL>“);
   System.exit(0);
  }
  // Vytvoríme inštanciu triedy ClientJNDI
  ClientJNDI client = new ClientJNDI();
  // Vytvoríme premenné prostredia pre InitialContext
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY,
          „com.sun.jndi.fscontext.RefFSContextFactory“);
  env.put(Context.PROVIDER_URL,args[0]);
  try {
   // Pokúsime sa získať InitialContext
   initCtx = client.getInitialContext(env);
   if (initCtx != null) {
    System.out.println („InitialContext created.“);
   }else{
    System.out.println („InitialContext not created.“);
   }
  }catch(NoInitialContextException ex){
   ex.printStackTrace();
  }catch( NamingException ex ){
   ex.printStackTrace();
  }finally{
   try{
    System.out.println(„Closing the InitialContext“);
    if(initCtx != null)
     initCtx.close();
   }catch(Exception ex){
    System.out.println(„InitialContext not closed.“);
   }
  }
 }
}

Predpokladajme, že ako root adresár použijete c:\jndi_root, potom spustenie programu musí byť nasledovné:

java ClientJNDI file:///c:/jndi_root/

Ak je všetko v poriadku, výstup by mal byť:

C:\>java ClientJNDI file:///c:/jndi_root/
InitialContext created.
Closing the InitialContext
C:\>

Použité triedy sú súčasťou štandardného Java 2 SE API. Toto API však neobsahuje implementáciu JNDI pre file system. Z toho dôvodu je nutné dodatočne stiahnuť potrebné jar súbory. V našom prípade potrebujete súbory fscontext.jar a providerutil.jar, obsahujúce potrebné triedy.

Java 2 SDK SE obsahuje potrebné JNDI knižnice a implementáciu pre LDAP, DNS, COS naming a RMI ako svoju integrálnu súčasť. V prípade, že potrebujete ďalšie implementácie, skúste sa pozrieť na stránku JNDI Software Downloads.

Žádný příspěvek v diskuzi

Odpovědět