Creare siti dinamici con Sitemesh – Parte III

SitemeshDa diversi anni ormai ha preso piede l’utilizzo intelligente dei Cascading Style Sheet (CSS); in particolar modo, grazie a iniziative come CSS Zen Garden e molti altri a seguire, si è dimostrato che è possibile avere una gran varietà di ottimi layout utilizzando una struttura HTML comune e dei fogli di stile CSS progettati a dovere.

Questo approccio si è rivelato molto potente sotto diversi aspetti. Il suo pregio maggiore è che diventa possibile rivoluzionare completamente la grafica di un sito agendo (quasi) solamente sui CSS, inoltre questo modo di lavorare si adatta molto bene anche a siti statici, ovvero siti il cui HTML non è generato automaticamente. Da ultimo, ma non meno importante, ha educato i web designer alla pulizia e alla razionalità, qualità praticamente inesistenti sui primi siti degli anni ’90, permettendo fra l’altro la nascita di molti framework CSS e convenzioni di progettazione usate tutt’oggi.

Cambiare layout da CSS

Vediamo quindi in semplice esempio una delle tecniche più utilizzate dai “guru” del CSS, ovvero il rendering della pagina con layout diversi in base ad una semplice modifica all’HTML della pagina. Il trucco è molto semplice, si tratta di:

  • assegnare un attributo id al tag <body>;
  • creare delle regole nel file CSS che posizionano i vari elementi di una pagina in base al valore (se presente) di questo id.

Vediamo in concreto come fare, per farlo modificheremo il decorator e i CSS del progetto creato nelle scorse puntate (vedi parte I e parte II).

Copiare questo codice sorgente in main.jsp:

&lt;span style=&quot;font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;&quot;&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;&lt;/span&gt;
&lt;pre&gt;   &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;%@ taglib prefix=&quot;decorator&quot; uri=&quot;http://www.opensymphony.com/sitemesh/decorator&quot; %&gt;
&lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&gt;
&lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&gt;
&lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/functions&quot; prefix=&quot;fn&quot; %&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
  &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
  &lt;title&gt;Il mio sito web | &lt;decorator:title default=&quot;Nessun titolo&quot; /&gt;&lt;/title&gt;
  &lt;style type=&quot;text/css&quot;&gt;@import &quot;css/style.css&quot;;&lt;/style&gt;
  &lt;decorator:head /&gt;
&lt;/head&gt;
&lt;c:set var=&quot;hideBanner&quot;&gt;&lt;decorator:getProperty property=&quot;meta.hideBanner&quot; /&gt;&lt;/c:set&gt;
&lt;c:set var=&quot;bodyID&quot;&gt;&lt;decorator:getProperty property=&quot;body.id&quot; writeEntireProperty=&quot;true&quot; /&gt;&lt;/c:set&gt;
&lt;body ${bodyID}&gt;
  &lt;div id=&quot;container&quot;&gt;
    &lt;div id=&quot;masthead&quot;&gt;
      &lt;h1&gt;&lt;decorator:title default=&quot;Nessun titolo&quot; /&gt;&lt;/h1&gt;
    &lt;/div&gt;
    &lt;div id=&quot;navigation&quot;&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;index.html&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;page2.html&quot;&gt;Page 2&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;page3.html&quot;&gt;Page 3&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
    &lt;div id=&quot;content-wrap&quot;&gt;
      &lt;div id=&quot;content&quot;&gt;
        &lt;c:if test=&quot;${hideBanner ne 'true'}&quot;&gt;
          &lt;div style=&quot;border: 1px solid black; width: 468px; height: 60px&quot;&gt;
            Questo  un banner pubblicitario
          &lt;/div&gt;
        &lt;/c:if&gt;
        &lt;decorator:body /&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;

Da notare l’utilizzo del tag <decorator:getProperty>:

  • property=”body.id” indica a Sitemesh ti scrivere in output il valore dell’attributo id del tag body;
  • writeEntireProperty=”true” indica a Sitemesh di includere tutto l’attributo, ovvero se nella pagina da decorare abbiamo:<body id="xyz"> verrà scritto in output id="xyz" e non semplicemente xyz;
  • per una migliore pulizia del codice viene utilizzato, come per la variabile hideBanner, il tag <c:set> che assegna il valore di questo attributo alla variabile bodyID, in modo da poterla utilizzare con la notazione di Expression Language delle JSP (abbreviata con EL) in questo modo: ${bodyID}.

Creare ora il file src/main/webapp/css/style.css:

/* Stile e layout di default */

body {
  background-color: #000;
}
div#masthead, div#masthead h1, div#navigation, div#content {
  margin: 0; padding: 0;
}
div#container {
  background-color: #00f;
}
div#masthead {
  background-color: #f00; color: #fff;
}
div#navigation {
  background-color: #ff0;
}
div#navigation li {
  display: inline;
  list-style-type: none;
  padding-right: 20px;
}
div#content {
  background-color: #fff;
  margin: 0;
}
/* Layout speciali */
body#layout_2 div#navigation {
  float: left;
  width: 300px;
}
body#layout_2 div#navigation li {
  display: block;
}
body#layout_2 div#content-wrap {
  margin-left: 300px;
}

Da notare:

  • il file è diviso in due parti: nella prima viene definito lo stile e il layout di default per i vari elementi;
  • nella seconda parte alcuni degli stili vengono sovrascritti (ecco perché vengono definiti dopo);
  • gli stili “speciali” sono applicati solamente quando il tag <body> ha un attributo id=”layout_2″;
  • ad ogni elemento del layout è stato assegnato un colore molto forte (e decisamente… orribile!), per evidenziarne la disposizione.

Si consiglia di inserire qualche paragrafo di testo nelle pagine index.html, page2.html e page3.html, ad esempio utilizzando uno dei tanti generatori di Lorem Ipsum (vedi linkografia). In questo modo sarà possibile testare in maniera più precisa le modifiche di stile.

Test delle pagine

Per verificare i diversi layout, aggiungiamo l’attributo id=”layout_2″ al tag <body> di src/main/webapp/page3.html poi eseguiamo il build del progetto con il comando di Maven:

mvn package

In allegato all’articolo abbiamo messo un archivio contenente il progetto, pronto da testare:
Progetto di esempio (clic per scaricare)

Linkografia