Torna alla pagina di Tecnologie Web
:: Laboratorio 8 ::
Esercizio 1
Sulla base degli esempi visti a lezione, preparare un file XML contenente una serie di informazioni di vostro interesse, ed un file di trasformazione XSLT che permetta di visualizzare in forma tabellare le informazioni del documento XML.
Verificare che funzionino, richiamando i due file da un file JSP.
Provare anche la versione in cui il file XML ed il file XSLT sono contenuti all’interno dello stesso file.
SOLUZIONE
Di seguito mostriamo solo la soluzione con i file separati.
Il file cinema.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cinema.xsl"?>
<cinema>
<film>
<titolo> Shining </titolo>
<regista> Stanley Kubrick </regista>
</film>
<film>
<titolo> Apocalypse Now </titolo>
<regista> Francis Ford Coppola </regista>
</film>
<film>
<titolo> Gothic </titolo>
<regista> Ken Russell </regista>
</film>
</cinema>
Il file cinema.xsl che permette di trasformare il file XML in un file HTML con tabella.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:"http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head> <title> Collezione Film </title> </head>
<body>
<table border="1">
<tr>
<td> Titolo </td>
<td> Regista </td>
</tr>
<xsl:for-each select="cinema/film">
<tr>
<td> <xsl:value-of select="titolo"> </td>
<td> <xsl:value-of select="regista"> /td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Il file cinema.jsp che unisce i due file precedenti:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
<c:import var="codiceXML" url="cinema.xml" />
<c:import var="codiceXSL" url="cinema.xslt" />
<x:transform doc="${codiceXML}" xslt="${codiceXSL}" />
Esercizio 2
Scrivete un file XML in cui siano presenti una serie di libri (nodo radice: libreria). Per ogni libro riportare le seguenti informazioni: autore, genere, trama, numero di pagine, prezzo. Scrivete poi il codice di una JSP che permetta di effettuare diversi tipi di query sul documento XML. Per esempio:
- si vogliano visualizzare tutti i libri di un determinato genere
- si vogliano visualizzare tutti i libri con prezzo < 20 euro.
SOLUZIONE
libreria.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<libreria>
<libro>
<autore>Stephen King</autore>
<titolo>Al crepuscolo</titolo>
<genere>Narrativa</genere>
<trama>racconti vari</trama>
<npag>400</npag>
<prezzo>16</prezzo>
</libro>
<libro>
<autore>Sophie</autore>
<titolo>Sai tenere un segreto</titolo>
<genere>Horror</genere>
<trama>bla...bla...</trama>
<npag>350</npag>
<prezzo>25</prezzo>
</libro>
<libro>
<autore>Roberto Re</autore>
<titolo>Leader di Te Stesso</titolo>
<genere>PNL</genere>
<trama>PNL</trama>
<npag>180</npag>
<prezzo>9.90</prezzo>
</libro>
<libro>
<autore>HP Lovecraft</autore>
<titolo>Le montagne della follia</titolo>
<genere>Horror</genere>
<trama>follia</trama>
<npag>100</npag>
<prezzo>6</prezzo>
</libro>
</libreria>
libreria.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<html>
<head>
<title>Set Examples</title>
</head>
<body>
<c:import var="libri" url="libreria.xml" />
<x:parse var="doc" xml="${libri}" />
<table border="1">
<tr>
<td><b>Libri di genere Horror</b></td>
</tr>
<x:forEach select="$doc/libreria/libro[genere='Horror']">
<tr>
<td>
<x:out select="titolo" />
</td>
</tr>
</x:forEach>
</table>
</br>
<table border="1">
<tr>
<td><b>Libri al di sotto dei 20 euro</b></td>
</tr>
<x:forEach select="$doc/libreria/libro[prezzo<20]">
<tr>
<td>
<x:out select="titolo" />
</td>
</tr>
</x:forEach>
</table>
</body>
</html>
Esercizio 3
In questo esercizio utilizzeremo un database per memorizzare le preferenze relative alla visualizzazione di una pagina da parte di un utente. Per prima cosa preparare una pagina JSP (mioTesto.jsp) che contenga un titolo, un breve testo ed una form in cui l'utente possa inserire il colore dello sfondo preferito e la dimensione del font utilizzato nel testo.
Per un aiuto sui tag HTML potete consultare: "The Bare Bones Guide to HTML" (http://werbach.com/barebones/barebones.html).
La pagina utilizza dei valori di default che sono memorizzati in una tabella del database. (inizialenomecognome_preferenze). La tabella deve contenere almeno due campi, relativi al colore dello sfondo ed alla dimensione del font. Create la tabella con phpMyAdmin e impostate dei valori iniziali. mioTesto.jsp legge i valori da utilizzare nel database.
La form deve puntare alla JSP, memorizzaSQL.jsp. La pagina deve leggere i parametri inviati dall'utente e salvarli opportunamente nel database, quindi deve richiamare la pagina iniziale mioTesto.jsp.
SOLUZIONE
File iniziale che contiene la form: miotesto.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<sql:setDataSource
url="jdbc:mysql://localhost/tecweb"
driver="com.mysql.jdbc.Driver"
user="****"
password="****"/>
<sql:query var="pref">
SELECT color, size FROM db_preferenze
</sql:query>
<html>
<head><title> Lettura del DB </title></head>
<body bgcolor = '<c:forEach var="row" items="${pref.rows}">
<c:out value="${row.color}"/>
</c:forEach>'
>
<font size= '<c:forEach var="row" items="${pref.rows}">
<c:out value="${row.size}"/>
</c:forEach>'
>
<h1>Lettura dei dati in un database</h1>
<p><strong>SWAPPA COLOR</strong></p>
<p>Scrivi le tue preferenze: </p>
<form id="form1" name="form1" method="post" action="memorizzaSQL.jsp">
<p>
Colore Sfondo
<input type="text" name="colore" />
<br>
Dimensione Font
<input type="text" name="size" />
</p>
<p>
<input type="submit" name="submit" value="Invia" />
</p>
</form>
</font>
</body>
</html>
File memorizzaSQL.jsp che inserisce i valori, inseriti nella form precedente, nel database creato.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<sql:setDataSource
url="jdbc:mysql://localhost/tecweb"
driver="com.mysql.jdbc.Driver"
user="****"
password="****"/>
<sql:update>
UPDATE db_preferenze
SET color = ?, size = ?
WHERE id = '1'
LIMIT 1;
<sql:param value="${param.colore}"/>
<sql:param value="${param.size}"/>
</sql:update>
<html>
<head><title>operazione</title></head>
<body>
<form action="miotesto.jsp" method="post">
<h3>L'operazione è andata a buon fine.
Clicca per visualizzare le modifiche </br>
<input type="submit" value="visualizza">
</form>
</body>
</html>
In questo esercizio c'è un problemino con la dimensione del font, nel senso che rileva correttamente il dato inserito dall'utente, ma poi fa una conversione gigantesca che non comprendo, anche specificando il formato px nel campo font.
Esercizio 4
Ora invece, il nostro obiettivo è quello di utilizzare un file XML di configurazione locale.
Modificare i files preparati nell'esercizio precedente in modo che invece di utilizzare un database, utilizzino un file XML. Per leggere il file utilizzare la libreria JSTL xml.
Scrivere il file non è possibile direttamente con JSTL. Dobbiamo utilizzare una scriptlet (o meglio una servlet) Java. Ecco come aprire uno stream su file e scrivere una parola.
File mioFileXml = new File("configurazioni.xml");
PrintWriter mioStreamXml = new PrintWriter(new FileWriter(mioFileXml));
mioStreamXml.println("parola");
mioStreamXml.close();
Utilizzate la direttiva <%@ page import="java.io.*"%> nella pagina JSP.
SOLUZIONE
Il file preferenze.jsp che legge le preferenze e permette di specificare le nuove è il seguente:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<c:import var="pref" url="preferenze.xml" />
<x:parse var="doc" xml="${pref}" />
<html>
<head>
<title>Colore e dim</title>
</head>
<body bgcolor='<x:out select="$doc/preferenze/preferenza/colore" />'>
<font size='<x:out select="$doc/preferenze/preferenza/size" />'>
<h1>Lettura dei dati</h1>
<p><strong>SWAPPA COLOR</strong></p>
<p>Scrivi le tue preferenze: </p>
<form id="form1" name="form1" method="post" action="memorizzaXML.jsp">
<p>
Colore Sfondo
<input type="text" name="colore" />
<br>
Dimensione Font
<input type="text" name="size" />
</p>
<p>
<input type="submit" name="submit" value="Invia" />
</p>
</form>
</font>
</body>
</html>
Il file memorizzaXML.jsp che memorizza nel file xml le nuove preferenze, per poi essere rilette dalla pagina precedente, è:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %>
<%@ page import="java.io.*"%>
<%
try{
File mioFileXml = new File(getServletContext().getRealPath("/")+"preferenze.xml");
PrintWriter mioStreamXml = new PrintWriter(new FileWriter(mioFileXml));
String colore = request.getParameter("colore");
String dim = request.getParameter("size");
mioStreamXml.println("<?xml version='1.0' encoding='ISO-8859-1'?>");
mioStreamXml.println("<preferenze>");
mioStreamXml.println("<preferenza>");
mioStreamXml.println("<colore>");
mioStreamXml.print(colore);
mioStreamXml.println("</colore>");
mioStreamXml.println("<size>");
mioStreamXml.print(dim);
mioStreamXml.println("</size>");
mioStreamXml.println("</preferenza>");
mioStreamXml.println("</preferenze>");
mioStreamXml.close();
}catch (Exception e){
out.write("errore ");
}
%>
<html>
Torna alla pagina di Tecnologie Web