Tapestry 5 in Action Pratica

1,437 views
1,400 views

Published on

Jakarta Tapestry è un framework basato su un modello a componenti che si distacca dall’approccio imperante del MVC. Durante il talk sarà sviluppata una semplice web application, un Joke box online, che permetterà di apprendere i concetti e le features di Tapestry 5. In particolar modo si cercherà di illustrare come un approccio a componenti permetta di sfruttare a pieno i vantaggi della programmazione ad oggetti, rendendo trasparente la gestione di sessione e request, consentendo allo sviluppatore di concentrarsi sullo stato dell'oggetto, delegando al framework il mapping tra componenti e templates e l'aggiornamento degli oggetti del model. I sofisticati componenti offerti da Tapesrty consento di realizzare pagine dotate di comportamenti complessi con uno sforzo ridotto. Il tutto senza implementare/estendere neanche una interfaccia/classe dell'infrastruttura.

Published in: Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,437
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
40
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Tapestry 5 in Action Pratica

  1. 1. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Pratica Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 1 Tapestry5 in action Javaday Roma - 01/12/2007
  2. 2. Indice Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Preparare l'ambiente ● Creiamo la nostra prima page ● Creiamo un componente per gestire il layout ● Creiamo un componente per il login/logout ● La pagina di iscrizione utente ● L'upload di un file ● Realizziamo il jukebox ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 2 Tapestry5 in action Javaday Roma - 01/12/2007
  3. 3. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Preparare l'ambiente Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 3 Tapestry5 in action Javaday Roma - 01/12/2007
  4. 4. Preparare l'ambiente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Software utilizzato: JDK 1.6 (mustang) – Servlet specification 2.4 – Maven2 – Eclipse 3.2 – Maven2 plugin ● Jetty launcher 1.4.1 ● Jetty 4.2.27 – Mysql Server 5.0 – Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 4 Tapestry5 in action Javaday Roma - 01/12/2007
  5. 5. Preparare l'ambiente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Prima di cominciare installiamo nel repository ● (locale) di maven tre jar previa scaricati: jukemodel-1.0.0.jar (allegato alla presentazione) – jid3lib-0.5.4.jar, JLayer(mp3 util, reperibili qui e qui) – jta-1.0.1B.jar (java transaction api, reperibile qui) – mvn install:install-file -DgroupId=jukemodel -DartifactId=jukemodel -Dversion=1.0.0 -Dpackaging=jar -Dfile=/jarfile/path -DpomFile=/pomfile/path mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar -Dfile=/jarfile/path mvn install:install-file -DgroupId=jid3lib -DartifactId=jid3lib -Dversion=0.5.4 -Dpackaging=jar -Dfile=/jarfile/path mvn install:install-file -DgroupId=JLayer -DartifactId=JLayer -Dversion=1.0.0 -Dpackaging=jar -Dfile=/jarfile/path Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 5 Tapestry5 in action Javaday Roma - 01/12/2007
  6. 6. Preparare l'ambiente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Ok, apriamo eclipse creiamo il nostro maven2 ● project “jukeweb” File -> new -> project – Maven2 -> Maven2 project ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 6 Tapestry5 in action Javaday Roma - 01/12/2007
  7. 7. Preparare l'ambiente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Create project: Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 7 Tapestry5 in action Javaday Roma - 01/12/2007
  8. 8. Preparare l'ambiente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Configure project: Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 8 Tapestry5 in action Javaday Roma - 01/12/2007
  9. 9. Preparare l'ambiente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creato il progetto aggiungiamo le dipendenze: <dependencies> <dependency> <groupId>jukemodel</groupId> <artifactId>jukemodel</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.apache.tapestry</groupId> <artifactId>tapestry-spring</artifactId> <version>5.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>2.0.2</version> </dependency> <dependencies> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 9 Tapestry5 in action Javaday Roma - 01/12/2007
  10. 10. Preparare l'ambiente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Ora dovremmo avere tutte le librerie necessarie. Non ci resta che creare e configurare il web.xml [...] <context-param> <param-name>tapestry.app-package</param-name> <param-value>javaday.jukebox.web</param-value> </context-param> <filter> <filter-name>juke</filter-name> <filter-class> org.apache.tapestry.TapestryFilter </filter-class> </filter> <filter-mapping> <filter-name>juke</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 10 Tapestry5 in action Javaday Roma - 01/12/2007
  11. 11. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creiamo la nostra prima page Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 11 Tapestry5 in action Javaday Roma - 01/12/2007
  12. 12. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Start.java: package javaday.jukebox.web.pages; public class Start { } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 12 Tapestry5 in action Javaday Roma - 01/12/2007
  13. 13. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Start.tml: <html> <head> <title>home page</title> </head> <body> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! </body> </html> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 13 Tapestry5 in action Javaday Roma - 01/12/2007
  14. 14. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Start.tml: <html> <head> <title>home page</title> </head> <body> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! </body> </html> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 14 Tapestry5 in action Javaday Roma - 01/12/2007
  15. 15. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License La sintassi ${[prefix:]expression[.nestedExpr]} ● è detta Expansions. In un' expansions: ● L'espressione passata viene interpretata secondo le – regole di binding La regola da usare viene selezionata con un prefisso – prop (default) ● literal ● message ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 15 Tapestry5 in action Javaday Roma - 01/12/2007
  16. 16. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Bene, è giunto il momento di lanciare per la prima volta l'applicazione: Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 16 Tapestry5 in action Javaday Roma - 01/12/2007
  17. 17. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Configuriamo jetty: Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 17 Tapestry5 in action Javaday Roma - 01/12/2007
  18. 18. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Configuriamo e lanciamo jetty: Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 18 Tapestry5 in action Javaday Roma - 01/12/2007
  19. 19. Creiamo la nostra prima page Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine digitiamo l'url sul browser: ● http://localhost:8080/jukeweb/ – Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 19 Tapestry5 in action Javaday Roma - 01/12/2007
  20. 20. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creiamo un componente per gestire il layout Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 20 Tapestry5 in action Javaday Roma - 01/12/2007
  21. 21. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Prima di proseguire occorre includere nel ● progetto (in src/main/webapp/) alcune risorse disponibili come allegati alla presentazione: Stylesheets – Immagini – Un flash mp3 player – E in src/main/resources/ ● Javascript files – Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 21 Tapestry5 in action Javaday Roma - 01/12/2007
  22. 22. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Come già detto le component classes e i ● component templates si devono trovare in qualunque sub-package di tapestry.app-package/components – Creiamo quindi un componente che ci consenta ● di “centralizzare” la gestione del layout delle pagine Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 22 Tapestry5 in action Javaday Roma - 01/12/2007
  23. 23. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.java (versione 1) ● package javaday.jukebox.web.components; public class Border { } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 23 Tapestry5 in action Javaday Roma - 01/12/2007
  24. 24. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.tml (versione 1) ● <html xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <head> <title>titolo finestra</title> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/layout.cssquot;></link> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/header.cssquot;></link> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/menu.cssquot;></link> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/body.cssquot;></link> <script src=quot;/jukeweb/js/script.jsquot; ></script> <script src=quot;/jukeweb/js/audio-player.jsquot; ></script> </head> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 24 Tapestry5 in action Javaday Roma - 01/12/2007
  25. 25. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.tml (versione 1) ● ... <body> <div class=quot;pagequot;> <div class=quot;headerquot;> <div class=quot;gkeyquot; onclick=quot;document.location.href='/jukeweb'quot; onmouseover=quot;this.style.cursor='hand'quot;></div> <div class=quot;titlequot;>titolo pagina</div> </div> <div class=quot;menuquot;> menu </div> <div class=quot;bodyquot;> <t:body /> </div> <div class=quot;footerquot;> <a href=quot;mailto:bobpuley@gmail.comquot;> Created by bobpuley@gmail.com </a> </div> </div> </body> </html> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 25 Tapestry5 in action Javaday Roma - 01/12/2007
  26. 26. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.tml (versione 1) ● ... <body> <div class=quot;pagequot;> <div class=quot;headerquot;> <div class=quot;gkeyquot; onclick=quot;document.location.href='/jukeweb'quot; onmouseover=quot;this.style.cursor='hand'quot;></div> <div class=quot;titlequot;>titolo pagina</div> </div> <div class=quot;menuquot;> menu </div> <div class=quot;bodyquot;> <t:body /> </div> <div class=quot;footerquot;> <a href=quot;mailto:bobpuley@gmail.comquot;> Created by bobpuley@gmail.com </a> </div> </div> </body> </html> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 26 Tapestry5 in action Javaday Roma - 01/12/2007
  27. 27. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Adeguiamo quindi il template Start.tml ● <t:border xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 27 Tapestry5 in action Javaday Roma - 01/12/2007
  28. 28. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License http://localhost:8080/jukeweb/ ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 28 Tapestry5 in action Javaday Roma - 01/12/2007
  29. 29. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Ok, ora dovremmo avere acquisito un po' di ● confidenza col codice, ma il tutto è ancora statico Prima di tutto vediamo come fare a passare al ● Border i titoli per la finestra e per la pagina. Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 29 Tapestry5 in action Javaday Roma - 01/12/2007
  30. 30. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Un parametro di un componente altro non è ● che un'attributo d'istanza opportunamente annotato (@Parameter) e corredato dei metodi accessor. Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 30 Tapestry5 in action Javaday Roma - 01/12/2007
  31. 31. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.java (versione 2) ● package javaday.jukebox.web.components; import org.apache.tapestry.annotations.Parameter; public class Border { @Parameter(defaultPrefix=quot;literalquot;) private String windowTitle = quot;Untitledquot;; @Parameter(defaultPrefix=quot;literalquot;) private String pageTitle = quot;Untitledquot;; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 31 Tapestry5 in action Javaday Roma - 01/12/2007
  32. 32. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.java (versione 2) ● package javaday.jukebox.web.components; import org.apache.tapestry.annotations.Parameter; public class Border { Binding prefix: ● prop @Parameter(defaultPrefix=quot;literalquot;) ● literal private String windowTitle = quot;Untitledquot;; ● asset ● block @Parameter(defaultPrefix=quot;literalquot;) ● component private String pageTitle = quot;Untitledquot;; ● traslate ● Message ... ● validate Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 32 Tapestry5 in action Javaday Roma - 01/12/2007
  33. 33. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.java (versione 2) ● ... public String getPageTitle() { return pageTitle; } public void setPageTitle(String pageTitle) { this.pageTitle = pageTitle; } public String getWindowTitle() { return windowTitle; } public void setWindowTitle(String windowTitle) { this.windowTitle = windowTitle; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 33 Tapestry5 in action Javaday Roma - 01/12/2007
  34. 34. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Adeguiamo quindi il template Start.tml ● <t:border pageTitle=quot;Listen everything you wantquot; windowTitle=quot;Homequot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 34 Tapestry5 in action Javaday Roma - 01/12/2007
  35. 35. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License http://localhost:8080/jukeweb/ ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 35 Tapestry5 in action Javaday Roma - 01/12/2007
  36. 36. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Gli Assets ● sono il meccanismo offerto da Tapestry per riferirsi – a risorse statiche Consentono di accedere a risorse presenti nel – classpath (default) o nel context root della web application Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 36 Tapestry5 in action Javaday Roma - 01/12/2007
  37. 37. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creiamo quindi ora in Border.java i riferimenti ● agli stylesheets, ai files javascript e al mp3 flash player Per farlo dobbiamo ● Dichiarare per ciascuna risorsa che vogliamo linkare – una variabile d'istanza di tipo org.apache.tapestry.Asset e il corrispondente metodo getter (il setter non occorre in quanto la risorsa è in sola lettura) Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 37 Tapestry5 in action Javaday Roma - 01/12/2007
  38. 38. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (continua) ● Annotare ciascuna delle variabili con – org.apache.tapestry.ioc.annotations.Inject Annotare ciascuna delle variabili con – org.apache.tapestry.annotations.Path (@Path(“context|classpath:path/risorsa.ext”)) Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 38 Tapestry5 in action Javaday Roma - 01/12/2007
  39. 39. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo a Border.java ● ... @Inject @Path(quot;context:styles/layout.cssquot;) private Asset layout; @Inject @Path(quot;context:styles/header.cssquot;) private Asset header; @Inject @Path(quot;context:styles/menu.cssquot;) private Asset menu; @Inject @Path(quot;context:styles/body.cssquot;) private Asset body; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 39 Tapestry5 in action Javaday Roma - 01/12/2007
  40. 40. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (...continua) ● ... @Inject @Path(quot;classpath:js/script.jsquot;) private Asset script; @Inject @Path(quot;classpath:js/audio-player.jsquot;) private Asset playerScript; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 40 Tapestry5 in action Javaday Roma - 01/12/2007
  41. 41. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo i metodi getter e modifichiamo il ● template ... <head> <title>${windowTitle}</title> <link rel=quot;stylesheetquot; href=quot;${layout}quot;></link> <link rel=quot;stylesheetquot; href=quot;${header}quot;></link> <link rel=quot;stylesheetquot; href=quot;${menu}quot;></link> <link rel=quot;stylesheetquot; href=quot;${body}quot;></link> <script src=quot;${script}quot; ></script> <script src=quot;${playerScript}quot; ></script> </head> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 41 Tapestry5 in action Javaday Roma - 01/12/2007
  42. 42. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Dopo aver salvato ed eseguito diamo uno ● sguardo al codice risultante ... <link href=quot;/jukeweb/styles/layout.cssquot; rel=quot;stylesheetquot;> <link href=quot;/jukeweb/styles/header.cssquot; rel=quot;stylesheetquot;> <link href=quot;/jukeweb/styles/menu.cssquot; rel=quot;stylesheetquot;> <link href=quot;/jukeweb/styles/body.cssquot; rel=quot;stylesheetquot;> <script src=quot;/jukeweb/assets/js/script.jsquot;></script> <script src=quot;/jukeweb/assets/js/audio-player.jsquot;></script> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 42 Tapestry5 in action Javaday Roma - 01/12/2007
  43. 43. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creiamo un componente per il menù. ● Menu.java package javaday.jukebox.web.components; import org.apache.tapestry.annotations.OnEvent; public class Menu { @OnEvent(value=quot;actionquot;) String openPage(String pageName){ return pageName; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 43 Tapestry5 in action Javaday Roma - 01/12/2007
  44. 44. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creiamo un componente per il menù. ● Menu.java package javaday.jukebox.web.components; import org.apache.tapestry.annotations.OnEvent; public class Menu { @OnEvent(value=quot;actionquot;) String openPage(String pageName){ return pageName; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 44 Tapestry5 in action Javaday Roma - 01/12/2007
  45. 45. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License E il template Menu.tml ● <div class=quot;vocimenuquot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;vocemenuquot;> <a t:type=quot;ActionLinkquot; context=quot;literal:startquot;>Home</a> </div> <div class=quot;loginquot;><t:login /></div> </div> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 45 Tapestry5 in action Javaday Roma - 01/12/2007
  46. 46. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License E il template Menu.tml ● <div class=quot;vocimenuquot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;vocemenuquot;> <a t:type=quot;ActionLinkquot; context=quot;literal:startquot;>Home</a> </div> <div class=quot;loginquot;><t:login /></div> </div> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 46 Tapestry5 in action Javaday Roma - 01/12/2007
  47. 47. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creiamo un componente per il login/logout Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 47 Tapestry5 in action Javaday Roma - 01/12/2007
  48. 48. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Passiamo ora a creare un componente che ● gestisca le operazioni di login/logout Al componente spettano la responsabilità di: ● esporre le operazioni opportune – Conoscere e gestire il comportamento – dell'applicazione al momento del login/logout Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 48 Tapestry5 in action Javaday Roma - 01/12/2007
  49. 49. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.java ● package javaday.jukebox.web.components; ... public class Login { @Persist private String _userName; private String _password; @Component(id = quot;passwordquot;) private PasswordField _passwordField; @Component(id=quot;loginFormquot;) private Form _form; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 49 Tapestry5 in action Javaday Roma - 01/12/2007
  50. 50. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.java ● package javaday.jukebox.web.components; ... public class Login { @Persist private String _userName; private String _password; @Component(id = quot;passwordquot;) private PasswordField _passwordField; @Component(id=quot;loginFormquot;) private Form _form; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 50 Tapestry5 in action Javaday Roma - 01/12/2007
  51. 51. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.java ● package javaday.jukebox.web.components; ... public class Login { @Persist private String _userName; private String _password; @Component(id = quot;passwordquot;) private PasswordField _passwordField; @Component(id=quot;loginFormquot;) private Form _form; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 51 Tapestry5 in action Javaday Roma - 01/12/2007
  52. 52. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (... continua) ● ... @OnEvent(component=quot;loginFormquot;,value=quot;successquot;) void login() { boolean valid = false; if(!valid){ _form.recordError(_passwordField, quot;Invalid user name or password.quot;); } } @OnEvent(component=quot;logoutquot;,value=quot;actionquot;) void logout() { } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 52 Tapestry5 in action Javaday Roma - 01/12/2007
  53. 53. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (... continua) ● ... @OnEvent(component=quot;loginFormquot;,value=quot;successquot;) void login() { boolean valid = false; if(!valid){ _form.recordError(_passwordField, quot;Invalid user name or password.quot;); } } @OnEvent(component=quot;logoutquot;,value=quot;actionquot;) void logout() { } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 53 Tapestry5 in action Javaday Roma - 01/12/2007
  54. 54. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (... continua) ● ... @OnEvent(component=quot;loginFormquot;,value=quot;successquot;) void login() { boolean valid = false; if(!valid){ _form.recordError(_passwordField, quot;Invalid user name or password.quot;); } } @OnEvent(component=quot;logoutquot;,value=quot;actionquot;) void logout() { } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 54 Tapestry5 in action Javaday Roma - 01/12/2007
  55. 55. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (... continua) ● ... public String getPassword() { return _password; } public void setPassword(String _password) { this._password = _password; } public String getUserName() { return _userName; } public void setUserName(String name) { _userName = name; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 55 Tapestry5 in action Javaday Roma - 01/12/2007
  56. 56. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formLoginquot;> <t:form t:id=quot;loginFormquot;> <div class=quot;titlequot;>Login</div> <t:errors /> <label t:type=quot;labelquot; t:for=quot;userNamequot; class=quot;labelquot;> user </label> <div class=quot;elementquot;> <t:textField t:id=quot;userNamequot; t:value=quot;userNamequot; t:validate=quot;requiredquot; /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 56 Tapestry5 in action Javaday Roma - 01/12/2007
  57. 57. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formLoginquot;> <t:form t:id=quot;loginFormquot;> <div class=quot;titlequot;>Login</div> <t:errors /> <label t:type=quot;labelquot; t:for=quot;userNamequot; class=quot;labelquot;> user </label> <div class=quot;elementquot;> <t:textField t:id=quot;userNamequot; t:value=quot;userNamequot; t:validate=quot;requiredquot; /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 57 Tapestry5 in action Javaday Roma - 01/12/2007
  58. 58. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formLoginquot;> <t:form t:id=quot;loginFormquot;> <div class=quot;titlequot;>Login</div> <t:errors /> <label t:type=quot;labelquot; t:for=quot;userNamequot; class=quot;labelquot;> user </label> <div class=quot;elementquot;> <t:textField t:id=quot;userNamequot; t:value=quot;userNamequot; t:validate=quot;requiredquot; /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 58 Tapestry5 in action Javaday Roma - 01/12/2007
  59. 59. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formLoginquot;> <t:form t:id=quot;loginFormquot;> <div class=quot;titlequot;>Login</div> <t:errors /> <label t:type=quot;labelquot; t:for=quot;userNamequot; class=quot;labelquot;> user </label> <div class=quot;elementquot;> <t:textField t:id=quot;userNamequot; t:value=quot;userNamequot; t:validate=quot;requiredquot; /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 59 Tapestry5 in action Javaday Roma - 01/12/2007
  60. 60. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;> pass </label> <div class=quot;elementquot;> <t:passwordField t:id=quot;passwordquot; t:validate=quot;required, minLength=5quot; /> </div> <div class=quot;submitquot;> <input type=quot;submitquot; value=quot;loginquot;/> </div> </t:form> </div> <div class=quot;vocemenuquot;> <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 60 Tapestry5 in action Javaday Roma - 01/12/2007
  61. 61. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;> pass </label> <div class=quot;elementquot;> <t:passwordField t:id=quot;passwordquot; t:validate=quot;required, minLength=5quot; /> </div> <div class=quot;submitquot;> <input type=quot;submitquot; value=quot;loginquot;/> </div> </t:form> </div> <div class=quot;vocemenuquot;> <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 61 Tapestry5 in action Javaday Roma - 01/12/2007
  62. 62. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;> pass </label> <div class=quot;elementquot;> <t:passwordField t:id=quot;passwordquot; t:validate=quot;required, minLength=5quot; /> </div> <div class=quot;submitquot;> <input type=quot;submitquot; value=quot;loginquot;/> </div> </t:form> </div> <div class=quot;vocemenuquot;> <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 62 Tapestry5 in action Javaday Roma - 01/12/2007
  63. 63. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License E' giunto il momento di integrare spring e il ● backend per comunicare con il database Primo, modificare il filter nel web.xml ● [...] <filter> <filter-name>juke</filter-name> <filter-class> org.apache.tapestry.spring.TapestrySpringFilter </filter-class> </filter> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 63 Tapestry5 in action Javaday Roma - 01/12/2007
  64. 64. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Secondo, aggiungere al web.xml: ● Il listener di spring che si vuole usare – Il context-param che punta ai files di configurazione – [...] <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/config/bean.xml, /WEB-INF/config/hibernate-config.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 64 Tapestry5 in action Javaday Roma - 01/12/2007
  65. 65. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Importiamo nel path opportuno i due files di ● configurazione di spring Modifichiamo i dati per la connessione nel file ● hibernate-config.xml [...] <bean id=quot;jukeDataSourcequot; class=quot;org.apache.commons.dbcp.BasicDataSourcequot; destroy-method=quot;closequot;> <property name=quot;driverClassNamequot; value=quot;org.gjt.mm.mysql.Driverquot; /> <property name=quot;urlquot; value=quot;jdbc:mysql://127.0.0.1:3306/jukeboxquot; /> <property name=quot;usernamequot; value=quot;rootquot; /> <property name=quot;passwordquot; value=quot;quot; /> </bean> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 65 Tapestry5 in action Javaday Roma - 01/12/2007
  66. 66. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Importiamo nel path opportuno i due files di ● configurazione di spring Modifichiamo i dati per la connessione nel file ● hibernate-config.xml [...] <bean id=quot;jukeDataSourcequot; class=quot;org.apache.commons.dbcp.BasicDataSourcequot; destroy-method=quot;closequot;> <property name=quot;driverClassNamequot; value=quot;org.gjt.mm.mysql.Driverquot; /> <property name=quot;urlquot; value=quot;jdbc:mysql://127.0.0.1:3306/jukeboxquot; /> <property name=quot;usernamequot; value=quot;rootquot; /> <property name=quot;passwordquot; value=quot;quot; /> </bean> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 66 Tapestry5 in action Javaday Roma - 01/12/2007
  67. 67. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Per conservare lo stato dell'utente creiamo una ● classe UserState nel package tapestry.app-package/state – package javaday.jukebox.web.state; import javaday.jukebox.model.dto.User; public class UserState { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public boolean isLoggedIn(){ return user != null && user.getId() != null; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 67 Tapestry5 in action Javaday Roma - 01/12/2007
  68. 68. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo i riferimenti allo state object e allo ● userService, e il metodo getter per accedere allo state object in Login.java ... @ApplicationState private UserState _userState; @Inject private IUserService _userService; public UserState getUserState() { return _userState; } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 68 Tapestry5 in action Javaday Roma - 01/12/2007
  69. 69. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo i riferimenti allo state object e allo ● userService, e il metodo getter per accedere allo state object in Login.java ... @ApplicationState private UserState _userState; @Inject private IUserService _userService; public UserState getUserState() { return _userState; } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 69 Tapestry5 in action Javaday Roma - 01/12/2007
  70. 70. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo i riferimenti allo state object e allo ● userService, e il metodo getter per accedere allo state object in Login.java ... @ApplicationState private UserState _userState; @Inject private IUserService _userService; public UserState getUserState() { return _userState; } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 70 Tapestry5 in action Javaday Roma - 01/12/2007
  71. 71. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo i riferimenti allo state object e allo ● userService, e il metodo getter per accedere allo state object in Login.java ... @ApplicationState Per specificare il nome del private UserState _userState; bean da usare occorre modificare il codice come @Inject segue: private IUserService _userService; @Inject public UserState getUserState() { @Service(quot;userServicequot;) private IUserService _userService; return _userState; } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 71 Tapestry5 in action Javaday Roma - 01/12/2007
  72. 72. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Modifichiamo i metodi login e logout in ● Login.java ... @OnEvent(component=quot;loginFormquot;,value=quot;successquot;) void login(){ _userState.setUser(_userService.login(getUserName(), getPassword())); if(!_userState.isLoggedIn()){ _form.recordError(_passwordField, quot;Invalid user name or password.quot;); } } @OnEvent(component=quot;logoutquot;,value=quot;actionquot;) void logout(){ _userState.setUser(null); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 72 Tapestry5 in action Javaday Roma - 01/12/2007
  73. 73. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Ora con il tapestry component If facciamo in ● modo che nel template Login.tml venga mostrato il form di login solo se non ci si è loggati e l'inverso per il comando di logout. L'If component ha la seguente forma: ● <t:if test=quot;boolean expressionquot; negate=quot;true|falsequot;> renderizzato se test=true e negate=false, oppure test=false e negate=true <t:parameter name=quot;elsequot;> altrimenti renderizza questo </t:parameter> </t:if> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 73 Tapestry5 in action Javaday Roma - 01/12/2007
  74. 74. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il Login.tml diventa quindi: ● <t:if test=quot;userState.loggedInquot; negate=quot;truequot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formLoginquot;> [...] </div> <t:parameter name=quot;elsequot;> <div class=quot;vocemenuquot;> <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;> logout </a> </div> </t:parameter> </t:if> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 74 Tapestry5 in action Javaday Roma - 01/12/2007
  75. 75. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Adesso, per verificare quanto realizzato ● inseriamo un utente di prova sul db insert into user (user, pass, firstName, name, emailAddress, birthDate) values ('bobpuley', 'bobpuley', 'pugliese', 'marco', 'bobpuley@gmail.com', '1973-02-24'); Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 75 Tapestry5 in action Javaday Roma - 01/12/2007
  76. 76. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login: ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 76 Tapestry5 in action Javaday Roma - 01/12/2007
  77. 77. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login: ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 77 Tapestry5 in action Javaday Roma - 01/12/2007
  78. 78. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License La pagina di iscrizione utente Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 78 Tapestry5 in action Javaday Roma - 01/12/2007
  79. 79. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Veniamo ora a esaminare un componente molto ● potente, il beanEditForm. <t:beanEditForm object=quot;expressionquot; [t:id=quot;valuequot; remove=quot;fieldName_1[,fieldName_n]quot; reorder=quot;fieldName_1[,fieldName_n]quot; model=quot;expressionquot; submitLabel=quot;valuequot;]> </t:beanEditForm> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 79 Tapestry5 in action Javaday Roma - 01/12/2007
  80. 80. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il beanEditForm: ● Accetta i seguenti parametri: – object: l'oggetto che si vuole editare ● remove: una lista di nomi di attributi dell'oggetto da ● editare, di cui si vuol inibire il rendering submitLabel: l'etichetta del submit button del form ● model: un'istanza di ● org.apache.tapestry.beaneditor.BeanModel reorder: una lista di nomi di attributi nell'ordine ● desiderato clientValidation: true|false ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 80 Tapestry5 in action Javaday Roma - 01/12/2007
  81. 81. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il beanEditForm: ● mappa – Boolean con checkbox ● java.util.Date con DateField ● Enum con select ● String e Number con textField ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 81 Tapestry5 in action Javaday Roma - 01/12/2007
  82. 82. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il beanEditForm: ● mappa – Boolean con checkbox ● java.util.Date con DateField ● Enum con select ● Tipi primitivi, wrapper e String con textField ● Può essere ulteriormente configurato annotando – opportunamente l'oggetto che gli si passa. Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 82 Tapestry5 in action Javaday Roma - 01/12/2007
  83. 83. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo il package account all'interno della ● root delle page component classes e creaiamo la classe CreateAccount.java package javaday.jukebox.web.pages.account; import javaday.jukebox.model.dto.User; import org.apache.tapestry.annotations.OnEvent; public class CreateAccount { private User user = new User(); public User getUser() {return user;} public void setUser(User user) {this.user = user;} @OnEvent(component=quot;userFormquot;, value=quot;successquot;) void menageAccount(){ System.out.println(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 83 Tapestry5 in action Javaday Roma - 01/12/2007
  84. 84. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo il package account all'interno della ● root delle page component classes e creaiamo la classe CreateAccount.java package javaday.jukebox.web.pages.account; import javaday.jukebox.model.dto.User; import org.apache.tapestry.annotations.OnEvent; public class CreateAccount { private User user = new User(); public User getUser() {return user;} public void setUser(User user) {this.user = user;} @OnEvent(component=quot;userFormquot;, value=quot;successquot;) void menageAccount(){ System.out.println(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 84 Tapestry5 in action Javaday Roma - 01/12/2007
  85. 85. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=quot;Personal Accountquot; windowTitle=quot;Personal Account - create a new accountquot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formquot;> <t:beanEditForm t:id=quot;userFormquot; object=quot;userquot; remove=quot;idquot; submitLabel=quot;literal:confirmquot; reorder=quot;user,pass,firstName,name,birthDate,emailAddressquot;> <t:parameter name=quot;passquot;> <label for=quot;passquot; id=quot;pass:labelquot;>Pass</label> <t:passwordField t:id=quot;passquot; value=quot;user.passquot; /> </t:parameter> </t:beanEditForm> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 85 Tapestry5 in action Javaday Roma - 01/12/2007
  86. 86. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=quot;Personal Accountquot; windowTitle=quot;Personal Account - create a new accountquot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formquot;> <t:beanEditForm t:id=quot;userFormquot; object=quot;userquot; remove=quot;idquot; submitLabel=quot;literal:confirmquot; reorder=quot;user,pass,firstName,name,birthDate,emailAddressquot;> <t:parameter name=quot;passquot;> <label for=quot;passquot; id=quot;pass:labelquot;>Pass</label> <t:passwordField t:id=quot;passquot; value=quot;user.passquot; /> </t:parameter> </t:beanEditForm> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 86 Tapestry5 in action Javaday Roma - 01/12/2007
  87. 87. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=quot;Personal Accountquot; windowTitle=quot;Personal Account - create a new accountquot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formquot;> <t:beanEditForm t:id=quot;userFormquot; object=quot;userquot; remove=quot;idquot; submitLabel=quot;literal:confirmquot;> reorder=quot;user,pass,firstName,name,birthDate,emailAddressquot;> <t:parameter name=quot;passquot;> <label for=quot;passquot; id=quot;pass:labelquot;>Pass</label> <t:passwordField t:id=quot;passquot; value=quot;user.passquot; /> </t:parameter> </t:beanEditForm> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 87 Tapestry5 in action Javaday Roma - 01/12/2007
  88. 88. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=quot;Personal Accountquot; windowTitle=quot;Personal Account - create a new accountquot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formquot;> <t:beanEditForm t:id=quot;userFormquot; object=quot;userquot; remove=quot;idquot; submitLabel=quot;literal:confirmquot;> reorder=quot;user,pass,firstName,name,birthDate,emailAddressquot;> <t:parameter name=quot;passquot;> <label for=quot;passquot; id=quot;pass:labelquot;>Pass</label> <t:passwordField t:id=quot;passquot; value=quot;user.passquot; /> </t:parameter> </t:beanEditForm> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 88 Tapestry5 in action Javaday Roma - 01/12/2007
  89. 89. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License http://localhost:8080/jukeweb/account/create ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 89 Tapestry5 in action Javaday Roma - 01/12/2007
  90. 90. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Come forse avrete notato la url non è come ci ● si aspetterebbe /account/createaccount, bensì /account/create. In sostanza tapestry ignora la ripetizione di account, questo consente di avere url più pulite. Resta da realizzare un link per accedere alla ● pagina di iscrizione, e aggiungere un riferimento al servizio verso il db nella classe della pagina per salvare l'utente creato. Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 90 Tapestry5 in action Javaday Roma - 01/12/2007
  91. 91. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● [...] <t:form t:id=quot;loginFormquot;> <div class=quot;titlequot;>Login</div> <t:errors /> <label t:type=quot;labelquot; t:for=quot;userNamequot; class=quot;labelquot;>user</label> <div class=quot;elementquot;> <t:textField t:id=quot;userNamequot; t:value=quot;userNamequot; t:validate=quot;requiredquot; /> </div> <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;>pass</label> <div class=quot;elementquot;> <t:passwordField t:id=quot;passwordquot; t:validate=quot;required, minLength=5quot; /> </div> <div class=quot;submitquot;><input type=quot;submitquot; value=quot;loginquot;/></div> or: <a href=quot;#quot; t:type=quot;pageLinkquot; t:page=quot;account/createquot;> Get an account </a> </t:form> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 91 Tapestry5 in action Javaday Roma - 01/12/2007
  92. 92. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License CreateAccount.java ● package javaday.jukebox.web.pages.account; import javaday.jukebox.model.dto.User; import org.apache.tapestry.annotations.OnEvent; public class CreateAccount { private User user = new User(); @Inject private IUserService userService; public User getUser() {return user;} public void setUser(User user) {this.user = user;} @OnEvent(component=quot;userFormquot;, value=quot;successquot;) void menageAccount(){ userService.create(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 92 Tapestry5 in action Javaday Roma - 01/12/2007
  93. 93. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License CreateAccount.java ● package javaday.jukebox.web.pages.account; import javaday.jukebox.model.dto.User; import org.apache.tapestry.annotations.OnEvent; public class CreateAccount { private User user = new User(); @Inject private IUserService userService; public User getUser() {return user;} public void setUser(User user) {this.user = user;} @OnEvent(component=quot;userFormquot;, value=quot;successquot;) void menageAccount(){ userService.create(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 93 Tapestry5 in action Javaday Roma - 01/12/2007
  94. 94. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License CreateAccount.java ● package javaday.jukebox.web.pages.account; import javaday.jukebox.model.dto.User; import org.apache.tapestry.annotations.OnEvent; public class CreateAccount { private User user = new User(); @Inject private IUserService userService; public User getUser() {return user;} public void setUser(User user) {this.user = user;} @OnEvent(component=quot;userFormquot;, value=quot;successquot;) void menageAccount(){ userService.create(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 94 Tapestry5 in action Javaday Roma - 01/12/2007
  95. 95. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License L'upload di un file Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 95 Tapestry5 in action Javaday Roma - 01/12/2007
  96. 96. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Tapestry incapsula il componente e i servizi, ● necessari per effettuare l'upload, in un modulo a parte tapestry-upload.jar Quindi aggiungiamo la dipendenza ● corrispondente nel pom.xml [...] <dependency> <groupId>org.apache.tapestry</groupId> <artifactId>tapestry-upload</artifactId> <version>5.0.6</version> </dependency> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 96 Tapestry5 in action Javaday Roma - 01/12/2007
  97. 97. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Creiamo una class page track/CreateTrack.java ● public class CreateTrack { private UploadedFile uploadedFile; @OnEvent(component = quot;uploadFormquot;, value = quot;successquot;) public void upload() { FileUtil fileUtil = new FileUtil(null); File file = fileUtil.getTmpFile(uploadedFile.getFileName()); uploadedFile.write(file); } public UploadedFile getUploadedFile() {return uploadedFile;} public void setUploadedFile(UploadedFile uploadedFile) { this.uploadedFile = uploadedFile; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 97 Tapestry5 in action Javaday Roma - 01/12/2007
  98. 98. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Quindi il template track/CreateTrack.tml ● <t:border windowTitle=quot;Add new trackquot; pageTitle=quot;New Trackquot; xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <div class=quot;formquot;> <div class=quot;titlequot;>Upload a Mp3</div> <t:form t:id=quot;uploadFormquot;> <div class=quot;t-beaneditorquot;> <div class=quot;t-beaneditor-rowquot;> <label id=quot;upload:labelquot; for=quot;uploadquot;>Add track</label> <t:upload id=quot;uploadquot; value=quot;uploadedFilequot; /> </div> <div class=quot;t-beaneditor-rowquot;> <input type=quot;submitquot; /> </div> </div> </t:form> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 98 Tapestry5 in action Javaday Roma - 01/12/2007
  99. 99. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Una volta caricato il file dobbiamo inserire i dati ● ad essa relativi Modifichiamo il metodo upload come segue ● @OnEvent(component = quot;uploadFormquot;, value = quot;successquot;) public void upload() { FileUtil fileUtil = new FileUtil(null); File file = fileUtil.getTmpFile(uploadedFile.getFileName()); uploadedFile.write(file); try { setTrack(fileUtil.getMp3Infos(file)); setStyle(StylesEnum.getFromValue(getTrack().getStyle())); } catch (Exception e) { setTrack(new Track()); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 99 Tapestry5 in action Javaday Roma - 01/12/2007
  100. 100. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Una volta caricato il file dobbiamo inserire i dati ● ad essa relativi Modifichiamo il metodo upload come segue ● @OnEvent(component = quot;uploadFormquot;, value = quot;successquot;) public void upload() { FileUtil fileUtil = new FileUtil(null); File file = fileUtil.getTmpFile(uploadedFile.getFileName()); uploadedFile.write(file); try { setTrack(fileUtil.getMp3Infos(file)); setStyle(StylesEnum.getFromValue(getTrack().getStyle())); } catch (Exception e) { setTrack(new Track()); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 100 Tapestry5 in action Javaday Roma - 01/12/2007
  101. 101. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Una volta caricato il file dobbiamo inserire i dati ● ad essa relativi Modifichiamo il metodo upload come segue ● @OnEvent(component = quot;uploadFormquot;, value = quot;successquot;) public void upload() { FileUtil fileUtil = new FileUtil(null); File file = fileUtil.getTmpFile(uploadedFile.getFileName()); uploadedFile.write(file); try { setTrack(fileUtil.getMp3Infos(file)); setStyle(StylesEnum.getFromValue(getTrack().getStyle())); } catch (Exception e) { setTrack(new Track()); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 101 Tapestry5 in action Javaday Roma - 01/12/2007
  102. 102. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo un attributo Track con i relativi ● accessor, per editare le informazioni. @Persist private Track track = null; public Track getTrack() { return track; } public void setTrack(Track track) { this.track = track; } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 102 Tapestry5 in action Javaday Roma - 01/12/2007
  103. 103. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Occorre anche definire un attributo StylesEnum ● Essendo una enum, il beanEditForm la gestirà ● con una select. @Persist private StylesEnum style; public StylesEnum getStyle() { return style; } public void setStyle(StylesEnum style) { this.style = style; } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 103 Tapestry5 in action Javaday Roma - 01/12/2007
  104. 104. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine ci servono i riferimenti allo stateObject e ● al servizio per salvare la traccia creata @Inject private ITrackService trackService; @ApplicationState private UserState state; @OnEvent(component = quot;trackFormquot;, value = quot;successquot;) public void saveTrack() { try { track.setUser(state.getUser()); track.setStyle(getStyle().toString()); trackService.create(getTrack()); track.setFileName(new FileUtil(null).modifyTrack(track)); trackService.modify(track); setTrack(null); setStyle(null); } catch (Exception e) { e.printStackTrace(); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 104 Tapestry5 in action Javaday Roma - 01/12/2007
  105. 105. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine ci servono i riferimenti allo stateObject e ● al servizio per salvare la traccia creata @Inject private ITrackService trackService; @ApplicationState private UserState state; @OnEvent(component = quot;trackFormquot;, value = quot;successquot;) public void saveTrack() { try { track.setUser(state.getUser()); track.setStyle(getStyle().toString()); trackService.create(getTrack()); track.setFileName(new FileUtil(null).modifyTrack(track)); trackService.modify(track); setTrack(null); setStyle(null); } catch (Exception e) { e.printStackTrace(); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 105 Tapestry5 in action Javaday Roma - 01/12/2007
  106. 106. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine ci servono i riferimenti allo stateObject e ● al servizio per salvare la traccia creata @Inject private ITrackService trackService; @ApplicationState private UserState state; @OnEvent(component = quot;trackFormquot;, value = quot;successquot;) public void saveTrack() { try { track.setUser(state.getUser()); track.setStyle(getStyle().toString()); trackService.create(getTrack()); track.setFileName(new FileUtil(null).modifyTrack(track)); trackService.modify(track); setTrack(null); setStyle(null); } catch (Exception e) { e.printStackTrace(); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 106 Tapestry5 in action Javaday Roma - 01/12/2007

×