Laboratorio di Sistemi Fondamenti di JSTL (parte 3) Java (JSTL) Concludiamo questa nostra carrellata tra le azioni JSTL, presentando ora un piccolo applicativo che fa uso delle librerie JSTL e di un database MySQL (si legga l'articolo “DAO (MySQL)”, http://www.mauriziocozzetto.net/pdf/DAO_MySQL.pdf). In questo esempio, inseriamo le informazioni sulla connessione al database biblio_db nel file web.xml (deployment descriptor) invece che nella pagina web mediante l'azione sql:setDataSource. Questo rende l'applicativo più snello e più sicuro. File web.xml ..... <context-param> <param-name> javax.servlet.jsp.jstl.sql.dataSource </param-name> <param-value> jdbc:mysql://localhost:3306/biblio_db,com.mysql.jdbc.Driver,prova,prova </param-value> </context-param> .... Osserviamo intanto il funzionamento dell'applicativo. Fig. 1 – La pagina index.jsp dell'applicativo BibliotecaJSTLWebApp JSTL-parte3.pdf Pag. 1/6 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 3) Java (JSTL) Fig. 2 – I libri scritti da Fabrizio Ferrari Fig. 3 – Il libro scritto da Michael Bowers JSTL-parte3.pdf Pag. 2/6 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 3) Java (JSTL) Fig. 4 – Il dettaglio del libro di Michael Bowers File index.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="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>Libri scritti da un certo autore</title> <style type="text/css"> body,td,th { font-family: Verdana; font-size: 16px; } </style> </head> <body> <h3>Libri scritti da un certo autore</h3> <sql:query var="result"> SELECT Concat(RTrim(autori_tbl.nome),' ',RTrim(autori_tbl.cognome)) AS anagrafica FROM autori_tbl </sql:query> JSTL-parte3.pdf Pag. 3/6 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 3) Java (JSTL) <p> <form name="provaFrm" action="${request.requestURI}" method="GET"> <select name="autoreMnu"> <c:forEach var="row" items="${result.rows}"> <!-- caricamento delle anagrafiche nella combobox autoreMnu --> <option value="${row.anagrafica}">${row.anagrafica}</option> </c:forEach> </select> <input type="submit" name="inviaBtn" value="Invia"/> </form> </p> <p> <c:if test="${!empty param.inviaBtn}"> <sql:query var="result"> SELECT * FROM libri_tbl, autori_tbl, editori_tbl WHERE autori_tbl.idAutore = libri_tbl.idAutore AND editori_tbl.idEditore = libri_tbl.idEditore AND Concat(RTrim(autori_tbl.nome)," ",RTrim(autori_tbl.cognome)) = "${param.autoreMnu}" </sql:query> <c:choose> <c:when test="${result.rowCount>0}"> <c:forEach var="row" items="${result.rows}"> <c:out value="${row.isbn}"/> | <c:out value="${row.titolo}"/> | <c:out value="${row.nomeEditore}"/> | <a href="index2.jsp?isbn=${row.isbn}">Dettagli</a> <br/ > </c:forEach> </c:when> <c:otherwise> Non ci sono libri scritti da <c:out value="${param.autoreMnu}" /> </c:otherwise> </c:choose> </c:if> </p> </body> </html> Nel codice precedente, request.requestURI restituisce dinamicamente il nome della pagina web (index.jsp). Cambiando eventualmente il nome della pagina, non dobbiamo aggiornare il valore della proprietà action del form. Param invece indica la Collection di variabili del form, mentre result.rows denota il resultset della query di lettura e result.rowCount restituisce il numero di righe del resultset. JSTL-parte3.pdf Pag. 4/6 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 3) Java (JSTL) File index2.jsp <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="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>Accesso al database biblio_db</title> <style type="text/css"> body,td,th { font-family: Verdana; font-size: 16px; border: 0px; } .sinistra { float: left; margin-right: 9px; margin-bottom: 9px; } </style> </head> <body> <h3>Dettagli libro</h3> <c:choose> <c:when test="${!empty param.isbn}"> <sql:query var="result"> SELECT * FROM libri_tbl, autori_tbl, editori_tbl WHERE autori_tbl.idAutore = libri_tbl.idAutore AND editori_tbl.idEditore = libri_tbl.idEditore AND libri_tbl.isbn = "$ {param.isbn}" </sql:query> <c:choose> <c:when test="${result.rowCount==1}"> <c:set var="row" value="${result.rows[0]}"/> <c:if test="${!empty row.imgUrl}"><img src="img/${row.imgUrl}" class="sinistra"/></c:if> <i>Isbn:</i> <c:out value="${row.isbn}"/><br/> <i>Autore:</i> <c:out value="${row.nome} ${row.cognome}"/><br/> <i>Titolo:</i> <c:out value="${row.titolo}"/><br/> <i>Editore:</i> <c:out value="${row.nomeEditore}"/><br/><br/> <i>Introduzione:</i> <c:out value="${row.intro}"/> </c:when> JSTL-parte3.pdf Pag. 5/6 Cozzetto © Laboratorio di Sistemi Fondamenti di JSTL (parte 3) Java (JSTL) <c:otherwise> <jsp:forward page="index.jsp"/> </c:otherwise> </c:choose> </c:when> <c:otherwise> <jsp:forward page="index.jsp"/> </c:otherwise> </c:choose> </body> </html> In questo caso, result.rowCount vale 1 siccome c'è una sola riga (il libro con l'isbn assegnato) e questa è indicata con result.rows[0]. Jsp:forward invece riporta l'utente verso la pagina index.jsp. L'applicativo ovviamente presenta ancora molti margini di miglioramento, tuttavia, trattandosi di un esempio, abbiamo preferito lasciare così il codice (ad esempio manca una gestione degli errori) per questioni di semplicità e leggibilità. JSTL-parte3.pdf Pag. 6/6 Cozzetto ©