|
Le
servlet generalmente producono HTML, eseguendo println sull'output
stream fornito dal WebServer. Sebbene per una servlet semplice può
essere sensato cablare l'HTML nel codice, in pratica è sempre
separare l'HTML in un file a parte, magari costruito utilizzando un
editor WYSYWYG. Non è diverso dal concetto di separare il
disegno l'interfaccia dal codice di gestone eventi, tipico dello
sviluppo di GUI. La servlet API non offre nessuna facility del
genere, anche se esiste già la specifica nota come Java Server
Pages che consente l'embedding di codice Java in una pagina HTML allo
stesso modo delle ASP. Le implementazioni di Java Server Pages che
conosco sono tutte a pagamento, e inoltre hanno degli svantaggi, più
che altro di logica dell'applicazione. Il framework che stiamo
costruendo ci permette di evitare l'acquisto di servlet engine con le
JSP, e di ottenere la separazione tra HTML e Java utilizzando un
compilatore di HTML JSP-like.
Il
mio JSPCompiler, in Java, incluso nel codice dell'articolo che può
essere scaricato dal sito di PDJ e dal mio sito. Il JSPCompiler
trasforma un File.html in un File.java. Questo file,
una volta compilato, genera una classe le cui istanze hanno un metodo
expand per produrre in output l'HTML originario. Questo è
già un vantaggio, però non è determinante. La
cosa importante è che supporta dei tag ASP-like per
incorporare Java nell'HTML. Per cui se scriviamo un file.html come
questo:
<h1>Test</h1>
<%for(int
i=1;i<3;++i){%>
<p>Hello,
world</p>
<%}%>
compilandolo
otterremo una classe Java come questa:
class
Test {
public
void expand(HttpData data) {
data.println("<h1>Test</h1>");
for(int
i=1;i<3;++i) {
data.println("<p>Hello,
world</p>");
}
data.flush();
}
}
Normalmente in una servlet costruisco tutte le istanze
delle pagine, nella inizializzazione e le uso per produrre i
risultati delle azioni eseguite dalle servlet. Il JSPCompiler
fornisce anche una sorta di "variabili", per cui una
stringa come %var% viene tradotta in "compilazione"
come data.get("var"), per cui posso utilizzare la
classe come un template da istanziare e l'HttpData come "ambiente"
delle variabili che verranno espanse dal template. Il JSPCompiler
supporta anche il concetto di "campo" di una query, per
cui %!field% viene trasformato in data.fget("field").
Questa feature deve venire utilizzata in un contesto come questo:
<table>
<%if(data.initRSLoop)
do {%>
<tr><td>%!nome%</td>
<td>%!email%</td>
<%}
while(data.RSLoop()); %>
</table>
per
stampare i risultati ottenuti da un ResultSet. Nel listato 3
c'è un ampio esempio d'uso che commenteremo più avanti.
Normalmente utilizzo il JSPCompiler installandolo nel menù
Tools del JBuilder, e trovo la cosa molto comoda: infatti posso
editare tranquillamente il mio HTML dal JBuilder stesso che è
dotato di un previewer di HTML, poi compilo la pagina e infine
compilo il tutto per produrre la servlet. Notare che il JSPCompiler
non è esattamente come le JavaServerPages, e possiede alcuni
tag in più (come il <%%package mio.package%>).
|