Utilizzare Spring nelle web application – parte 7

Nello scorso appuntamento abbiamo rifattorizzato l’applicazione per poter realizzare le nostre view tramite JSP, sfruttando le tag library JSTL (Java Standard Tag Libraries). La soluzione proposta però va completata con alcuni dettagli.

Riutilizzo di frammenti di JSP

La pagina src/main/webapp/WEB-INF/pages/index.jsp utilizza la direttiva <%@ include file=”…”>; questa direttiva indica che in quel punto va inserito, così com’è, il sorgente indicato nel parametro file. Si faccia attenzione a non confonderla con la azione attivata dal tag <jsp:include page=”…” >, quest’ultima infatti effettua una vera e propria chiamata HTTP alla URL relativa indicata nel parametro page.
Riportiamo per completezza il sorgente di src/main/webapp/WEB-INF/pages/index.jsp:
[xml]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ include file="common/taglibs.jsp"%>

index.jsp

<%@ include file="common/searchBox.jsp" %>

<hr />

<h4>Ultime inserzioni</h4>
<a href="&quot;insertions.html&quot;">Visualizza tutte</a>
<%@ include file="common/insertionsList.jsp" %>

[/xml]

Come possiamo vedere, questa pagina include ben tre frammenti: common/taglibs.jsp, common/searchBox.jsp e common/insertionsList.jsp. Tutti questi file vanno memorizzati nella directory src/main/webapp/WEB-INF/pages/common.
src/main/webapp/WEB-INF/pages/common/taglibs.jsp:
[xml]<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>[/xml]

In questo frammento vengono raggruppati tutti gli import delle tag library utilizzate nelle pagine JSP. Possiamo vedere le taglib standard, ovvero quelle con namespace che comincia per “http://java.sun.com/jsp/jstl/…”, e due taglib di Spring.
src/main/webapp/WEB-INF/pages/common/searchBox.jsp:
[xml]
<div id="searchBox">
<form action="search.html" method="post">
<input name="q" value="${fn:escapeXml(param.q)}" />
<button>Cerca</button>
</form></div>
[/xml]

Questo frammento definisce una casella di ricerca, che richiama il controller con URL “search.html”, passandogli un parametro q contenente la stringa di ricerca. Vedremo più avanti come implementare questo controller e la view corrispondente.
src/main/webapp/WEB-INF/pages/common/insertionsList.jsp:
[xml]
<table>
<thead>
<tr>
<th>Oggetto</th>
<th>Prezzo</th>
<th>Inserito il</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="detail/${item.id}.html">${fn:escapeXml(item.title)}</a></td>
<td>${item.price}</td>
<td>${item.creationDate}</td>
</tr>
</tbody>
</table>
[/xml]

Qui vediamo l’utilizzo del tag <c:forEach> per eseguire un loop su una collezione di oggetti, in questo caso per produrre l’HTML necessario a far vedere tutti gli annunci come righe di una table HTML. Per una trattazione approfondita dei tag messi a disposizione da JSTL vi rimandiamo alla documentazione ufficiale sul sito Oracle (in origine SUN, prima dell’acquisizione da parte del gigante dei database), riportato nella Linkografia.

Una nota tecnica

Negli scorsi articoli abbiamo commesso un errore nello specificare le dipendenze nel file pom.xml, nel quale avevamo inserito la dipendenza javax:javaee-api:6.0-SNAPSHOT, che va invece sostituita con javax.servlet:servlet-api:2.5. Ecco il frammento di pom.xml giusto:
[xml]
javax.servlet
servlet-api
2.5
provided
[/xml]

Per completezza abbiamo quindi allegato all’articolo un archivio con tutti i sorgenti del progetto allo stato attuale, per poter avere una base di partenza comune e per permettervi di sperimentare.
spring-3-tutorial_2011_04_09.zip

Linkografia

Condividi