Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Nel caso di una lista: <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Prova 9</title> </head> <body> <h3>Prova 9</h3> <c:set var="personaggiMadagascar2" value="Alex, Melman, Marty, Gloria, Moto Moto, Re Julien & Maurice, I pinguini, Le scimmie"/> I personaggi del film Madagascar 2<br/> <c:forEach var="personaggio" items="${personaggiMadagascar2}"> Un personaggio del film Madagascar è <c:out value="${personaggio}"/><br/> </c:forEach> </body> </html> Questa volta l'output riporta gli elementi della lista nell'ordine di caricamento (nel caso degli HashSet, l'ordine degli elementi dipende dalla funzione di hashing): Fig. 1 – Uso di una lista nelle JSTL JSTL-parte2.pdf Pag. 1/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Azioni c:import, x:parse, x:out E' possibile effettuare facilmente il parsing (analisi sintattica) di un file XML e determinare porzioni di un documento XML mediante il linguaggio XPath (lo studio di XPath è al di fuori degli scopi del presente articolo). Sfortunatamente NetBeans non include il supporto per le librerie XPath per cui dobbiamo cercarle su Internet e importarle dall'esterno. Il supporto per XPath è fornito normalmente dalla libreria Java xalan.jar. Puntiamo allora il browser alla URL http://apache.fagioli.biz/xml/xalan-j/e preleviamo il file xalan-j_2_7_1-bin-2jars.zip. Scompattiamolo il file zip sul desktop e nella cartella ottenuta cerchiamo il file xalan.jar. Nella cartella di sistema del nostro progetto, WEB-INF, creiamo ora la sottocartella lib e al suo interno copiamo il file xalan.jar. A questo punto, le funzionalità del pacchetto xalan.jar sono attive. File games.xml <?xml version="1.0" encoding="ISO-8859-1"?> <games> <country id="Luxembourg"> <athlete> <name>Lux 1</name> <sport>swimming</sport> <age>23</age> <gender>M</gender> </athlete> <athlete> <name>Lux 2</name> <sport>wrestling</sport> <age>31</age> <gender>M</gender> </athlete> </country> <country id="Denmark"> <athlete> <name>Den 1</name> <sport>cycling</sport> <age>18</age> <gender>F</gender> </athlete> <athlete> <name>Den 2</name> <sport>sailing</sport> <age>27</age> <gender>M</gender> </athlete> </country> </games> JSTL-parte2.pdf Pag. 2/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) File prova10.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Prova 10</title> </head> <body> <h3>Prova 10</h3> <c:import var="docString" url="games.xml"/> <x:parse var="doc" doc="${docString}"/> <c:out value="${docString}"/> <br/> <br/> <b>$doc//sport</b> <x:out select="$doc//sport"/><br/> <b>$doc/games/country/*</b> <x:out select="$doc/games/country/*"/><br/> <b>$doc//*</b> <x:out select="$doc//*"/><br/> <b>$doc/games/country</b> <x:out select="$doc/games/country"/><br/> <b>$doc/games/country[last()]</b> <x:out select="$doc/games/country[last()]"/><br/> <b>$doc//@id</b> <x:out select="$doc//@id"/><br/> <b>$doc//country[@id='Denmark']</b> <x:out select="$doc//country[@id='Denmark']"/><br/> </body> </html> JSTL-parte2.pdf Pag. 3/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Fig. 2 – Output del file prova10.jsp RSS (Estratto da http://it.wikipedia.org/wiki/Really_simple_syndication) RSS (acronimo di RDF Site Summary ed anche di Really Simple Syndication) è uno dei più popolari formati per la distribuzione di contenuti Web; è basato su XML, da cui ha ereditato la semplicità, l'estensibilità e la flessibilità. RSS definisce una struttura adatta a contenere un insieme di notizie, ciascuna delle quali sarà composta da vari campi (nome autore, titolo, testo, riassunto, ...). Quando si pubblicano delle notizie in formato RSS, la struttura viene aggiornata con i nuovi dati. Sviluppo RSS fu lanciato per la prima volta dal portale My Netscape e fu subito un grande successo: in breve, centinaia di fornitori di contenuti aderirono all'iniziativa e il portale My Netscape poté beneficiare di una vasta raccolta di notizie a disposizione dei propri utenti registrati. Nel frattempo, lo stesso formato fu adottato progressivamente dalla comunità dei blogger: i post di un blog potevano essere facilmente esportati in RSS, in modo da essere resi disponibili a servizi di raccolta di contenuti. La popolarità dei blog è forse una delle ragioni principali del successo di RSS: migliaia di blog iniziarono a produrre contenuti in RSS e iniziarono a proliferare siti che raccoglievano una selezione di post dai blog più seguiti (i cosiddetti blog aggregator) e programmi per fruire i contenuti di un blog direttamente sul proprio desktop o su altri dispositivi (RSS reader). Oggi RSS è lo standard de facto per l'esportazione di contenuti Web. I principali siti di informazione, i quotidiani online, i fornitori di contenuti, i blog più popolari hanno adottato il formato RSS. JSTL-parte2.pdf Pag. 4/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Fruizione di un feed RSS Le modalità più diffuse sono due: attraverso appositi software che interpretano un flusso di contenuti XML (detto anche feed RSS o documento RSS, in pratica un file XML) permettendo agli utenti di visualizzarne i contenuti, o integrando i contenuti del feed all'interno di un sito Web. Come viene interpretato un documento RSS Un'applicazione in grado di interpretare un documento RSS ne effettua il parsing, ovvero una scansione del documento che individua i tag e isola i diversi elementi, per poi convertire i contenuti decodificati in qualche altro formato: ad esempio un feed reader può estrarre i titoli di tutti gli elementi item per visualizzare la lista degli articoli di un giornale online, mentre un aggregatore Web può estrarre i contenuti del feed per convertirli in linguaggio HTML e incorporarli all'interno delle proprie pagine. (Fine) Proviamo a scrivere un mini-lettore di feed RSS web in Java. Procuriamoci un documento RSS particolarmente significativo, quello del sito della CNN, all'indirizzo http://rss.cnn.com/rss/edition.rss. Fig. 3 – Il file edition.rss interpretato dal browser Firefox Per vedere il file XML, selezionare dal menu di Firefox Visualizza > Sorgente pagina. File prova11.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> JSTL-parte2.pdf Pag. 5/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Prova 11</title> </head> <body> <h3>Prova 11</h3> <c:import var="docString" url="http://rss.cnn.com/rss/edition.rss"/> <x:parse var="doc" doc="${docString}"/> <p><x:out select="$doc//title"/></p> <p><x:out select="$doc//description"/></p> <p><x:out select="$doc//url"/></p> <p><img src="<x:out select='$doc//url'/>"/></p> <!-- visualizziamo solo la prima news per semplicità --> <p> <x:out select="$doc/rss/channel/item[1]/title"/><br/> <x:out select="$doc/rss/channel/item[1]/guid"/><br/> <x:out select="$doc/rss/channel/item[1]/link"/><br/> <x:out select="$doc/rss/channel/item[1]/description"/><br/> <x:out select="$doc/rss/channel/item[1]/pubDate"/><br/> </p> </body> </html> Fig. 4 – L'output del programma prova11.jsp JSTL-parte2.pdf Pag. 6/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) I18N Per internazionalizzazione (i18n perchè sono 18 i caratteri tra le iniziali della parola inglese internazionalization) o localizzazione (l10n, localization) intendiamo quel processo con cui vengono identificati tutti quegli elementi che possono cambiare in lingue e culture differenti (formato delle date, delle valute ecc). Un programma localizzato in italiano ad esempio fornisce tutti quegli elementi che l'utenza italiana si aspetta come le date nel formato gg/mm/aaaa e il simbolo € per la valuta. Fig. 5 – Output del programma prova12.jsp File prova12.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Prova 12</title> </head> <body> <h3>Prova 12</h3> <c:set var="importo" value="34.87"/> L'importo vale <fmt:formatNumber value="${importo}" type="currency"/><br/> <jsp:useBean id="oggi" class="java.util.Date"/> Data di oggi <fmt:formatDate value="${oggi}" dateStyle="full" type="date"/ ><br/> Sono le <fmt:formatDate value="${oggi}" timeStyle="full" type="time"/> </body> </html> JSTL-parte2.pdf Pag. 7/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Functions La libreria Functions contiene una serie di funzioni di utilità generale, come ad esempio funzioni per estrarre sottostringhe, per eliminare gli spazi, rimpiazzare caratteri in una stringa ecc. Fig. 6 – L'output del programma prova13.jsp File prova13.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Prova 13</title> </head> <body> <h3>Prova 13</h3> <c:set var ="anagrafica1" value="Antonio De Pascale" /> <c:set var ="anagrafica2" value="Maurizio Cozzetto" /> <c:set var="parteCognome" value="DE" /> <c:if test="${fn:containsIgnoreCase(anagrafica1, parteCognome)}"> Trovato ${anagrafica1} </c:if> <c:if test="${fn:containsIgnoreCase(anagrafica2, parteCognome)}"> Trovato ${anagrafica2} </c:if> </body> </html> JSTL-parte2.pdf Pag. 8/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) SQL Query di lettura L'ultima libreria che prendiamo in considerazione consente l'accesso a database relazionali. Con essa possiamo gestire la connessione a un database, per esempio MySQL, l'esecuzione di query di lettura o di aggiornamento, le transazioni ecc. Ricordiamo tuttavia che questa libreria è adatta solo allo sviluppo di prototipi di applicativi basati su database mentre in generale per le applicazioni distribuite mission critical occorre ricorrere a tecniche più sofisticate (ad esempio sfruttando il design pattern MVC, si legga l'articolo corrispondente nella sezione Java, Applicazioni web, chiave di ricerca MVC versione 2). Ricordiamo inoltre che occorre inserire nel nostro progetto i driver relativi a MySQL (Tasto destro del mouse sul progetto > (Categories) Libraries > Pulsante Add Library... > MySQL JDBC Driver > Pulsante OK). Per maggiori informazioni sulla gestione in Java dei database, leggere i due articoli “Fondamenti di JDBCParte1” e “Fondamenti di JDBC-Parte2” nella sezione Java > Applicazioni console, oppure ricercare i due articoli mediante la chiave di ricerca jdbc. Fig. 7 – Lettura della tabella libri_tbl del database MySQL biblio_db (Xampp è in esecuzione) File prova14.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Prova 14</title> </head> JSTL-parte2.pdf Pag. 9/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) <body> <h3>Prova 14</h3> <c:catch var="ex"> <sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/biblio_db" user="prova" password="prova" /> <sql:query var="result"> SELECT * FROM libri_tbl </sql:query> <c:forEach var="row" items="${result.rows}"> <c:out value="${row.isbn}" /> | <c:out value="${row.titolo}"/><br/> </c:forEach> </c:catch> <c:choose> <c:when test="${ex!=null}"> Attenzione si è verificato il seguente errore <c:out value="${ex.message}"/> </c:when> <c:otherwise> Tutto ok. Si prosegue. </c:otherwise> </c:choose> </body> </html> Se invece Xampp non è in esecuzione, o i driver non sono quelli richiesti, oppure la password non coincide o la query è sbagliata ecc, l'applicativo restituisce un messaggio di errore. Fig. 8 – Qui è stato cambiato il nome del driver Query di aggiornamento Possiamo inserire, aggiornare o cancellare record (eventualmente usare anche le CREATE del linguaggio SQL) mediante l'azione sql:update. JSTL-parte2.pdf Pag. 10/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Fig. 9 – Inserito un nuovo record (il secondo nella figura) File prova15.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Prova 15</title> </head> <body> <h3>Prova 15</h3> <c:catch var="ex"> <sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/biblio_db" user="prova" password="prova" /> <sql:update var="result"> INSERT INTO libri_tbl(isbn,titolo) VALUES ("11-111-1111-1","Prova") </sql:update> <sql:query var="result"> SELECT * FROM libri_tbl </sql:query> <c:forEach var="row" items="${result.rows}"> <c:out value="${row.isbn}" /> | <c:out value="${row.titolo}"/><br/> </c:forEach> </c:catch> JSTL-parte2.pdf Pag. 11/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) <c:choose> <c:when test="${ex!=null}"> Attenzione si è verificato il seguente errore <c:out value="${ex.message}"/> </c:when> <c:otherwise> Tutto ok. Si prosegue. </c:otherwise> </c:choose> </body> </html> Se tentiamo di reinserire il record con la stessa chiave, rieseguendo il codice precedente non possiamo farlo, dal momento che esiste già un record con la stessa chiave. Fig. 10 – “Entry” duplicata per la tabella libri_tbl Cancelliamo il record appena inserito sempre con l'azione sql:update JSTL-parte2.pdf Pag. 12/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Fig. 11 – Cancellazione effettuata con successo Per semplicità, riportiamo solo la query di aggiornamento, visto che il codice del programma prova16.jsp differisce solo di poco dal codice del programma prova15.jsp. <sql:update var="result"> DELETE FROM libri_tbl WHERE isbn="11-111-1111-1" </sql:update> Per quanto riguarda l'aggiornamento di un record, procediamo in maniera analoga. Le azioni necessarie sono simili alle seguenti. <sql:update var="result"> UPDATE libri_tbl SET titolo="C#: la Bibbia, Volume II" WHERE isbn="85-666-6392-4" </sql:update> JSTL-parte2.pdf Pag. 13/14 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Fig. 12 – Il record è stato aggiornato (il terzo partendo dall'altro) JSTL-parte2.pdf Pag. 14/14 Cozzetto ©