Tecnologie Web: Parte 6f [Martedì, 16 Maggio 2006]

Home /  Teaching


Verso JSTL: Java Beans

Un java bean è un oggetto prodotto da una classe molto generica che rispecchi due semplici proprietà:

I java bean non sono definiti dalle specifiche JSP nè il loro uso è necessariamente limitato allo sviluppo di applicazioni WEB. Di certo JSP fornisce strumenti per accedere facilemente a un oggetto java bean. Vediamoli attraverso un esempio. Ecco un java bean che memorizza il nome ed il cognome di un utente.


package dati;

import java.io.*;

public class DatiUtente implements Serializable {
	private static final long serialVersionUID = -4494204860444161325L;
	private String nome;
	private String cognome;
	
	public DatiUtente() {
	}
	
	public void setNome(String valoreNome) {
		this.nome=valoreNome;
	}
	
	public void setCognome(String valoreCognome) {
		this.cognome=valoreCognome;
	}

	public String getNome() {
		return this.nome;
	}
	
	public String getCognome() {
		return this.cognome;
	}
	
}

Ecco una banale pagina JSP che utilizza il bean. La novità stà nei tag di azione jsp <jsp: /> che non avevamo mai visto. Questi tag permettono varie azioni standard (include, forward, etc.) tra le quali un set di azioni per l'azione su di java beans. jsp:useBean serve e creare nel contesto prescelto (di default Page) l'oggetto bean indicato. jsp:getProperty e jsp:setProperty modificano le proprietà del bean.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Utilizzo di un bean per i dati dell'utente</title>
</head>
<body>
<jsp:useBean id="beanUtente" class="dati.DatiUtente" />
<jsp:setProperty name="beanUtente" property="nome" value="Roberto" />
<jsp:setProperty name="beanUtente" property="cognome" value="Sassi" />

<h3>Benvenuto!</h3>

<p>Salve, <b>
<jsp:getProperty name="beanUtente" property="nome" />
<jsp:getProperty name="beanUtente" property="cognome" />
</b> il tuo nome è stato inserito in un Java Bean!.</p>
</body>
</html>

Da JSP 2.0 in avanti, si preferisce utilizzare il linguaggio EL per accedere alle proprietà dei beans. Il codice sopra, potrebbe essere riscritto:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Utilizzo di un bean per i dati dell'utente</title>
</head>
<body>
<jsp:useBean id="beanUtente" class="dati.DatiUtente" />
<c:set target="${beanUtente}" property="nome" value="Roberto" />
<c:set target="${beanUtente}" property="cognome" value="Sassi" />

<h3>Benvenuto!</h3>

<p>Salve, <b>${beanUtente.nome} ${beanUtente.cognome}</b> 
il tuo nome è stato inserito in un Java Bean!.</p>
</body>
</html>

Primi passi JSTL: un paio di esempi

Vediamo come modificare la pagina JSP ElaboraSelezioni.jsp utilizzata durante la scorsa esercitazione.

Prima possibilità:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Checkbox multipli</title>
</head>
<body>
<h3>L'elenco dei linguaggi di programmazione che conosci è:</h3>
<c:forEach items="${paramValues.linguaggioConosciuto}" var="questoLinguaggio">
    <c:if test="${questoLinguaggio=='HTML'}" >
        HTML? non è un linguaggio di programmazione ma di markup!
    </c:if>
    <c:if test="${questoLinguaggio!='HTML'}" >
        ${questoLinguaggio}
    </c:if>
    <br />
</c:forEach>
</body>
</html>

Seconda possibilità:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Checkbox multipli</title>
</head>
<body>
<h3>L'elenco dei linguaggi di programmazione che conosci è:</h3>
<c:forEach items="${paramValues.linguaggioConosciuto}" var="questoLinguaggio">
    <c:choose>
        <c:when test="${questoLinguaggio=='HTML'}">
            HTML? non è un linguaggio di programmazione ma di markup!
        </c:when>
        <c:otherwise>
            ${questoLinguaggio}
        </c:otherwise>
    </c:choose>     
    <br />
</c:forEach>
</body>
</html>

Primi passi JSTL: l'esempio show_book.jsp

Questo esempio è contenuto nelle dispense e riportato qui solo per facilitare la lettura. L'esempio è preso dal capitolo 5 del libro di David Geary "Core JSTL: Mastering the JSP Standard Tag Library" (Prentice Hall, 2003) e disponibile all'indirizzo http://www.theserverside.com/tt/articles/content/CoreJSTL/article.html . Per renderlo utilizzabile con JSP 2.0 e compatibile con la nuova veste grafica del sito Amazon.com è stato adattato (quindi c'è qualche modifica con quello nelle dispense.

