2012-12-22 6 views
5

Ho un sacco di testo, xml e altri file (cioè risorse) che devo accedere utilizzando i servlet nell'app web java. Ad esempio, esiste un file xml, una parte della quale viene restituita con un servlet da una query utente. Sto usando Tomcat. Qual è la migliore pratica per archiviare questi file e accedervi dal codice java? 1) Quali sono le cartelle predefinite in cui dovrei inserirle, devo inserirle nell'archivio Web o in uno dei barattoli? 2) Come accedere ai file dal codice java? Come posso impostare il percorso a loro in modo che funzioni in qualsiasi ambiente? P.S. Ho letto una serie di post relativi a questo argomento, la maggior parte dei quali consiglia di archiviare le risorse in jar e accedervi utilizzando java.lang.Class.getResourceAsStream (String). Sembra strano perché classi e dati dovrebbero essere separati.Best practice per archiviare e accedere ai file di risorse nell'applicazione web Java

risposta

7

È perfettamente possibile caricare le risorse statiche utilizzando il classloader. Ecco cosa fa ResourceBundle per caricare i file di proprietà internazionalizzati, ad esempio.

Inserirli in WEB-INF/classes insieme ai file di classe o in un barattolo all'interno di WEB-INF/lib e caricarli con ClassLoader come indicato dalle risposte già lette.

Ciò non vieta di collocare questi file in una directory separata dai file di origine Java nel progetto. Il processo di compilazione dovrebbe semplicemente assicurarsi di metterli nella posizione appropriata per il runtime. La convenzione Maven e Gradle consiste nel mettere i file di origine sotto src/main/java ei file di risorse sotto src/main/resources.

+0

1) Cosa succede se ho già risorse nella cartella WEB-INF/risorse? Sono usati da JavaScript nella pagina HTML. La pagina è WEB-INF/index.html e lo script fa riferimento alle risorse che utilizzano il percorso relativo. 2) Dove dovrei memorizzare il percorso della cartella delle risorse? C'è un posto in web.xml o altra risorsa statica? – Alexander

+1

Le risorse in WEB-INF non sono accessibili dall'esterno, quindi non è possibile caricare un file JS in WEB-INF dal browser. È possibile utilizzare ServletContext.getResourceAsStream() per caricare risorse da qualsiasi punto della webapp (incluso WEB-INF), ma che impone alla classe di caricamento di accedere al ServletContext. Non capisco la tua seconda domanda. È una risorsa statica. Perché non codifichi il percorso in qualche costante? –

+0

Uno ha bisogno di un'istanza di un servlet per ottenereContext e quindi ottenere una risorsa o un percorso di cartella. C'è un modo per farlo statico senza istanziare nulla? La mia seconda domanda era relativa al luogo in cui dovevo memorizzare tali costanti. Esiste un posto in alcune risorse relative al web come web.xml (invece di avere una costante in uno dei codici sorgente della classe)? – Alexander