JNDI – Context a InitialContext objekty
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
:
- Vybrať si poskytovateľa mennej služby, ku ktorej chcete pristupovať.
- Špecifikovať všetky povinné a potrebné premenné prostredia.
- 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.
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.
Mohlo by vás také zajímat
-
Praktické rady na zabezpečení redakčního systému WordPress
27. února 2023 -
AI v programování: Jak používat GitHub Copilot (část 2)
19. února 2024 -
Jak nainstalovat šablonu ve WordPressu
23. července 2024 -
Co je to DNSSEC, jak funguje a jak si ho nastavit?
14. srpna 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024