[Risolto][Da solo!][Java] Errore nella lettura di file properties

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

[Risolto][Da solo!][Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

Carissimi,
sarò sintetico. La mia web app sviluppata in Java con Eclipse comprende:

1) Un file test.properties nella cartella WEB-INF che reca solo la riga:
alfa.beta = "big";


2) La classe pro.java che reca il codice:
package utility;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;


public class pro {

    public String Metodo()
    {
    Properties p = new Properties();
        String  valore = "";
        try {
            p.load(this.getClass().getClassLoader().getResourceAsStream("/WEB-INF/test.properties"));
            valore = p.getProperty("alfa.beta");
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return valore;
    }
}


3. La pagina jsp che dovrebbe visualizzare la properties e che comprende il seguente frammento di codice.




Ovviamente è un semplice test di lettura, non è certo il modo in cui è strutturata la mia applicazione. In questo modo vedo un messaggio di errore. Ho la sensazione (togliendo parti e rimettendole, ecc) che l'errore sia dalle parti del percorso del file properties ma posso sbagliarmi. Secondo voi perché non va? (l'errore è null.pointer.lang.exception).

Grazie a tutti
Ultima modifica di Archimede Pitagorico il martedì 16 settembre 2008, 21:54, modificato 1 volta in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [Java] Errore nella lettura di file properties

Messaggio da Zoff »

Di norma un messaggio di eccezione reca anche la riga dell'istruzione che ha dato l'errore...

Prova a copiare ed incollare quà l'errore...

ciauz
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
prampa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 652
Iscrizione: lunedì 26 febbraio 2007, 14:04

Re: [Java] Errore nella lettura di file properties

Messaggio da prampa »

se l'obiettivo è visualizzare a video nelle jsp una descrizione "internazionalizzata" recuperandola da un file di properties, secondo me le modifiche dovrebbero avvenire solo nella presentazione delle informazioni e non a livello di business o da altre parti. Potresti usare le jstl in questo modo:

1) scaricati le jstl e copiarle sotto WEB-INF
2) mappare nel web.xml, principalmente

Codice: Seleziona tutto

<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
che sono quelle che ti servono
3)
creare sotto WEB-INF (o allo stesso livello di dove hai il codice sorgente, vedi tu) una cartella (ad esempio lang) dove ti crei un file di properties, formato testo di nome message_it.properties ad esempio, dove imposterai alfa.beta = grande (poi esisterà anche un message_en.properties per i messaggi in inglese a prescindere da americano o altro.....)
4)
nella jsp all'inizio nelle direttive devi impostare

oppure
, come vuoi, per fargli riconoscere le taglib, e poi nel body

Codice: Seleziona tutto

<fmt:bundle basename="lang.message">
<fmt:message key="alfa.beta" />
</fmt:bundle>
dove
bundle contiene il path del file di properties (lang è il nome della directory e message il nome del file properties, senza usare il riferimento al Locale corrente). Nella pagina html visualizzerai "grande".
Se vuoi fare anche altre prove una volta che hai creato un message_en.properties se cambi la lingua del browser scegliendo inglese e provi a ridigitare l'url, visualizzerai in automatico la scritta "big" (la prende in automatico dal file message_en.properties dove c'e' alfa.beta = big ....), oppure senza modificare nulla a livello di browser, puoi anche impostare  manualmente prima del bundle per un riferimento diretto al file di properties.

Spero di non aver dimenticato nulla a quest'ora...
Se non lo fai a livello di presentazione, come porti il valore "alfa.beta" sulla jsp? spero non con quel sistema di mettere codice java nella jsp....: in ogni caso lo devi prima leggere e poi memorizzare nella request.....una bella rogna.....immagina se lo dovessi fare per ogni label di ogni campo di testo ad esempio.....la tua applicazione invece dovrebbe essere internazionale....ogni label , testo di pulsanti, testo fisso, dovrebbe essere internazionalizzato....
Puoi usare questo metodo, è semplice o se stai usando struts c'e' un modo ancora più semplice.
ciao
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

Ho fatto esattamente tutto quello che hai detto ma compare una finestra di avviso vuota. Non ci sono errori, ma non leggo alcun messaggio. Come mai? Grazie di tutto.
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

FUNZIONA! Ora faccio delle prove e ti faccio sapere.
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

