Oggi vedremo come stampare il caro e vecchio Hello World. Non mi soffermo in questa sede su come preparare la IDE. Io sto usando Eclipse e se scaricate la versione comprensiva di Tomcat e le librerie Wicket, non avrete bisogno di altro. Iniziare un nuovo progetto con il template Dynamic Web Page e avrete quanto vi serve.
Parte 1 - web.xml
Per prima cosa occorre scrivere il file web.xml da inserire dentro la cartella WebContent -> WEB-INF. Questo file serve agli applicativi web di Java per capire cosa stiamo facendo. Qui l'estratto da commentare assieme:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>Heavy Example</display-name> <servlet> <servlet-name>heavyExamples</servlet-name> <servlet-class>org.apache.wicket.protocol.http.WicketServlet</servlet-class> <init-param> <param-name>applicationClassName</param-name> <param-value>it.trewps.heavyexamples.web.HeavyExampleApplication</param-value> </init-param> <init-param> <param-name>configuration</param-name> <param-value>development</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>heavyExamples</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <context-param> <param-name>webAppRootKey</param-name> <param-value>heavyExamples</param-value> </context-param> <welcome-file-list> <welcome-file>index.htm</welcome-file> </welcome-file-list> <locale-encoding-mapping-list> <locale-encoding-mapping> <locale>it</locale> <encoding>UTF-8</encoding> </locale-encoding-mapping> </locale-encoding-mapping-list> </web-app>
Le parti interessanti sono evidenziate in Rosso e Blue. Quelle in giallo indicano quale WebApplication di Wicket si occuperà di gestire tutta la nostra applicazione Web. Nel nostro caso si chiamerà HeavyExampleApplication. Sarà a tutti gli effetti una classe Java che estenderà una classe di Wicket. La parte in blu indica proprio questa classe che nel nostro esempio si trova in un package creato ex-nuovo dove metterci dentro le nostre classi. Il package, che potete chiamare come volete, va creato ovviamente nella directory src del vostro progetto.
Parte 2 - HeavyExampleApplication.java
A questo punto dobbiamo scrivere la classe Application che farà partire il tutto. E' il nocciolo del nostro progetto Web e da esso si dipanerà tutto il nostro eventuale software web. Equivale per certi aspetti alla index.php o index.asp anche se ovviamente parliamo sempre di Java.
package it.trewps.heavyexamples.web; import org.apache.wicket.Page; import org.apache.wicket.protocol.http.WebApplication; public class HeavyExampleApplication extends WebApplication{ public HeavyExampleApplication (){ } @Override public Class<? extends Page> getHomePage() { return WelcomePage.class; } }
La classe è molto semplice ed estende semplicemente la superclasse astratta WicketApplication di cui siamo costretti necessariamente ad implementare il metodo getHomePage. La parte in blu evidenzia una cosa molto comune in Java e poco conosciuta a chi viene da linguaggi poco tipizzati. In Java ogni metodo deve specificare il tipo di ritorno che può essere un tipo semplice come Interi, Stringhe ecc... o addirittura classi intere. Capita però che a volte si voglia esprimere che un metodo ritorna un oggetto di qualche tipo di cui non sappiamo il nome esatto ma sappiamo che è un oggetto di un certo tipo. Per farla breve è come se un metodo dicesse "Io ritorno qualcosa che è una bicicletta però non so quale tipo di bicicletta". In pratica quella stringa significa che la classe ritornerà una classe che estenderà sicuramente Page. Non sappiamo bene il nome della classe ma sappiamo che qualunque essa sia, sarà una estensione di Page. Ovviamente nel nostro esempio ritorniamo una classe chiamata WelcomePage ed i più malizioni avrebbero potuto dire "Non potevi metterla direttamente come tipo di ritorno del metodo?". La risposta è sì ma noi dobbiamo pensare che la nostra applicazione avrà tantissime pagine e che verranno selezionate a seconda dell'esigenza. A questo punto non ci resta che creare banalmente la classe WelcomePage che si occuperà di stampare la scritta Hello World. Qui arriva la prima importante innovazione di Java Wicket. Ogni pagina della vostra applicazione DEVE essere mappata su una classe Java che a sua volta DEVE avere associata una pagina HTML con lo stesso nome. In questo caso creeremo quindi WelocomePage.java e WelcomePage.html. I motivi ed i vantaggi di questa cosa le vedremo in seguito ma vi assicuro che vi stupiranno.
Parte 3 - WelcomePage.java
package it.trewps.heavyexamples.web; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; public class WelcomePage extends WebPage{ public WelcomePage(){ add(new Label("content","Hello World")); } }
Anche qui il codice è molto semplice. Estendiamo la classe WebPage di Wicket sottostando così al vincolo del metodo getHomePage chiamato dalla WebApplication. Nel costruttore lanciamo semplicemente il metodo interno add creando al volo un nuovo Label con scritto Hello World associato al wicket ID content. So che in questo momento questa scritta a poco senso ma vi sarà tutto chiaro quando andremo a vedere il codice HTML.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Benvenuti su Heavy Wicket</title> </head> <body> <div id="pageContainer"> <div wicket:id="content"></div> </div> </body> </html>
La pagina è una comune pagina HTML nella quale però possiamo vedere una cosa interessante. In rosso abbiamo evidenziato un parametro di wicket che associa quel DIV ad un ID di Wicket chiamato content che guarda caso è lo stesso del costruttore della nuova Label. In pratica stiamo creando un'area sensibile della pagina nella quale inserire qualcosa.
IMPORTANTE: In Wicket gli ID di una pagina devono essere univoci. Dato che Wicket è fortemente orientato al riutilizzo del codice, conviene creare ID molto specifici così da evitare sovrapposizioni con altri parti di codice Wicket scritte magari da altre persone.
Ovviamente io ho appena violato questa regola chiamando l'ID semplicemente content ma essendo questo un esempio mi perdonerete. A questo punto non ci serve altro. In Eclipse lanciate il progetto scegliendo ovviamente l'opzione RUN AS -> RUN ON SERVER per aprire il Wizard che la prima volta vi chiederà di selezionare quale server usare. Dovreste avere TomCat 6 se avete scaricato il pacchetto di Eclipse.
Parte 5 - Conclusioni
La prima cosa che dissi quando vidi questo esempio è "Che bordello". Venendo da PHP dove basta fare echo "Hello World" mi sembrava quantomai verboso tutto questo giro. La risposta è "Avete ragione".
La domanda è malposta però. Java e successivamente Wicket (ricordo infatti che Wicket è solo uno dei framework esistente per renderizzare contenuti web) servono e mostrano la loro potenza su progetti molto grossi dove la capacità di astrazione delle logiche web ed il riutilizzo del codice si fa molto sentire. La potenza di Wicket sta nel fatto che d'ora in avanti farete solo HTML puro (con qualche ID) e classi Java che gestiranno la logica del vostro programma (richieste al DB e gestione dati) lasciando quindi a Wicket la parte più pallosa.
State con me e ne vedrete delle belle.
Nessun commento:
Posta un commento