Newsgroup: it.comp.java
Titolo: soluzione per accedere a dei valori static

Dunque: in un paio di pagine jsp del sito che sto facendo e in alcune
classi utilizzate in altre pagine ho bisogno di una Hashmap in cui sono
memorizzati dei valori(che appunto poi devo farmi restituire)
io ho organizzato la cosa in questa maniera: all'avvio di tomcat viene
(tramite una servlet che viene chiamata solo all'avvio di
tomcat)istanziato un oggetto di una classe Parametri che contiene
l'HashMap contenitoreParametri(definita private e static); la servlet
chiama un metodo di tale classe che 'riempie' l'Hashmap con gli opportuni
valori.
quando poi ho bisogno di ricavare dei valori dalla mia Hashmap faccio:
Parametri param=new Parametri();
String valore=param.getValore("parametro");
dove getValore č apunto il metodo che mi restituisce il valore
corrispondente al parametro passato.
mi conveniva forse rendere la cosa piů semplice, definire direttamente
l'Hashmap come costante pubblica static,scrivere nella classe qualcosa
tipo:
static{
..codice che riempie la costante
}
e accedervi in tale maniera:
Parametri param=new Parametri();
String valore=(String)param.contenitoreParametri.get("parametro");
oppure (anche se escluderei) non definire l'Hashmap static e quindi ogni
volta che si istanzia la classe Parametri 'riempire' di nuovo l'hashmap????
oppure se c'č unaltra soluzione migliore sono tutto orecchie.
grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


http://csvtosql.sf.net

 riempirla.
beh anche(nel primo caso) se metto static il metodo getValore non devo
ogni volta fare una new.
ma quale ti sembra migliore come soluzione(e perchè)?


 oppure se c'è unaltra soluzione migliore sono tutto orecchie.
Con un Custom Tag :) ?
Lo sai che puoi accedere all'HashMap anche usando JSTL ? Te lo dico
perche' IMHO nelle JSP e' meglio aver meno codice possibile.
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

 perche' IMHO nelle JSP e' meglio aver meno codice possibile.
Dunque Custom Tag e JSTL li ho visti pochissimo.
Si trattarebbe di fare una classe(un Tag personalizzato) richiamabile poi
con JSTL giusto???
Questa cosa mi sa che č piů complicata, dovrei studiare unpo'-
Piuttosto se puoi mi dai una dritta sulla prima soluzione che mi hai
indicato.
grazie cmq degli spunti


 grazie cmq degli spunti
Che intendi per context dell'applicazione?


 indicato.
Come hai detto tu, nel servlet che viene chiamata solo all'avvio di
tomcat, nel metodo init(ServletConfig config) setti l'HashMap nel
contesto del container:
  config.getServletContext().setAttribute("miaHashMap", map);
