XML/Cocoon
- Comprendere la funzione di Cocoon
- Creare una sitemap funzionante
- Rendere disponibile un documento XML formattato in fogli di stile
- Creare un semplice form di Cocoon
- Creare un semplice XSP
Cocoon è un prodotto di Apache Software Foundation. È un potente server basato principalmente su tecnologia Java e XML. Sebbene abbia un'interfaccia a riga di comando, la maggior parte degli utenti sarà in grado di fare tutto ciò di cui ha bisogno semplicemente modificando attentamente alcuni file di configurazione, formattati come documenti XML.
Se vuoi vedere alcuni esempi di ciò che Cocoon può fare, vai a http://MIST5730.terry.uga.edu:8080/cocoon/
Presupposti
[modifica | modifica sorgente]Questo tutorial è pensato per un utente che abbia accesso a un'installazione di Cocoon sul server Blaze di Terry. Se non si dispone di questo accesso, è sufficiente sostituire le posizioni dei file e i metodi di accesso con quelli forniti dall'amministratore del server. Alcuni programmi descritti potrebbero funzionare solo su Windows; dovrai trovare un sostituto adatto se sei un utente Macintosh o Linux, sebbene queste utility siano spesso incluse nel sistema operativo. JEdit è un editor di testo libero in grado di leggere e salvare i file su un server FTP o SFTP con la stessa facilità con cui salverebbe su un disco rigido, e con i plugin appropriati può manipolare correttamente molti tipi diversi di file. È disponibile per Windows, Macintosh, per alcune distribuzioni Linux e come applicazione Java indipendente dalla piattaforma http://www.jedit.org/
La Sitemap
[modifica | modifica sorgente]Il principale file Cocoon di cui occuparsi è sitemap.xmap, che si trova nella directory radice di Cocoon. Usa tag XML per definire cose come i diversi modi di presentare i dati, la posizione dei file importanti, l'identificazione dei browser e, aspetto più importante, le pipeline. L'xmap di default andrà bene per i nostri scopi, e avremo solo bisogno di guardare le ultime righe di esso, dove sono definite le corrispondenze (matches) della pipeline. Questa sezione inizia con il tag <map:pipeline>
. Una pipeline match si presenta così:
<map:match pattern=”test”>
<map:generate type=”file” src=”content/test.xml”/>
<map:transform type=”xslt” src=”stylesheets/test.xslt”/>
<map:serialize type=”html”/>
</map:match>
Diamo un'occhiata a ciò che fa ogni linea. La prima riga dice a Cocoon di guardare se qualcuno sta navigando su http://blaze.terry.uga.edu:8080/cocoon/otc/test . Quando ciò accade, hanno luogo le azioni sulle tre linee successive. Cocoon preleva le informazioni dal file test.xml all'interno della directory del contenuto e applica il foglio di stile test.xslt dalla directory dei fogli di stile. Formatta quindi questo risultato come una pagina HTML, come specificato nella quarta riga. Cocoon può utilizzare diversi serializzatori per formattare i dati come pagine HTML o XHTML, oggetti flash, pdf o persino documenti OpenOffice. A differenza di quando si lavora con XML per altri scopi, non è necessario uno schema XSD: basta creare e compilare i campi necessari nel file XML.
I form di Cocoon
[modifica | modifica sorgente]I form Cocoon, o CForms, sono un modo per usare la struttura XML per creare oggetti di campo form di validazione e poi sistemarli in un template per l'uso. Il vantaggio principale di CForm rispetto all'utilizzo dei form HTML è che i campi possono essere convalidati sia con funzionalità integrate sia con semplici attributi XML. Per questo sono necessari diversi elementi. Un file XML di definizione che contiene i campi, chiamato "widget":
<fd:field id="email" required="true">
<fd:label>Email address:</fd:label>
<fd:datatype base="string"/>
<fd:validation>
<fd:email/>
</fd:validation>
</fd:field>
Un file template XML richiama questi widget, aggiungendo il codice HTML per aiutare con l'aspetto grafico:
<ft:widget-label id="email"/>
<ft:widget id="email"/>
Un file Javascript che controlla il flusso di dati da un file al successivo:
function registration() {
var form = new Form("registration_definition.xml");
form.showForm("registration-display-pipeline");
var viewData = { "username" : form.getChild("name").getValue() }
cocoon.sendPage("registration-success-pipeline", viewData);
}
Pipiline nella sitemap che controllano anche il flusso:
<map:match pattern="registration">
<map:call function="registration"/>
</map:match>
...
<map:match pattern="registration-display-pipeline">
<map:generate type="jx" src="registration_template.xml"/>
<map:transform type="i18n">
<map:parameter name="locale" value="en-US"/>
</map:transform>
<map:transform src="forms-samples-styling.xsl"/>
<map:serialize/>
</map:match>
...
<map:match pattern="registration-success-pipeline">
<map:generate type="jx" src="registration_success.jx"/>
<map:serialize/>
</map:match>
Un XSP può essere utilizzato in questo flusso per trasferire le presentazioni a un database.
XSP
[modifica | modifica sorgente]Gli XSP funzionano in modo simile alle servlet e alle JSP (JavaServer Pages): sono applicazioni lato server in grado di supportare più utenti contemporaneamente. A differenza delle JSP e delle servlet, gli XSP possono utilizzare i tag XML per realizzare gran parte delle loro funzionalità, sebbene possano anche utilizzare il codice Java tra i tag <xsp:logic></xsp:logic>
. Un buon uso per XSP è il passaggio di informazioni a un database o il richiamo e la visualizzazione di dati memorizzati. Mentre JSP e servlet devono chiamare un connettore di database specifico o contenere tutto il codice per collegarsi al loro interno, Cocoon ha un file di configurazione che contiene queste informazioni, e gli XSP chiamano semplicemente il nome del database come specificato in WEB-INF/cocoon.xconf:
<esql:pool>dbname</esql:pool>
Il codice XSP per inserire dati da un form potrebbe assomigliare a questo:
<esql:execute-query>
<esql:query>
INSERT into otc_users (name,email,password,age,spam) values ('<xsp:expr>esc_name</xsp:expr>','<xsp-request:get-parameter name="email"/>','<xsp-request:get-parameter name="password"/>','<xsp-request:get-parameter name="age"/>','<xsp-request:get-parameter name="spam"/>')
</esql:query>
</esql:execute-query>