Passando all'applicazione seria e non al programmino di prova, inserendo queste righe nella pagina tutto funziona.

Codice: Seleziona tutto

<fmt:bundle basename="lang.message">
<fmt:message key="alfa" />
</fmt:bundle>
Ora però ti domando:

Sotto la cartella source ho creato la cartella lang e qui il file message, e tutto funziona. Se volessi definirmi un percorso personalizzato, ad esempio sotto  WebContent/WEB-INF (dove si trova anche web.xml, così potrei raggruppare lì tutti i file che prevedo di modificare con maggior frequenza, a vantaggio della manutenibilità), come dovrei cambiare la prima riga? Ho provato in tutti i modi, ma non funziona. Pare che consideri la cartella src come default, senza nemmeno bisogno di esplicitarla (infatti nella prima riga ho solo indicato la sottocartella lang).

Poi, parlando di pulizia del codice, mi pare poco elegante che ogni volta che debba visualizzarsi un testo o un'etichetta anche di una sola parola io debba inserire tutte quelle tre righe di codice. Esiste un modo, diciamo, per definire il basename una volta per tutte nella pagina e richiamare i valori come ho fatto sino ad oggi, ovvero con quel bellissimo codice ${valore}?

Grazie ancora!

EDIT: A proposito della sintassi del file di properties, ora uso questa sintassi semplicissima ed il contenuto del file è solo ed unicamente questo:

Codice: Seleziona tutto

alfa=testo
beta=prova
Se in un testo molto lungo volessi andare a capo come potrei far capire al file che non voglio iniziare una nuova proprietà ma terminare la precedente? E' davvero così semplice un file .properties o magari possiede una sua sintassi e segue ad esempio le stesse regole sui nodi dei files xml?
Ultima modifica di Archimede Pitagorico il domenica 14 settembre 2008, 21:11, modificato 1 volta in totale.
prampa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 652
Iscrizione: lunedì 26 febbraio 2007, 14:04

Re: [Java] Errore nella lettura di file properties

Messaggio da prampa »

fai delle prove. Dovrebbe esistere un fmt:setbundle per definire una sola volta nella pagina il nome del ResourceBundle e poi dovresti usare solo il tag fmt:message, che è quello che visualizza la descrizione internazionalizzata.

Per la posizione del ResourceBundle, in realtà tu come sorgente lo imposti sotto la directory "src", ma quando fai il deploy va sotto WEB-INF/classes: è per questo che lo trovi (vai a vedere il .war che crei). Se crei una cartella "lang" allora lo referenzierai come lang.message e la cartella "lang" starà sotto WEB-INF/classes.

Quando usi ${valore} stai recuperando il valore dalla request: in questo caso no. Il tag lo devi definire in questo modo: la pulizia del codice è altra cosa.

Nel file properties puoi usare tag html, tipo : la sostituzione della descrizione avviene lato server. Quando la pagina arriva al browser ci pensarà lui a formattare il testo come viene inviato dal web server.

ciao
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

Tutto perfetto. Una ultimissima cosa.

Il tipo di messaggio (account non corretto, mancanza di password) dovrebbe essere funzione di un parametro passato dalla servlet che apre la pagina. Prima di usare il tuo metodo, "acquisivo" tale parametro col codice

Codice: Seleziona tutto

"${LoginMessage'}"
Quindi ti chiedo, come rendere l'attuale frammento di codice, che adesso peraltro funziona benissimo se a scopo di prova è impostato in modo fisso sempre con lo stesso messaggio di account errato

Codice: Seleziona tutto

alert('<fmt:message key="alert.wrongaccount" />'); 
in grado invece di acquisire dinamicamente il tipo di messaggio da aprire in base ad un parametro passato alla pagina, ovvero come fare qualcosa di simile a quanto ti indico di seguito, che non funziona in quanto genera errore (sicuramente è sbagliata la sintassi)

Codice: Seleziona tutto

alert('<fmt:message key="${LoginMessage'}" />');
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

Aggiungo che non funziona nemmeno se sostituisco virgolette o apici. Deve esserci qualcosa che mi sfugge.
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

CONCLUSIONI (gradirei un vostro parere)