ora ci puoi accedere da qualsiasi parte della tua applicazione:
  req.getSession().getServletContext().getAttribute("miaHashMap);
Se pero' i valori che ti servono sono "semplici" (String, per esempio),
allora magari puoi pensare di settarli come init-parameters e accederci
via ServletContext.getInitParameter("paramName").


 Che intendi per context dell'applicazione?
Hai ragione, e' un modo errato di dire che mi e' rimasto in testa sin da
quando ho cominciato a usare i servlets.
Intendo dire nel contesto della web-application (Ce ne possono essere
piu' di una per JVM).


 via ServletContext.getInitParameter("paramName").
che intendi per init-parameters???
quelli che passi ad una servlet dal web.xml quando viene chiamata???
non capisco che intendi
grazie


 non capisco che intendi
Si, proprio quelli. Se i parametri dei quali hai bisogno non mutano e
sono semplici stringhe (O numeri), allora potresti codificarli come
init-parameters e accederci con getInitParameter("paramName")


 init-parameters e accederci con getInitParameter("paramName")
eh ma sono unpo' tantini, è il caso lo stesso?
una cosa che non centra nulla(se vuoi apro unaltro topic) :
ho notato che nella servlet generata dalla jsp c'è il codice:
 ServletContext application = null; 
    try {
 
      application = pageContext.getServletContext();
....
quindi per  ogni jsp viene creata un'istanza del'oggetto ServletContext (a
cui appunto dalla jsp accedo tramite l'oggetto application)????
grazie mille eh


 cui appunto dalla jsp accedo tramite l'oggetto application)????
Veramente viene creata una sola istanza, messa a disposizione di tutte 
le jsp (o comunque è quello che appare, se poi il container si fa i suoi 
maneggi per efficienza a noi non è dato sapere:-) ). In questo modo 
possono condividere dati visibili a tutta la web-appl. Il concetto è 
praticamente lo stesso della session, solo che la  session la vede solo 
l'utente, 'application' la vedono tutti.
bye
DKano

DKano ha scritto:


scusa ma se ogni pagina jsp produce qualcosa del tipo:
ServletContext application = null;
try {
 application = pageContext.getServletContext();
....
vengono creati tanti oggetti ServletContext , o no??
fatico a capire
cmq grazie


 
getServletContext():
  Returns a reference to the ServletContext in which the caller is 
executing.
Perché getServletContext() dovrebbe per forza istanziare ogni volta un 
oggetto diverso?
Il ServletContext 'application' è unico per tutti (altrimenti come 
farebbero a condividerlo?). Lo scopo di averne uno unico è quello di 
avere un contenitore dove tutti possono inserire e estrarre oggetti.
Ma credo non mi sia chiaro cosa non ti è chiaro ( :-) ) o sbaglio?
bye
DKano

 diana_est wrote:




vediamo se ho capito---
il seguente script(presente nelle servlet generate dalle jsp del mio sito):
ServletContext application = pageContext.getServletContext();
crea in ogni servlet un oggetto (ServletContext) che contiene un
riferimento a ServletContext  che è unico per tutta la applicazione.
Mi confonde il fatto che vari istanzie di ServletContext contengano
riferimenti ad un unico oggetto ServletContext 
(magari ho detto un mucchio di c****)


 riferimenti ad un unico oggetto ServletContext 
Infatti c'e' una sola istanza di ServletContext per ogni 
web-application; perché getServletContext() non può sempre ritornare lo 
stesso oggetto?
pageContext (o config, nel mio caso) viene fornita dal web-jsp-server 
(tomcat o chi per lui); al suo interno il server mette un oggetto unico 
di tipo ServletContext, per cui chiamando getServletContext() si ottiene 
un riferimento al medesimo oggetto da tutte le jsp. Per farla meno 
complicata, la jsp chiede al server IL ServerContext e il server gli 
passa IL ServerContext relativo all'applicazione (unico per tutti).
Quindi ogni jsp ha una variabile 'application' che contiene un 
riferimento all'unico oggetto di tipo ServletContext esistente nella 
web-application. I metodi dell'oggetto in questione saranno fatti in 
modo da evitare conflitti di lettura/scrittura (ma ci pensa il server) 
per cui dal punto di vista della jsp ho un oggetto simil-Map (o 
simil-session) in cui posso inserire degli oggetti con 
setAttribute(String name,Object object) (equivalente a put() di Map) e 
ottenerli con getAttribute(String name) (equivalente a get() di Map)
Spero di esser stato chiaro, sono un pò fuso.
bye
DKano
PS Dai un'occhiata alle API di javax.servlet.ServletContext.

 grazie mille eh
Figurati :)


 diana_est wrote:






ok ok ho fatto una gran confusione io ma la cosa mi era quasi chiara(so
che eè difficile da crederci ma lo giuro :-))
1- ServletContext application =null;
2- ServletConfig config = getServletConfig();
3- application = config.getServletContext();
1:dichiaro una variabile di tipo ServletContext che contiene un
riferimento null(non punta quindi a nulla)
3:il riferimento viene fatto puntare appunto alla sola istanza di
ServletContext che esiste nella applicazione (non viene quindi creata
nessuna nuova istanza)
ci sono???


 che estende java.util.Hashtable.
Orca se ora mi tiri fuori unaltra soluzione vado in pappa :-)
mi sembra buono usare
 config.getServletContext().setAttribute("miaHashMap", map);
e poi recuprare l'hashmap dalle jsp tramite application e dalle servlet
tramite ServletContext
grazie


 
Perfetto!
bye
DKano

 tramite ServletContext
La soluzione con il file delle Properties e' la Soluzione Giusta se le
properties in questione sono String o al limiti valori aritmetici.
1) Crei un file di properties contenente i tuoi dati. Per esempio:
  nome1 = Mohandas
  nome2 = Karamchand
  nome3 = Gandhi
  annoDiNascita = 1869
  meseDiNascita = 10
  giornoDiNascita = 02
2) Carichi il file:
  Properties prop = new Properties();
  prop.load(new FileInputStream("mioFile.properties"));
3) Metti le properties nel context dell'applicazione
4) Quando hai bisogno dei dati, estrai le properties dal context e leggi
 la property che ti serve:
  ServletContext ctx = getServletConfig();
  Properties prop = (Properties)ctg.getAttribute("myProperties");
  String nome1 = prop.getProperty("nome1");
  Integer annoDiNascita = new Integer(prop.getProperty("annoDiNascita"));


 DKano
grazie e scusa se mi sono incartato su una simile idiozia


 2) Carichi il file:



garzie giambo, ho guardato unpo' Properties, è una bomba!!!


 
E di che? E poi e sulle idiozie che ci si incarta meglio, no? :-)
bye
DKano