Il file BookSelection.jsp. Andate all'indirizzo http://jsp.dti.unimi.it/rsassi/BookSelection.jsp per vederlo funzionare.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
  <title>Book Selection</title>
  </head>
  <body>
  <%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
  <font size='5'> Select a book: </font><br />
  
  <%-- Create URLs for each book with a page-relative path
    to show_book.jsp and a request parameter named bookUrl
    whose value represents the book's URL on Amazon.com.
    Those URLs are stored in page-scoped variables that
    are used to create HTML links below --%> 

  <c:url  var='ApacheStruts' value='show_book.jsp'>
    <c:param name='bookUrl' 
      value='http://www.amazon.com/gp/product/1930110502/sr=8-1/qid=1147858062/ref=pd_bbs_1/104-1064078-9261503?%5Fencoding=UTF8' />
  </c:url> 

  <c:url var='PracticalJSTL' value='show_book.jsp'>
    <c:param name='bookUrl' 
      value='http://www.amazon.com/gp/product/0126567557/qid=1147858345/sr=11-1/ref=sr_11_1/104-1064078-9261503?n=283155' />
  </c:url> 

  <c:url var='CoreJSTL' value='show_book.jsp'>
    <c:param name='bookUrl' 
      value='http://www.amazon.com/gp/product/0131001531/qid=1147858406/sr=11-1/ref=sr_11_1/104-1064078-9261503?n=283155' />
  </c:url> 

  <c:url var='JSTLAction' value='show_book.jsp'>
    <c:param name='bookUrl' 
      value='http://www.amazon.com/gp/product/1930110529/qid=1147858452/sr=11-1/ref=sr_11_1/104-1064078-9261503?n=283155' />
  </c:url> 

  <%-- Create HTML links for each book using the URLs stored
    in page-scoped variables that were created above by
    <c:url> --%>
    
  <a href='<c:out value="${ApacheStruts}"/>'>
    Struts in Action: Building Web Applications with the Leading Java Framework
  </a><br />
  <a href='<c:out value="${PracticalJSTL}"/>'>
    JSTL : Practical Guide for JSP Programmers 
  </a><br />
  <a href='<c:out value="${CoreJSTL}"/>'>
    Core JSTL: Mastering the JSP Standard Tag Library 
  </a><br />
  <a href='<c:out value="${JSTLAction}"/>'>
    JSTL in Action 
  </a><br />
</body>
</html>

ed il file show_book.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Book Information</title>
</head>
<body>
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>

<%-- Declare the Jakarta Strings tag library --%>
<%@ taglib uri='WEB-INF/taglibs-string.tld' prefix='str'%>

<%-- Import the page from Amazon.com using the bookUrl request parameter --%>
<c:import var='book' url='${param.bookUrl}' />

<%-- Store today's date and time in page scope --%>
<jsp:useBean id='now' class='java.util.Date' />
<table>
  <tr>
    <td>Book:</td>
    <td><i> 
      <%-- Show the book title --%>
      <%-- Dal momento che utilizziamo c:out per stampare sullo stream
      della richiesta, i caratteri "proibiti" (come <, >, &, etc.) per HTML 
      vengono convertiti nei caratteri speciali equivalenti (&lt;, &gt;, &amp;).
      Le stringhe open e close devono tenere conto di questo in quanto
      la libreria di tag string lavora sull'output della funzione di stampa
      annidata. --%>
      <str:nestedString open='&lt;title&gt;Amazon.com: ' close=': Books: '>
        <c:out value='${book}' />
      </str:nestedString>
    </i></td>
  </tr>
  <tr>
    <td>Rank:</td>
    <td><i> 
      <%-- Show the book rank --%> 
      <str:nestedString open="Sales Rank:&lt;/b&gt;  #" close=' in Books (See '>
        <c:out value='${book}' />
      </str:nestedString>
    </i></td>
  </tr>
  <tr>
    <td>Average Review:</td>
    <td><i> 
      <%-- Show the average review --%> 
      <str:replace replace='-' with='.'>
        <str:nestedString open='stars-' close='.gif'>
          <c:out value='${book}' />
        </str:nestedString> stars
      </str:replace>
    </i></td>
  </tr>
  <tr>
    <td>Date and Time:</td>
    <td><i> 
      <c:out value='${now}' />
    </i></td>
  </tr>
</table>
</body>
</html>