immagine
Transcript
immagine
JSP - Caso di studio 1 Una galleria di immagini • • • • • • • Le classi dell’applicazione Il file di configurazione La pagina indice Il caricamento di una nuova immagine Eliminazione di un’immagine Visualizzazione di un’immagine Deployment dell’applicazione Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 1 Requisiti • Sviluppiamo un'applicazione web in JSP, dotata delle seguenti funzionalità: – – visualizzazione delle miniature delle immagini; visualizzazione dell’immagine selezionata nelle dimensioni originali; – gestione delle immagini (caricamento, cancellazione). • Nota: siccome Java è un linguaggio di programmazione object oriented, cerchiamo di sfruttare la potenza e la flessibilità degli oggetti. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 2 Struttura dell’applicazione • Per semplicità verrà gestita una sola galleria. • Le informazioni di configurazione (formati grafici ammessi, dimensione delle miniature ecc.) sono incluse in un file. • Le miniature (create on-the-fly) on-the-fly costituiscono un link alle immagini a dimensione naturale. • La gestione avviene manipolando i file delle immagini in un’apposita directory. • Le entità fondamentali dell’applicazione sono modellate da classi Java, Java indipendenti dalle pagine JSP che le utilizzano. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 3 Le classi dell’applicazione • Organizzeremo le classi necessarie alla modellazione dell’esempio in un package denominato pwlsGallery come si può notare dalle direttive import nelle varie pagine. • Vi sono due oggetti che dobbiamo modellare per realizzare l’applicazione: la galleria e le immagini. immagini • Per le immagini gli attributi principali saranno il nome del file relativo e le dimensioni (larghezza × altezza) da usare per la visualizzazione all’interno di una finestra del browser. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 4 La classe immagine package pwlsGallery; public class Immagine { public String fileName; public int larghezza, altezza; public Immagine(String f, int w, int h) { fileName=f; larghezza=w; altezza=h; } } Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 5 La galleria: collezione di immagini • La galleria è quindi rappresentabile da una classe contenente: – – – – una collezione di oggetti di tipo Immagine, i formati di immagini consentiti, il numero massimo di immagini per riga, il percorso su disco sia delle immagini che dei file delle relative anteprime o thumbnail. • Inoltre bisogna fornire dei metodi per: – – – – caricare le immagini dalla directory su disco; generare le anteprime delle immagini, eliminare le immagini, restituire il numero di immagini della galleria. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 6 La classe galleria public class Galleria { public String path, thumbPath; public Vector immagini; public int numeroColonne; public int larghezzaAnteprima, altezzaAnteprima; public String formati; public Galleria(String p, String tp, int nc, int w, int h, String f, int max) { path=p; thumbPath=tp; immagini=new Vector(); numeroColonne=nc; larghezzaAnteprima=w; altezzaAnteprima=h; formati=f; numeroMaxTentativi=max; } ... } Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 7 Un metodo per discriminare i file • Per impedire il caricamento di file con formati non ammessi, si può far ricorso all’interfaccia FilenameFilter. FilenameFilter • E' sufficiente implementare il metodo accept che restituisce true se il file viene accettato, false altrimenti. • Questa classe viene utilizzata dal metodo CaricaImmagini della classe Galleria. Galleria Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 8 La classe FiltraEstensioni package pwlsGallery; import java.io.File; import java.io.FilenameFilter; public class FiltraEstensioni implements FilenameFilter { private String[] estensioni; public FiltraEstensioni(String lista) { estensioni=lista.split(";"); } public boolean accept(File dir, String name) { boolean esito=false; for(int i=0; i<estensioni.length; i++) { if(name.endsWith("."+estensioni[i])) { esito=true; break; } } return esito; } } Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 9 Compilazione e creazione del package jar • Compilazione: – javac Immagine.java FiltraEstensioni.java Galleria.java • Creazione del package in formato jar : – jar -cvf pwlsGallery.jar pwlsGallery/*.class Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 10 Il file di configurazione config.jsp <%! String path="/WEB-INF/Img"; String thumbPath="/Thumbnails"; int numeroColonne=3; int thumbX=150; int thumbY=150; String formati="jpg;png"; int numeroMaxTentativi=-1; %> Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 11 Il file di configurazione config.jsp • L’ultimo parametro è necessario a causa del fatto che il metodo di cancellazione delete() della classe java.io.File può fallire nel rimuovere il file specificato nel caso si sia fatto recentemente riferimento ad esso. • Quindi è necessario controllare l’esito dell’operazione e, in caso di fallimento, ripeterla; il parametro max serve appunto a definire il numero massimo di ripetizioni dell’operazione. • Il valore −1 per numeroMaxTentativi significa che il tentativo di cancellazione dell’immagine deve essere ripetuto indefinitamente fino all’avvenuta rimozione del file. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 12 La pagina indice: sorgente (1/3) <%@ page import="pwlsGallery.*"%> <%@ include file="config.jsp" %> <% Galleria galleria=new Galleria(getServletContext().getRealPath(path), getServletContext().getRealPath(thumbPath), numeroColonne, thumbX, thumbY, formati, numeroMaxTentativi); galleria.CaricaImmagini(); %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/XHTML" xml:lang="it" lang="it"> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>.: pwlsGallery: indice delle fotografie :.</title> <script language="Javascript"> function popup(n, w, h) { window.open("img.jsp?n="+n, "Foto", "scrollbars=no, width="+w+", height="+h); } </script> <link rel="stylesheet" type="text/css" href="pwlsGallery.css"> </head> Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 13 La pagina indice: sorgente (2/3) <body> <h1 class=intestazione>pwlsGallery: indice delle fotografie</h1> <table class=sfondo_tabella cellpadding="1" cellspacing="1"> <% int i; for(i=0; i<galleria.NumeroImmagini(); i++) { if(i%galleria.numeroColonne==0) out.println("<tr>"); %> <td class=sfondo_cella> <a href="javascript:popup(<%= i%>, <%=((Immagine)galleria.immagini.get(i)).larghezza%>, <%=((Immagine)galleria.immagini.get(i)).altezza%>)"> <img src="<%= thumbPath.substring(1,thumbPath.length()) +"/"+galleria.GeneraAnteprima(i)%>" border="0" /> </a></td> <% if((i+1)%galleria.numeroColonne==0) out.println("</tr>"); } Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 14 La pagina indice: sorgente (3/3) if((i+1)%galleria.numeroColonne!=0) { for(int j=(i+1)%galleria.numeroColonne; j<=galleria.numeroColonne; j++) { %> <td class=sfondo_cella> </td> <% } out.println("</tr>"); }%> </table><hr/> <table border="0"> <tr><td><a href="nuova.jsp">Aggiungi una nuova fotografia</a></td> fotografia</a> </tr> <tr><td><a href="elimina.jsp">Elimina fotografie</a></td></tr> fotografie</a> </table></body> </html> Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 15 La pagina indice: screenshot Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 16 Il form per il caricamento di una nuova immagine ... <body> ... <form method="post" enctype="multipart/form-data" action=" carica.jsp "> <table border="0"> <tr> <td> Seleziona il file da caricare<br /> <input type="file" name="foto" /> </td> </tr> <tr> <td> <input type="submit" name="invia" value="Invia >>" /> </td> </tr> </table> </form> <hr/> </body> </html> Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 17 Form di caricamento di una nuova immagine: screenshot Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 18 Struttura del corpo di una richiesta di upload Quanto segue è la struttura di una richiesta di upload eseguita con il form precedente sul file di testo prova.txt contenente la stringa ciao, mondo!: -----------------------------7d6222212903d4 Content-Disposition: form-data; name="foto"; filename="C:\Web\Test\prova.txt" Content-Type: text/plain ciao, mondo! -----------------------------7d6222212903d4 Content-Disposition: form-data; name="invia" Invia >> -----------------------------7d6222212903d4-Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 19 Parsing della richiesta HTTP • Da quanto detto appare evidente che, per gestire l’upload di file da form (X)HTML, è necessario implementare delle funzioni che facciano il parsing della richiesta HTTP in modo da estrarre i singoli campi. • Per fortuna esistono package Java creati per questo scopo. • Più precisamente utilizzeremo il package Commons FileUpload scaricabile da http://jakarta.apache.org/commons/fileupload/ e il package Commons IO scaricabile da http://jakarta.apache.org/commons/io/. • I file jar dei package vanno copiati nella directory lib dell’installazione di Tomcat ed il server va riavviato. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 20 Caricamento di una nuova immagine: sorgente (1/3) <%@ page import="java.util.List" ... %> <%@ include file="config.jsp" %> <% boolean flagErrore=false, erroreFormato=false; FileItemFactory factory=new DiskFileItemFactory(); try { ServletFileUpload upload=new ServletFileUpload(factory); List listaFile=upload.parseRequest(request); Iterator it=listaFile.iterator(); if(it.hasNext()) { FileItem f=(FileItem)it.next(); if(!f.isFormField()) { char carattereSeparatore=File.separatorChar; String separatore=""; if(carattereSeparatore=='\\') separatore="\\\\"; else separatore=File.separator; In Java '\' è un carattere di escape. Nelle espressioni regolari anche. Quindi '\' nelle espressioni regolari in Java va scritto così: '\\\\'. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 21 Caricamento di una nuova immagine: sorgente (2/3) String[] partiPercorso=f.getName().split(separatore); FiltraEstensioni filtro=new FiltraEstensioni(formati); if(filtro.accept(null, partiPercorso[partiPercorso.length-1])) { File file=new File( getServletContext().getRealPath(path), partiPercorso[partiPercorso.length-1]); f.write(file); } else erroreFormato=true; L'immagine viene caricata solo se è in uno dei formati consentiti } } } catch(Exception e) { flagErrore=true; } %> Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 22 Caricamento di una nuova immagine: sorgente (3/3) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/XHTML" xml:lang="it" lang="it"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>.: pwlsGallery Aggiunta di una nuova immagine :.</title> <link rel="stylesheet" type="text/css" href="pwlsGallery.css"> </head> <body> <h1 class=intestazione>pwlsGallery: aggiunta di una nuova fotografia</h1> <table border="0"> <tr> <td> <%= flagErrore ? "Errore durante il caricamento del file." : erroreFormato ? "Il formato del file non rientra fra quelli ammessi." : "Fotografia caricata correttamente." %> </td> ... Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 23 Note sul caricamento dell’immagine • Il parsing della richiesta HTTP viene effettuato dal metodo parseRequest dell’oggetto upload. • Tutti gli elementi vengono per mezzo dell’iteratore it. • L’iteratore consente di scorrere gli oggetti di tipo FileItem discriminando sulla loro natura tramite il metodo isFormField: – nel caso in cui assuma valore true si tratta di un campo – “normale” del form; – nel caso in cui assuma valore false si tratta di un file. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 24 Eliminazione di un’immagine ● ● ● La pagina elimina.jsp visualizza le miniature delle immagini della galleria affiancando ad ognuna di queste l’immagine di un cestino. Cliccando sul cestino si attiva un link alla pagina rimuovi.jsp a cui viene passato con il metodo GET l’indice dell’immagine da eliminare. Si noti il controllo del parametro: try { numero=Integer.parseInt(request.getParameter("n")); } catch(NullPointerException e) { numero=-1; } catch(NumberFormatException e) { numero=-1; } ● L’eliminazione effettiva dell’immagine (dopo il controllo sulla validità del parametro) viene effettuata per mezzo del metodo EliminaImmagine dell’oggetto galleria. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 25 La pagina di eliminazione: screenshot Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 26 Visualizzazione di un’immagine in dimensione naturale Se l'indice dell'immagine passato come argomento è corretto , la pagina img.jsp provvede ad inviarla al browser: response.setContentType("image/jpeg"); File f=new File(getServletContext().getRealPath(path)+ File.separator+ ((Immagine)galleria.immagini.get(numero)).fileName); FileInputStream is=new FileInputStream(f); OutputStream os=response.getOutputStream(); byte[] buf=new byte[1024]; int l=0; while((l=is.read(buf))>0) os.write(buf, 0, l); I/O dell'immagine os.flush(); os.close(); is.close(); Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 27 Il deployment dell’applicazione Su latoserver.dimi.uniud.it: </home/<nome-utente>> | --> servlets | |--> images | |--> Thumbnails | ---> WEB-INF | |--> Img | ---> lib E' necessario accordare il permesso di scrittura al gruppo tomcat nelle directory Thumbnails e Img. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 28 Il deployment dell’applicazione Installazione locale di Tomcat: <Tomcat-root-dir> | --> webapps | --> pwlsGallery | |--> images | |--> Thumbnails | ---> WEB-INF | |--> Img | ---> lib Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 29 Note su Tomcat e Ubuntu • Nel caso di un'installazione di Tomcat 5.5 o 6.0 sulle ultime versioni di Ubuntu (e.g., 8.0.4) è necessario provvedere a impostare la seguente variabile d'ambiente: export CATALINA_OPTS="-Djava.awt.headless=true" prima di avviare Tomcat. • Ciò è dovuto ai metodi usati per creare le miniature delle immagini (fanno ricorso alle librerie del server X). Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 30 Esercizi (Galleria di immagini in JSP) • Si modifichi la pagina per l'aggiunta di una nuova immagine in modo da poter specificare una breve descrizione testuale dell'immagine stessa. Tale descrizione dovrà essere salvata (nella stessa directory Img in cui vengono salvate le immagini) in un file di testo avente lo stesso nome dell'immagine ed estensione txt. txt Inoltre si faccia in modo che, nella pagina index.jsp venga visualizzata anche la descrizione a fianco di ogni miniatura. • Infine si modifichi la procedura di eliminazione delle immagini in modo da cancellare anche i file delle relative descrizioni testuali, oltre al file dell'immagine e della miniatura. Complementi di Tecnologie Web – M. Franceschet, V.Della Mea e I.Scagnetto, a.a. 2011/12 - 31