Laboratorio di Sistemi Fondamenti di JSTL (parte 2) Java (JSTL) Nel

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 ©