Fra i sistemi avanzati basati su mod_perl, HTML::Mason è sicuramente a mio
avviso, il più flessibile. Nato un paio di anni fa come strumento di web
publishing proprietario, è stato poi rilasciato sotto licenza opensource ed è
nel tempo diventato stabile e maturo consentendo in maniera rapida e veloce la
gestione di grossi siti con notevole quantità di contenuti dinamici.
L'idea di base di HTML::Mason è il componente: un componente è un mix di
HTML e Perl e comandi HTML::Mason. Un componente in genere restituisce codice
HTML ma può anche ritornare un valore. È possibile assemblare questi componenti
in componenti più complessi. Infine è definito il componente top-level che
rappresenta l'intera pagina web formata a sua volta da uno o più componenti.
Questa architettura a componenti può essere vista come una rappresentazione
orientata agli oggetti della propria web application e rappresenta un notevole
vantaggio nella manutenzione ed aggiornamento del sito: ogni cambiamento ad un
componente condiviso avrà immediatamente effetto su tutte le pagine che lo
utilizzano.
La sintassi a componenti di HTML::Mason inoltre ben si presta a dividere
presentazione e logica consentendo di utilizzare comodi sub componenti da
inserire e utilizzare nelle pagine web. Il webmaster quindi non necessariamente
deve avere una profonda conoscenza di programmazione e può concentrarsi sul
layout della pagina HTML con il vantaggio di poter utilizzare il contenuto
dinamico generato dai componenti. HTML::Mason è disponibile su CPAN e
l'installazione non presenta particolari problemi. Una volta installato va
attivato configurando Apache (in httpd.conf) con le seguenti direttive:
PerlRequire /home/web/mod_perl/mason/handler.pl
Alias /mason "/home/web/mod_perl/mason/www"
<Location /mason>
SetHandler perl-script
PerlHandler HTML::Mason
</Location>
Con tale configurazione lanciamo lo script Perl handler.pl (Esempio 1) per
avviare e configurare HTML::Mason e con <Location> lo attiviamo
per tutte le richieste ad URL che iniziano con /mason. comp_root
rappresenta la directory dove andremo a salvare tutti i nostri componenti e deve
essere la stessa di quella mappata con la direttiva Alias in httpd.conf.
Esempio 1. handler.pl, script di avvio di HTML::Mason
#!/usr/bin/perl
package HTML::Mason;
# Usa il package Mason
use HTML::Mason;
use HTML::Mason::ApacheHandler (args_method=>'mod_perl');
use strict;
# Elenco di tutti moduli che verranno usati nei componenti
{
package HTML::Mason::Commands;
use DBI;
use LWP;
}
# Crea gli oggetti Mason
my $parser = new HTML::Mason::Parser;
my $interp = new HTML::Mason::Interp (
parser => $parser,
comp_root => '/home/web/mod_perl/mason/www',
data_dir => '/home/web/mod_perl/mason/data');
my $ah = new HTML::Mason::ApacheHandler (interp => $interp);
chown (Apache->server->uid, Apache->server->gid, $interp->files_written);
sub handler {
my ($r) = @_;
my $status = $ah->handle_request($r);
return $status;
}
1;
__END__
Come esempio di funzionamento di HTML::Mason illustriamo la realizzazione di
un semplice componente top-level (cioè una pagina web) che stampa le variabili
di ambiente. È un esempio banale nel quale però abbiamo modo di soffermarci
sulle principali caratteristiche di HTML::Mason (Esempio 2).
Esempio 2. env.html, semplice componente top-level HTML::Mason
<%perl>
my @column_names = ("Chiave", "Valore");
</%perl>
<CENTER><H2><% $titolo %></H2>
<TABLE WIDTH="90%" BORDER="0">
<TR BGCOLOR="#CCCCCC">
<TH><% $column_names[0] %></TH>
<TH><% $column_names[1] %></TH>
</TR>
% foreach my $key ( sort keys %{$r->subprocess_env} ) {
<TR <& .bgcolor &>>
<TD><B><% $key %></B></TD>
<TD><% $r->subprocess_env($key) %></TD>
</TR>
% }
</TABLE><CENTER>
<& footer.comp &>
<%def .bgcolor>
BGCOLOR="#<% $row_colors[$i] %>"\
% $i = !$i;
</%def>
<%init>
my $titolo = "Variabili di ambiente";
$i= 0;
</%init>
<%once>
my $i;
my @row_colors = ("FFFFFF","DDDDFF");
</%once>
In un componente HTML::Mason possiamo inserire codice Perl all'interno delle
apposite sezioni <%perl></%perl>. Inoltre ogni linea che
inizia con '%' viene considerata come codice Perl. Infine tutto ciò che è
compreso nei blocchi <% expr %> viene valutato come singola
espressione Perl e sostituito con il risultato (tipicamente usato per la stampa
delle variabili).
Il codice Perl può essere eseguito anche in altre due speciali
sezioni <%init> e <%once>.
La sezione <%init> contiene codice eseguito ogni volta non appena il
componente viene chiamato e può essere utilizzata per operazioni appunto di
inizializzazione del componente.
La sezione <%once> consente invece di scrivere codice Perl che verrà
eseguito solo la prima volta che il componente viene invocato.
All'interno di un componente è possibile richiamare un altro componente tramite
la sintassi:
<& component_path &>
Nel nostro esempio signature.comp è stato salvato nella stessa directory del
componente top-level env.html e cioè /home/web/mod_perl/mason/www.
Esiste infine un componente speciale chiamato autohandler che, se presente
nella directory, viene sempre invocato prima di ogni altro componente top-level.
Con il metodo $m->call_next passiamo poi il controllo al componente
effettivamente richiesto (Esempio 4). Questo componente si rivela assai utile
quando abbiamo la necessità di cambiare layout (ad esempio header e footer) in
un grande numero di pagine in una stessa directory o vogliamo inizializzare
particolari oggetti come la connessione ad un database o il ripristino di una
sessione.
Esempio 3. footer.comp, semplice componente HTML::Mason
<HR>
<ADDRESS>
Enrico for Linux&C - <% scalar localtime %>
</ADDRESS>
Esempio 4. autohandler, lo speciale componente HTML::Mason
<HTML>
<HEAD>
<TITLE>HTML::Mason test</TITLE>
</HEAD>
<BODY>
<% $m->call_next %>
</BODY>
</HTML>
Lanciamo con nostro browser la URL http://localhost/mason/env.html e otterremo
la videata di Figura 1. HTML::Mason è molto di più di quello esposto fino ad
ora disponendo di tutte le funzionalità tipiche di un application server
commerciale: dal caching dei componenti, all'ambiente di debugging, dal
previewer integrato alla gestione delle sessioni. Inoltre la libreria dei
componenti di HTML::Mason si arricchisce di giorno in giorno grazie al
contributo dei numerosi adepti della comunità HTML::Mason. In definitiva
possiamo a buon diritto considerare HTML::Mason alla stessa stregua di quello
che Zope rappresenta per la comunità Python.
Figura 1. Output della pagina HTML::Mason
env.html 
|