Dunque, eccoci alle somme. Alcuni di voi mi avevano consigliato di "pulire" il file web.config da qualunque cosa potesse essere annoverata tra le proprietà di un'applicazione consigliandomi per queste ultime gli appositi file properties. Prima, c'era un web.config chilometrico, con nomi di menù e sottomenù, codici su permessi ed autorizzazioni dei moduli visibili in base ai privilegi dell'utente loggato, messaggi di ogni tipo, testi help e qualunque cosa una mente malata potesse gestire in un file xml. File che era divenuto assolutamente illegibile e lunghissimo.

Adesso, grazie a Prampa ed a tutti quelli che mi hanno risposto, nel file web.config (adesso ordinatissimo, molto più breve e nel quale trovare una riga generica è molto più facile) ci sono solo le credenziali di accesso al db (ma resteranno lì ancora per poco, molto poco!), le mappature ed i nomi delle servlet. Niente altro. Invece, ho creato una cartella properties nella quale ho due cartelle: languages (con tutti i file lingua che contengono qualunque cosa si debba leggere a schermo nella mia appplicazione) e modules (con tutte le informazioni sulla configurazione dei vari moduli della mia web application). Un ordine imparagonabile alla situazione di prima, ora trovo, modifico e gestisco tutto in due secondi, all'insegna della pulizia del codice.

Ringrazio tutti e richiamo un solo ultimissimo quesito sull'argomento ancora irrisolto. Spesso infatti i messaggi che voglio mostrare sono funzioni di parametri passati dalla servlet che ha generato la pagina (pensate ad una maschera di login che mostra un messaggio di errore diverso a seconda del dato non inserito dall'utente). Bene, sbaglierò la sintassi ma non sono ancora riuscito a parametrizzare l'argomento dell'istruzione key (vedi post precedenti). Non ci riesco proprio. Se qualcuno di voi riuscisse a fare qualche prova gliene sarei grato, altrimenti grazie lo stesso, questo post mi ha comunque fatto fare passi in avanti.

PS: Se dovesse essere utile a qualcuno, sappiate che non uso i file properties solo per le lingue ma come detto anche per aspetti puramente funzionali, che non vanno tradotti e non interessano la presentazione a schermo di messaggi ma che riguardano invece l'esecuzione di classi e servlet. In tal caso uso il codice che avevo indicato nei primi post di questa discussione, negli altri il metodo indicato da Prampa. Questi file properties sono davvero duttili!
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Risolto][Da solo!][Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

Dopo circa 7 ore di ricerche, ecco la soluzione. Nell'intestazione, modificare l'istruzione import. Era un problema di versioni, tutto qui.

Da

Codice: Seleziona tutto

<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
a

Codice: Seleziona tutto

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
Grazie comunque a tutti!
prampa
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 652
Iscrizione: lunedì 26 febbraio 2007, 14:04

Re: [Risolto][Da solo!][Java] Errore nella lettura di file properties

Messaggio da prampa »

bravo. comunque è un problema di versioni di jstl: se lasciavi la mappatura con /WEB-INF nella taglib credo andava bene ugualmente. In base alla versione serve o non serve il /jsp.
Quindi sei riuscito a visualizzare i messaggi di errore recuperando la descrizione dal resourceBundle (quindi tu passi alla jsp il codice dell'anomalia e in automatico lei con fmt:message recupera la relativa descrizione internazionalizzata..)?
Secondo me, si, ti conviene togliere le credenziali di accesso al db dalle properties: non hanno nulla a che vedere con l'applicazione, nel senso che è compito dell'application server o servlet container, a seconda di quello che stai usando, sapere dove sta il db e conservare informazioni di utente e password.
ciao
Archimede Pitagorico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 861
Iscrizione: domenica 22 aprile 2007, 19:51

Re: [Risolto][Da solo!][Java] Errore nella lettura di file properties

Messaggio da Archimede Pitagorico »

'bravo'.

tu non puoi capire quanto mi faccia piacere sentirmelo dire, da oltre un anno sto compiendo sforzi enormi e nottate a valanga per approfondire le mie conoscenze provando e riprovando. Grazie. Allora qualche piccolo risultato, nel mio piccolissimo, lo sto conquistando.

tornando a noi, è esattamente come hai detto tu. Mi sono scervellato cercando il miglior modo di gestire i testi e credo di averlo trovato. Riguardo le credenziali db, anche quelle saranno presto eliminate dal web.xml, e messe non in un file properties.

chi la dura la vince!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti