JUG Sardegna supports Devoxx 2012
Vuoi ricevere uno zainetto? Clicca qui

Java User Groups
Java.net Partner
Get Firefox!

Caricare Le Risorse Nelle Web Application J2 E E

di FabrizioGianneschi, Settembre 2003
pubblicato su http://www.programmazione.it


Un problema frequente nello sviluppo di applicazioni Web J2EE risulta essere il caricamento di risorse (file di testo, immagini, etc.) da parte delle Servlet, JSP o dei loro componenti.

Un errore diffuso è quello di riferirsi ad esse attraverso percorsi assoluti oppure facendo assunzioni sulla struttura delle cartelle di deploy del Web container. E' un metodo sbagliato, poiché crea un forte accoppiamento tra l'applicazione ed il sistema.

Ad esempio, è sbagliato accedere ad una risorsa nel modo seguente:

URL urlRisorsa = new URL("file:///C:/projects/tomcat/webapps/myapp/risorsa.xml")


In realtà, ove possibile, è molto meglio che l'applicazione acceda esclusivamente a risorse ad essa esclusive, attraverso percorsi relativi. Non solo: l'indipendenza del codice dal sistema rende l'applicazione maggiormente portabile e sicura, nel caso l'applicazione stessa debba essere utilizzata in container o sistemi differenti.

Supponendo di aver a che fare con una Servlet, un metodo corretto per caricare delle risorse è il seguente:
1) nel web.xml fornire come parametro della servlet il path relativo della risorsa che si vuole caricare. Quest'operazione non è necessaria, ma fortemente consigliata per disaccoppiare ulteriormente le risorse dal codice senza essere costretti ad inserire percorsi hard-coded. Ad esempio:

Listato 1 – Specifica del percorso della risorsa nel file web.xml

... 
<servlet> 
   <servlet-name>myServlet</servlet-name> 
   <servlet-class>caricarisorse.MyServlet</servlet-class
   <init-param> 
    <param-name>path</param-name> 
    <param-value>/WEB-INF/risorsa.xml</param-value> 
   </init-param> 
</servlet> 
...


Notare l'attributo <param-value>: non vanno messi assolutamente path che ripercorrano percorsi che escano fuori dalla Web application, ma solo relativi all'interno di essa. Infatti, il "/" prima di WEB-INF è la root della vostra Web application (Context Root).
E' vietatissimo citare:
- il nome della Web application, perché potrebbe cambiare al momento del deploy;
- la cartella di deploy, perché non è detto che l'applicazione venga posizionata al suo interno ed inoltre il suo nome potrebbe cambiare a seconda del container (in Tomcat denominata webapps).

2) All'interno della servlet caricare il parametro (ad esempio nell'init):

Listato 2 – Caricamento del percorso della risorsa dal metodo init() di una Servlet
 
public void init() throws ServletException 

   ServletConfig cfg = getServletConfig()
   String path = cfg.getInitParameter("path")
   //... 

3) Utilizzare il path per ottenere la risorsa dal ServletContext (il quale delega al Servlet Container). Potete farvi restituire un oggetto java.net.URL oppure un java.io.InputStream da cui leggere. Si forniscono due esempi pratici:

Listato 3 – Esempio di caricamento di Properties
... 
Properties p = new Properties()
InputStream in = getServletContext().getResourceAsStream(path)
p.load(in)
...


Listato 4 – Esempio di caricamento di un file XML in un DOM
... 
SAXBuilder builder = new SAXBuilder()
URL confFileURL = getServletContext().getResource(path)
Document doc = builder.build(confFileURL)
...


VeryQuickWiki Version 2.7.8 | Admin
Copyright © 2003-20011 Java User Group Sardegna Onlus. - Java, the Java Coffee Cup Logo and the Duke Logo are trademarks or registered trademarks of Oracle corporation in the U.S. and other countries.