[ protech_v2 @ 24.05.2005. 19:23 ] @
Ako imam interfejs za autentifikaciju kojeg implementiraju razlicite klase (recimo jedna za proveru preko baze, jedna preko xml fajla itd.), i ciju metodu pokrecem iz beana koji cita iz forme user/pass kako da kazem tom beanu da procita koju od tih klasa da koristi iz neke konstante?

Napravio sam klasu koja implementira ServletContextListener interfejs pa se pokrece pre JSF-a i pokrece sledecu naredbu (pratio sam uputstvo iz knjige):

servletContext.setAttribute(Constants.AUTH_INTERFACE_KEY, new AuthVsXML());

U Constants onda imam :

public String AUTH_INTERFACE_KEY = "AuthInterface";

ali ne znam kako to da iskoristim, tj. kako da u beanu kazem da koristi onu klasu koja je u tom key-u?

P.S. Izvinjavam se zbog dupliranja poruke sa JavaSvet.net foruma, ali tamo je malo tiho, cini mi se
[ me-tuzalem @ 24.05.2005. 20:11 ] @
Malo mi tvoje pitanje djeluje konfuzno, ali bi ovo moglo da bude odgovor.
Treba da imaš klasu (pročitaj nešto o Factory patternu), koja zna na osnovu nekog parametra (...ili nečeg drugog), šta se instancira.
Npr.:
Code:

class MyFactory{
public static MyInterface getInstance(int parametar){
switch(parametar){
case 0:
 return new Klasa1();
case 1:
return  new Klasa2();

....
}}}

gdje Klasa1, Klasa2 ... implementiraju MyInterface

A ako negdje koristiš imena klasa(nije mi pitanje baš najjasnije), onda treba da se obratiš ClassLoaderu, ali o tom potom, ako ti treba.
[ protech_v2 @ 24.05.2005. 21:43 ] @
Hvala na odgovoru, ovo je bas elegantno resenje za slicne probleme koje mi nije palo na pamet. Treba jos puno da ucim :)

Doduse, mana je sto onda svaku realizovanu klasu treba ubaciti u switch.
Iz knjige (iako se taj deo ne detaljise, vec bi ocito trebalo da radi kako je napisano) sam stekao utisak da mogu u nekom inicijalizatoru (tj. posto je u pitanju application scope - implementaciji ServletContextListener-a), da napisem naredbu tipa:

servletContext.setAttribute(Constants.NEKI_KEY, new ImeKlaseKojuHocudaKoristim());

i da u Constants imam pridruzen neki string tom key-u npr:

public final static String NEKI_KEY = "neki_string";

i posle tamo gde se poziva metoda te neke klase napisem:

neki_string.metoda();

a on ce sam znati na koju se klasu to odnosi iz tog key-a.

Ovo ne radi, pa sam pretpostavio da samo gresim negde u sintaksi ili treba preko neke posebne metode procitati taj key.

Ovako onda nema potrebe za nikakvim menjanjem koda nakon jos neke implementacije interfejsa, vec samo u inicijalizatoru kazem koja hocu da se koristi po njenom imenu





[ me-tuzalem @ 25.05.2005. 10:01 ] @
Pazi, ne možeš da imaš

Citat:
protech_v2:

public final static String NEKI_KEY = "neki_string";

i posle tamo gde se poziva metoda te neke klase napisem:

neki_string.metoda();


već moraš da instanciraš objekat neke klase. Ako ti je "neki_string" ime klase onda možeš to ovako:

Code:


    Class klasa = null;
    klasa = Class.forName("neki_string");// puno ime klase tipa package.klasa
    Object obj = klasa.newInstance();
    MyInterface mi = (MyInterface)obj;//casting samo radi primera, mogle je spojeno sa prethodnom instrukcijom
    

Tada mi predstavlja referencu na tvoj objekat i onda možeš da kažeš

Code:

mi.metoda();


Ovo je elegantnije rešenje od onoga sa swtich naredbom, ali nisam hteo u prethodnom odgovoru da ti komplikujem.
[ protech_v2 @ 26.05.2005. 00:08 ] @
Eee, bas ono sto mi treba :) Nisam znao za "forName". Hvala puno na korisnim odgovorima!