Tapestry 5 in Action Pratica

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    1 Group

    Tapestry 5 in Action Pratica - Presentation Transcript

    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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.tml (versione 1) ● <html xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <head> <title>titolo finestra</title> <link rel=\"stylesheet\" href=\"/jukeweb/styles/layout.css\"></link> <link rel=\"stylesheet\" href=\"/jukeweb/styles/header.css\"></link> <link rel=\"stylesheet\" href=\"/jukeweb/styles/menu.css\"></link> <link rel=\"stylesheet\" href=\"/jukeweb/styles/body.css\"></link> <script src=\"/jukeweb/js/script.js\" ></script> <script src=\"/jukeweb/js/audio-player.js\" ></script> </head> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 24 Tapestry5 in action Javaday Roma - 01/12/2007
    25. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.tml (versione 1) ● ... <body> <div class=\"page\"> <div class=\"header\"> <div class=\"gkey\" onclick=\"document.location.href='/jukeweb'\" onmouseover=\"this.style.cursor='hand'\"></div> <div class=\"title\">titolo pagina</div> </div> <div class=\"menu\"> menu </div> <div class=\"body\"> <t:body /> </div> <div class=\"footer\"> <a href=\"mailto:bobpuley@gmail.com\"> 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. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.tml (versione 1) ● ... <body> <div class=\"page\"> <div class=\"header\"> <div class=\"gkey\" onclick=\"document.location.href='/jukeweb'\" onmouseover=\"this.style.cursor='hand'\"></div> <div class=\"title\">titolo pagina</div> </div> <div class=\"menu\"> menu </div> <div class=\"body\"> <t:body /> </div> <div class=\"footer\"> <a href=\"mailto:bobpuley@gmail.com\"> 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. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Adeguiamo quindi il template Start.tml ● <t:border xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> 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. 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. 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. 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. 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=\"literal\") private String windowTitle = \"Untitled\"; @Parameter(defaultPrefix=\"literal\") private String pageTitle = \"Untitled\"; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 31 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"literal\") ● literal private String windowTitle = \"Untitled\"; ● asset ● block @Parameter(defaultPrefix=\"literal\") ● component private String pageTitle = \"Untitled\"; ● traslate ● Message ... ● validate Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 32 Tapestry5 in action Javaday Roma - 01/12/2007
    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. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Adeguiamo quindi il template Start.tml ● <t:border pageTitle=\"Listen everything you want\" windowTitle=\"Home\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> 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. 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. 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. 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. 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. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo a Border.java ● ... @Inject @Path(\"context:styles/layout.css\") private Asset layout; @Inject @Path(\"context:styles/header.css\") private Asset header; @Inject @Path(\"context:styles/menu.css\") private Asset menu; @Inject @Path(\"context:styles/body.css\") private Asset body; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 39 Tapestry5 in action Javaday Roma - 01/12/2007
    40. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (...continua) ● ... @Inject @Path(\"classpath:js/script.js\") private Asset script; @Inject @Path(\"classpath:js/audio-player.js\") private Asset playerScript; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 40 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"stylesheet\" href=\"${layout}\"></link> <link rel=\"stylesheet\" href=\"${header}\"></link> <link rel=\"stylesheet\" href=\"${menu}\"></link> <link rel=\"stylesheet\" href=\"${body}\"></link> <script src=\"${script}\" ></script> <script src=\"${playerScript}\" ></script> </head> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 41 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"/jukeweb/styles/layout.css\" rel=\"stylesheet\"> <link href=\"/jukeweb/styles/header.css\" rel=\"stylesheet\"> <link href=\"/jukeweb/styles/menu.css\" rel=\"stylesheet\"> <link href=\"/jukeweb/styles/body.css\" rel=\"stylesheet\"> <script src=\"/jukeweb/assets/js/script.js\"></script> <script src=\"/jukeweb/assets/js/audio-player.js\"></script> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 42 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"action\") String openPage(String pageName){ return pageName; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 43 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"action\") String openPage(String pageName){ return pageName; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 44 Tapestry5 in action Javaday Roma - 01/12/2007
    45. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License E il template Menu.tml ● <div class=\"vocimenu\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"vocemenu\"> <a t:type=\"ActionLink\" context=\"literal:start\">Home</a> </div> <div class=\"login\"><t:login /></div> </div> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 45 Tapestry5 in action Javaday Roma - 01/12/2007
    46. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License E il template Menu.tml ● <div class=\"vocimenu\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"vocemenu\"> <a t:type=\"ActionLink\" context=\"literal:start\">Home</a> </div> <div class=\"login\"><t:login /></div> </div> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 46 Tapestry5 in action Javaday Roma - 01/12/2007
    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. 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. 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 = \"password\") private PasswordField _passwordField; @Component(id=\"loginForm\") private Form _form; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 49 Tapestry5 in action Javaday Roma - 01/12/2007
    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 = \"password\") private PasswordField _passwordField; @Component(id=\"loginForm\") private Form _form; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 50 Tapestry5 in action Javaday Roma - 01/12/2007
    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 = \"password\") private PasswordField _passwordField; @Component(id=\"loginForm\") private Form _form; ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 51 Tapestry5 in action Javaday Roma - 01/12/2007
    52. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (... continua) ● ... @OnEvent(component=\"loginForm\",value=\"success\") void login() { boolean valid = false; if(!valid){ _form.recordError(_passwordField, \"Invalid user name or password.\"); } } @OnEvent(component=\"logout\",value=\"action\") void logout() { } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 52 Tapestry5 in action Javaday Roma - 01/12/2007
    53. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (... continua) ● ... @OnEvent(component=\"loginForm\",value=\"success\") void login() { boolean valid = false; if(!valid){ _form.recordError(_passwordField, \"Invalid user name or password.\"); } } @OnEvent(component=\"logout\",value=\"action\") void logout() { } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 53 Tapestry5 in action Javaday Roma - 01/12/2007
    54. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (... continua) ● ... @OnEvent(component=\"loginForm\",value=\"success\") void login() { boolean valid = false; if(!valid){ _form.recordError(_passwordField, \"Invalid user name or password.\"); } } @OnEvent(component=\"logout\",value=\"action\") void logout() { } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 54 Tapestry5 in action Javaday Roma - 01/12/2007
    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. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"formLogin\"> <t:form t:id=\"loginForm\"> <div class=\"title\">Login</div> <t:errors /> <label t:type=\"label\" t:for=\"userName\" class=\"label\"> user </label> <div class=\"element\"> <t:textField t:id=\"userName\" t:value=\"userName\" t:validate=\"required\" /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 56 Tapestry5 in action Javaday Roma - 01/12/2007
    57. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"formLogin\"> <t:form t:id=\"loginForm\"> <div class=\"title\">Login</div> <t:errors /> <label t:type=\"label\" t:for=\"userName\" class=\"label\"> user </label> <div class=\"element\"> <t:textField t:id=\"userName\" t:value=\"userName\" t:validate=\"required\" /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 57 Tapestry5 in action Javaday Roma - 01/12/2007
    58. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"formLogin\"> <t:form t:id=\"loginForm\"> <div class=\"title\">Login</div> <t:errors /> <label t:type=\"label\" t:for=\"userName\" class=\"label\"> user </label> <div class=\"element\"> <t:textField t:id=\"userName\" t:value=\"userName\" t:validate=\"required\" /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 58 Tapestry5 in action Javaday Roma - 01/12/2007
    59. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● <t:container xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"formLogin\"> <t:form t:id=\"loginForm\"> <div class=\"title\">Login</div> <t:errors /> <label t:type=\"label\" t:for=\"userName\" class=\"label\"> user </label> <div class=\"element\"> <t:textField t:id=\"userName\" t:value=\"userName\" t:validate=\"required\" /> </div> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 59 Tapestry5 in action Javaday Roma - 01/12/2007
    60. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=\"label\" t:for=\"password\" class=\"label\"> pass </label> <div class=\"element\"> <t:passwordField t:id=\"password\" t:validate=\"required, minLength=5\" /> </div> <div class=\"submit\"> <input type=\"submit\" value=\"login\"/> </div> </t:form> </div> <div class=\"vocemenu\"> <a href=\"#\" t:type=\"actionLink\" t:id=\"logout\">logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 60 Tapestry5 in action Javaday Roma - 01/12/2007
    61. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=\"label\" t:for=\"password\" class=\"label\"> pass </label> <div class=\"element\"> <t:passwordField t:id=\"password\" t:validate=\"required, minLength=5\" /> </div> <div class=\"submit\"> <input type=\"submit\" value=\"login\"/> </div> </t:form> </div> <div class=\"vocemenu\"> <a href=\"#\" t:type=\"actionLink\" t:id=\"logout\">logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 61 Tapestry5 in action Javaday Roma - 01/12/2007
    62. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=\"label\" t:for=\"password\" class=\"label\"> pass </label> <div class=\"element\"> <t:passwordField t:id=\"password\" t:validate=\"required, minLength=5\" /> </div> <div class=\"submit\"> <input type=\"submit\" value=\"login\"/> </div> </t:form> </div> <div class=\"vocemenu\"> <a href=\"#\" t:type=\"actionLink\" t:id=\"logout\">logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 62 Tapestry5 in action Javaday Roma - 01/12/2007
    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. 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. 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=\"jukeDataSource\" class=\"org.apache.commons.dbcp.BasicDataSource\" destroy-method=\"close\"> <property name=\"driverClassName\" value=\"org.gjt.mm.mysql.Driver\" /> <property name=\"url\" value=\"jdbc:mysql://127.0.0.1:3306/jukebox\" /> <property name=\"username\" value=\"root\" /> <property name=\"password\" value=\"\" /> </bean> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 65 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"jukeDataSource\" class=\"org.apache.commons.dbcp.BasicDataSource\" destroy-method=\"close\"> <property name=\"driverClassName\" value=\"org.gjt.mm.mysql.Driver\" /> <property name=\"url\" value=\"jdbc:mysql://127.0.0.1:3306/jukebox\" /> <property name=\"username\" value=\"root\" /> <property name=\"password\" value=\"\" /> </bean> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 66 Tapestry5 in action Javaday Roma - 01/12/2007
    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. 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. 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. 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. 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(\"userService\") private IUserService _userService; return _userState; } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 71 Tapestry5 in action Javaday Roma - 01/12/2007
    72. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Modifichiamo i metodi login e logout in ● Login.java ... @OnEvent(component=\"loginForm\",value=\"success\") void login(){ _userState.setUser(_userService.login(getUserName(), getPassword())); if(!_userState.isLoggedIn()){ _form.recordError(_passwordField, \"Invalid user name or password.\"); } } @OnEvent(component=\"logout\",value=\"action\") void logout(){ _userState.setUser(null); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 72 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"boolean expression\" negate=\"true|false\"> renderizzato se test=true e negate=false, oppure test=false e negate=true <t:parameter name=\"else\"> 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. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il Login.tml diventa quindi: ● <t:if test=\"userState.loggedIn\" negate=\"true\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"formLogin\"> [...] </div> <t:parameter name=\"else\"> <div class=\"vocemenu\"> <a href=\"#\" t:type=\"actionLink\" t:id=\"logout\"> 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. 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. 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. 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. 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. 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=\"expression\" [t:id=\"value\" remove=\"fieldName_1[,fieldName_n]\" reorder=\"fieldName_1[,fieldName_n]\" model=\"expression\" submitLabel=\"value\"]> </t:beanEditForm> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 79 Tapestry5 in action Javaday Roma - 01/12/2007
    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. 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. 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. 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=\"userForm\", value=\"success\") void menageAccount(){ System.out.println(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 83 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"userForm\", value=\"success\") void menageAccount(){ System.out.println(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 84 Tapestry5 in action Javaday Roma - 01/12/2007
    85. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=\"Personal Account\" windowTitle=\"Personal Account - create a new account\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"form\"> <t:beanEditForm t:id=\"userForm\" object=\"user\" remove=\"id\" submitLabel=\"literal:confirm\" reorder=\"user,pass,firstName,name,birthDate,emailAddress\"> <t:parameter name=\"pass\"> <label for=\"pass\" id=\"pass:label\">Pass</label> <t:passwordField t:id=\"pass\" value=\"user.pass\" /> </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. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=\"Personal Account\" windowTitle=\"Personal Account - create a new account\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"form\"> <t:beanEditForm t:id=\"userForm\" object=\"user\" remove=\"id\" submitLabel=\"literal:confirm\" reorder=\"user,pass,firstName,name,birthDate,emailAddress\"> <t:parameter name=\"pass\"> <label for=\"pass\" id=\"pass:label\">Pass</label> <t:passwordField t:id=\"pass\" value=\"user.pass\" /> </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. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=\"Personal Account\" windowTitle=\"Personal Account - create a new account\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"form\"> <t:beanEditForm t:id=\"userForm\" object=\"user\" remove=\"id\" submitLabel=\"literal:confirm\"> reorder=\"user,pass,firstName,name,birthDate,emailAddress\"> <t:parameter name=\"pass\"> <label for=\"pass\" id=\"pass:label\">Pass</label> <t:passwordField t:id=\"pass\" value=\"user.pass\" /> </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. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ...e il template. ● <t:border pageTitle=\"Personal Account\" windowTitle=\"Personal Account - create a new account\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"form\"> <t:beanEditForm t:id=\"userForm\" object=\"user\" remove=\"id\" submitLabel=\"literal:confirm\"> reorder=\"user,pass,firstName,name,birthDate,emailAddress\"> <t:parameter name=\"pass\"> <label for=\"pass\" id=\"pass:label\">Pass</label> <t:passwordField t:id=\"pass\" value=\"user.pass\" /> </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. 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. 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. La pagina d'iscrizione utente Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Login.tml ● [...] <t:form t:id=\"loginForm\"> <div class=\"title\">Login</div> <t:errors /> <label t:type=\"label\" t:for=\"userName\" class=\"label\">user</label> <div class=\"element\"> <t:textField t:id=\"userName\" t:value=\"userName\" t:validate=\"required\" /> </div> <label t:type=\"label\" t:for=\"password\" class=\"label\">pass</label> <div class=\"element\"> <t:passwordField t:id=\"password\" t:validate=\"required, minLength=5\" /> </div> <div class=\"submit\"><input type=\"submit\" value=\"login\"/></div> or: <a href=\"#\" t:type=\"pageLink\" t:page=\"account/create\"> Get an account </a> </t:form> [...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 91 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"userForm\", value=\"success\") void menageAccount(){ userService.create(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 92 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"userForm\", value=\"success\") void menageAccount(){ userService.create(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 93 Tapestry5 in action Javaday Roma - 01/12/2007
    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=\"userForm\", value=\"success\") void menageAccount(){ userService.create(user); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 94 Tapestry5 in action Javaday Roma - 01/12/2007
    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. 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. 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 = \"uploadForm\", value = \"success\") 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. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Quindi il template track/CreateTrack.tml ● <t:border windowTitle=\"Add new track\" pageTitle=\"New Track\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> <div class=\"form\"> <div class=\"title\">Upload a Mp3</div> <t:form t:id=\"uploadForm\"> <div class=\"t-beaneditor\"> <div class=\"t-beaneditor-row\"> <label id=\"upload:label\" for=\"upload\">Add track</label> <t:upload id=\"upload\" value=\"uploadedFile\" /> </div> <div class=\"t-beaneditor-row\"> <input type=\"submit\" /> </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. 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 = \"uploadForm\", value = \"success\") 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. 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 = \"uploadForm\", value = \"success\") 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. 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 = \"uploadForm\", value = \"success\") 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. 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. 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. 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 = \"trackForm\", value = \"success\") 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. 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 = \"trackForm\", value = \"success\") 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. 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 = \"trackForm\", value = \"success\") 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
    107. 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 = \"trackForm\", value = \"success\") 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 107 Tapestry5 in action Javaday Roma - 01/12/2007
    108. 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 = \"trackForm\", value = \"success\") 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 108 Tapestry5 in action Javaday Roma - 01/12/2007
    109. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine dobbiiamo modificare il template, in ● modo da mostrare prima l'upload form, e poi il track form. [...] <t:if test=\"track\" negate=\"true\"> form upload <t:parameter name=\"else\"> <div class=\"title\">Edit info</div> <t:beanEditForm t:id=\"trackForm\" object=\"track\" remove=\"id,user,fileName,rating\" reorder=\"title,author,length,style\" submitLabel=\"literal:salva\"> <t:parameter name=\"style\"> <label for=\"style\" id=\"style:label\">Pass</label> <t:select t:id=\"style\" value=\"style\" /> </t:parameter> </t:beanEditForm> </t:parameter> </t:if>[...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 109 Tapestry5 in action Javaday Roma - 01/12/2007
    110. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine dobbiiamo modificare il template, in ● modo da mostrare prima l'upload form, e poi il track form. [...] <t:if test=\"track\" negate=\"true\"> form upload <t:parameter name=\"else\"> <div class=\"title\">Edit info</div> <t:beanEditForm t:id=\"trackForm\" object=\"track\" remove=\"id,user,fileName,rating\" reorder=\"title,author,length,style\" submitLabel=\"literal:salva\"> <t:parameter name=\"style\"> <label for=\"style\" id=\"style:label\">Pass</label> <t:select t:id=\"style\" value=\"style\" /> </t:parameter> </t:beanEditForm> </t:parameter> </t:if>[...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 110 Tapestry5 in action Javaday Roma - 01/12/2007
    111. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine dobbiiamo modificare il template, in ● modo da mostrare prima l'upload form, e poi il track form. [...]<t:if test=\"track\" negate=\"true\"> form upload <t:parameter name=\"else\"> <div class=\"title\">Edit info</div> <t:beanEditForm t:id=\"trackForm\" object=\"track\" remove=\"id,user,fileName,rating\" reorder=\"title,author,length,style\" submitLabel=\"literal:salva\"> <t:parameter name=\"style\"> <label for=\"style\" id=\"style:label\">Pass</label> <t:select t:id=\"style\" value=\"style\" /> </t:parameter> </t:beanEditForm> </t:parameter> </t:if>[...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 111 Tapestry5 in action Javaday Roma - 01/12/2007
    112. L'upload di un file Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine dobbiiamo modificare il template, in ● modo da mostrare prima l'upload form, e poi il track form. [...]<t:if test=\"track\" negate=\"true\"> form upload <t:parameter name=\"else\"> <div class=\"title\">Edit info</div> <t:beanEditForm t:id=\"trackForm\" object=\"track\" remove=\"id,user,fileName,rating\" reorder=\"title,author,length,style\" submitLabel=\"literal:salva\"> <t:parameter name=\"style\"> <label for=\"style\" id=\"style:label\">Pass</label> <t:select t:id=\"style\" value=\"style\" /> </t:parameter> </t:beanEditForm> </t:parameter> </t:if>[...] Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 112 Tapestry5 in action Javaday Roma - 01/12/2007
    113. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Realizziamo il jukebox Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 113 Tapestry5 in action Javaday Roma - 01/12/2007
    114. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Bene, siamo giunti all'ultimo elemento ● dell'applicazione Nel realizzarlo vedremo ● come untilizzare il grid component – Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 114 Tapestry5 in action Javaday Roma - 01/12/2007
    115. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Bene, siamo giunti all'ultimo elemento ● dell'applicazione Nel realizzarlo vedremo ● come untilizzare il grid component – come realizzare un componente che scrive – direttamente sull'output (privo di template) Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 115 Tapestry5 in action Javaday Roma - 01/12/2007
    116. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Bene, siamo giunti all'ultimo elemento ● dell'applicazione Nel realizzarlo vedremo ● come untilizzare il grid component – come realizzare un componente che scrive – direttamente sull'output (privo di template) come ottenere uno stream verso una risorsa tramite – Tapestry Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 116 Tapestry5 in action Javaday Roma - 01/12/2007
    117. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Modifichiamo quindi la Start page, e ● aggiungiamole gli attributi @Persist private List<Track> tracks = new ArrayList<Track>(); private Track itemTrack; @Inject private ITrackService service; public Track getItemTrack() {return itemTrack;} public void setItemTrack(Track itemTrack) { this.itemTrack = itemTrack; } public List<Track> getTracks() {return tracks;} public void setTracks(List<Track> tracks) { this.tracks = tracks; } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 117 Tapestry5 in action Javaday Roma - 01/12/2007
    118. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Modifichiamo quindi la Start page, e ● aggiungiamole gli attributi @Persist private List<Track> tracks = new ArrayList<Track>(); private Track itemTrack; @Inject private ITrackService service; public Track getItemTrack() {return itemTrack;} public void setItemTrack(Track itemTrack) { this.itemTrack = itemTrack; } public List<Track> getTracks() {return tracks;} public void setTracks(List<Track> tracks) { this.tracks = tracks; } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 118 Tapestry5 in action Javaday Roma - 01/12/2007
    119. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine faccio in modo che quando la pagina ● viene inizializzata, carichi dal database le tracce. @SetupRender void init(){ setTracks(service.findAll()); if(getTracks()==null || getTracks().isEmpty()){ setTracks(new ArrayList<Track>()); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 119 Tapestry5 in action Javaday Roma - 01/12/2007
    120. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine faccio in modo che quando la pagina ● viene inizializzata, carichi dal database le tracce. @SetupRender void init(){ setTracks(service.findAll()); if(getTracks()==null || getTracks().isEmpty()){ setTracks(new ArrayList<Track>()); } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 120 Tapestry5 in action Javaday Roma - 01/12/2007
    121. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Quindi inseriamo il component grid nel template ● <t:border windowTitle=\"home page\" pageTitle=\"Everything you need\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! <div class=\"form\"> <t:form></t:form> <div class=\"title\">JukeBox</div> <t:if test=\"tracks\"> <t:grid source=\"tracks\" row=\"itemTrack\" remove=\"id\" /> <t:parameter name=\"else\"> The collection is empty. </t:parameter> </t:if> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 121 Tapestry5 in action Javaday Roma - 01/12/2007
    122. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Riordiniamo gli attributi ● <t:border windowTitle=\"home page\" pageTitle=\"Everything you need\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! <div class=\"form\"> <t:form></t:form><div class=\"title\">JukeBox</div> <t:if test=\"tracks\"> <t:grid source=\"tracks\" row=\"itemTrack\" remove=\"id\" reorder=\"title,author,style,length,rating,fileName\"/> <t:parameter name=\"else\"> The collection is empty. </t:parameter> </t:if> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 122 Tapestry5 in action Javaday Roma - 01/12/2007
    123. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Aggiungiamo la paginazione ● <t:border windowTitle=\"home page\" pageTitle=\"Everything you need\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! <div class=\"form\"> <t:form></t:form><div class=\"title\">JukeBox</div> <t:if test=\"tracks\"> <t:grid source=\"tracks\" row=\"itemTrack\" remove=\"id\" reorder=\"title,author,style,length,rating,fileName\" rowsPerPage=\"5\" pagerPosition=\"both\" /> <t:parameter name=\"else\"> The collection is empty. </t:parameter> </t:if> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 123 Tapestry5 in action Javaday Roma - 01/12/2007
    124. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Gestiamo il rating con un componente specifico ● <t:border windowTitle=\"home page\" pageTitle=\"Everything you need\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! <div class=\"form\"> <t:form></t:form><div class=\"title\">JukeBox</div> <t:if test=\"tracks\"> <t:grid source=\"tracks\" row=\"itemTrack\" remove=\"id\" reorder=\"title,author,style,length,rating,fileName\" rowsPerPage=\"5\" pagerPosition=\"both\"> <t:parameter name=\"ratingCell\"> <t:rating t:ratingValue=\"itemTrack.rating\" /> </t:parameter> </t:grid> <t:parameter name=\"else\"> The collection is empty. </t:parameter> </t:if> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 124 Tapestry5 in action Javaday Roma - 01/12/2007
    125. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il componente Rating.java ● public class Rating { private static final String MAX_RATING = \"*****\"; @Parameter(required=true) private Integer ratingValue; @BeginRender void render(MarkupWriter writer){ int rating = calculateRating(ratingValue); writer.element(\"span\",\"class\",\"rating\" + rating); writer.write(getRatingStars(rating)); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 125 Tapestry5 in action Javaday Roma - 01/12/2007
    126. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il componente Rating.java ● public class Rating { private static final String MAX_RATING = \"*****\"; @Parameter(required=true) private Integer ratingValue; @BeginRender void render(MarkupWriter writer){ int rating = calculateRating(ratingValue); writer.element(\"span\",\"class\",\"rating\" + rating); writer.write(getRatingStars(rating)); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 126 Tapestry5 in action Javaday Roma - 01/12/2007
    127. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il componente Rating.java ● public class Rating { private static final String MAX_RATING = \"*****\"; @Parameter(required=true) private Integer ratingValue; @BeginRender void render(MarkupWriter writer){ int rating = calculateRating(ratingValue); writer.element(\"span\",\"class\",\"rating\" + rating); writer.write(getRatingStars(rating)); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 127 Tapestry5 in action Javaday Roma - 01/12/2007
    128. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il componente Rating.java ● public class Rating { private static final String MAX_RATING = \"*****\"; @Parameter(required=true) private Integer ratingValue; @BeginRender void render(MarkupWriter writer){ int rating = calculateRating(ratingValue); writer.element(\"span\",\"class\",\"rating\" + rating); writer.write(getRatingStars(rating)); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 128 Tapestry5 in action Javaday Roma - 01/12/2007
    129. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il componente Rating.java ● public class Rating { private static final String MAX_RATING = \"*****\"; @Parameter(required=true) private Integer ratingValue; @BeginRender void render(MarkupWriter writer){ int rating = calculateRating(ratingValue); writer.element(\"span\",\"class\",\"rating\" + rating); writer.write(getRatingStars(rating)); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 129 Tapestry5 in action Javaday Roma - 01/12/2007
    130. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il componente Rating.java ● public Integer getRatingValue() { return ratingValue; } public void setRatingValue(Integer value) { this.ratingValue = value; } private String getRatingStars(int rating) { return MAX_RATING.substring(0, rating); } private int calculateRating(Integer value) { int rating = (int)(value/5) + 1; rating = rating<6?rating:5; return rating; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 130 Tapestry5 in action Javaday Roma - 01/12/2007
    131. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine sovrascriviamo la fileNameCell ● <t:border windowTitle=\"home page\" pageTitle=\"Everything you need\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! <div class=\"form\"> <t:form></t:form><div class=\"title\">JukeBox</div> <t:if test=\"tracks\"> <t:grid source=\"tracks\" row=\"itemTrack\" remove=\"id\" reorder=\"title,author,style,length,rating,fileName\" rowsPerPage=\"5\" pagerPosition=\"both\"> <t:parameter name=\"ratingCell\"> <t:rating t:ratingValue=\"itemTrack.rating\" /> </t:parameter> <t:parameter name=\"fileNameCell\"> <t:player t:id=\"_player\" t:idTrack=\"itemTrack.id\" /> </t:parameter> </t:grid> <t:parameter name=\"else\"> The collection is empty. </t:parameter> </t:if> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 131 Tapestry5 in action Javaday Roma - 01/12/2007
    132. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine sovrascriviamo la fileNameCell ● <t:border windowTitle=\"home page\" pageTitle=\"Everything you need\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! <div class=\"form\"> <t:form></t:form><div class=\"title\">JukeBox</div> <t:if test=\"tracks\"> <t:grid source=\"tracks\" row=\"itemTrack\" remove=\"id\" reorder=\"title,author,style,length,rating,fileName\" rowsPerPage=\"5\" pagerPosition=\"both\"> <t:parameter name=\"ratingCell\"> <t:rating t:ratingValue=\"itemTrack.rating\" /> </t:parameter> <t:parameter name=\"fileNameCell\"> <t:player t:id=\"_player\" t:idTrack=\"itemTrack.id\" /> </t:parameter> </t:grid> <t:parameter name=\"else\"> The collection is empty. </t:parameter> </t:if> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 132 Tapestry5 in action Javaday Roma - 01/12/2007
    133. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Infine sovrascriviamo la fileNameCell ● <t:border windowTitle=\"home page\" pageTitle=\"Everything you need\" xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\"> Benvenuti nel mondo di Tapestry!<br /> E' stata renderizzata la pagina ${class.simpleName}! <div class=\"form\"> <t:form></t:form><div class=\"title\">JukeBox</div> <t:if test=\"tracks\"> <t:grid source=\"tracks\" row=\"itemTrack\" remove=\"id\" reorder=\"title,author,style,length,rating,fileName\" rowsPerPage=\"5\" pagerPosition=\"both\"> <t:parameter name=\"ratingCell\"> <t:rating t:ratingValue=\"itemTrack.rating\" /> </t:parameter> <t:parameter name=\"fileNameCell\"> <t:player t:id=\"_player\" t:idTrack=\"itemTrack.id\" /> </t:parameter> </t:grid> <t:parameter name=\"else\"> The collection is empty. </t:parameter> </t:if> </div> </t:border> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 133 Tapestry5 in action Javaday Roma - 01/12/2007
    134. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il component Player.java ● public class Player { private static final String SCRIPT = \"Event.observe(window,'load',function(){addPalayer('%s','%s');});\"; @Inject private ComponentResources _resources; @Parameter(required=true) private Integer idTrack; @BeginRender void render(MarkupWriter writer){ String id = _resources.getId() + \"_\" + idTrack; writer.element(\"div\", \"id\", id); writer.element(\"script\"); String filePath = _resources.createPageLink(\"trackStream\", true, idTrack).toURI(); writer.writef(SCRIPT, filePath, id); writer.end(); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 134 Tapestry5 in action Javaday Roma - 01/12/2007
    135. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il component Player.java ● public class Player { private static final String SCRIPT = \"Event.observe(window,'load',function(){addPalayer('%s','%s');});\"; @Inject private ComponentResources _resources; @Parameter(required=true) private Integer idTrack; @BeginRender void render(MarkupWriter writer){ String id = _resources.getId() + \"_\" + idTrack; writer.element(\"div\", \"id\", id); writer.element(\"script\"); String filePath = _resources.createPageLink(\"trackStream\", true, idTrack).toURI(); writer.writef(SCRIPT, filePath, id); writer.end(); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 135 Tapestry5 in action Javaday Roma - 01/12/2007
    136. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il component Player.java ● public class Player { private static final String SCRIPT = \"Event.observe(window,'load',function(){addPalayer('%s','%s');});\"; @Inject private ComponentResources _resources; @Parameter(required=true) private Integer idTrack; @BeginRender void render(MarkupWriter writer){ String id = _resources.getId() + \"_\" + idTrack; writer.element(\"div\", \"id\", id); writer.element(\"script\"); String filePath = _resources.createPageLink(\"trackStream\", true, idTrack).toURI(); writer.writef(SCRIPT, filePath, id); writer.end(); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 136 Tapestry5 in action Javaday Roma - 01/12/2007
    137. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il component Player.java ● public class Player { private static final String SCRIPT = \"Event.observe(window,'load',function(){addPalayer('%s','%s');});\"; @Inject private ComponentResources _resources; @Parameter(required=true) private Integer idTrack; @BeginRender void render(MarkupWriter writer){ String id = _resources.getId() + \"_\" + idTrack; writer.element(\"div\", \"id\", id); writer.element(\"script\"); String filePath = _resources.createPageLink(\"trackStream\", true, idTrack).toURI(); writer.writef(SCRIPT, filePath, id); writer.end(); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 137 Tapestry5 in action Javaday Roma - 01/12/2007
    138. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il component Player.java ● public class Player { private static final String SCRIPT = \"Event.observe(window,'load',function(){addPalayer('%s','%s');});\"; @Inject private ComponentResources _resources; @Parameter(required=true) private Integer idTrack; @BeginRender void render(MarkupWriter writer){ String id = _resources.getId() + \"_\" + idTrack; writer.element(\"div\", \"id\", id); writer.element(\"script\"); String filePath = _resources.createPageLink(\"trackStream\", true, idTrack).toURI(); writer.writef(SCRIPT, filePath, id); writer.end(); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 138 Tapestry5 in action Javaday Roma - 01/12/2007
    139. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il component Player.java ● public class Player { private static final String SCRIPT = \"Event.observe(window,'load',function(){addPalayer('%s','%s');});\"; @Inject private ComponentResources _resources; @Parameter(required=true) private Integer idTrack; @BeginRender void render(MarkupWriter writer){ String id = _resources.getId() + \"_\" + idTrack; writer.element(\"div\", \"id\", id); writer.element(\"script\"); String filePath = _resources.createPageLink(\"trackStream\", true, idTrack).toURI(); writer.writef(SCRIPT, filePath, id); writer.end(); writer.end(); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 139 Tapestry5 in action Javaday Roma - 01/12/2007
    140. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Il component Player.java ● ... /** * @return the idTrack */ public Integer getIdTrack() { return idTrack; } /** * @param idTrack the idTrack to set */ public void setIdTrack(Integer idTrack) { this.idTrack = idTrack; } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 140 Tapestry5 in action Javaday Roma - 01/12/2007
    141. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License La stream page TrackStream.java ● public class TrackStream{ @Inject private ITrackService _service; StreamResponse onActivate(Integer id) throws FileNotFoundException{ _service.incrementRatingOf(id); Track track = _service.findById(id); File file = new File(track.getFileName()); return new Mp3Stream(file); } ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 141 Tapestry5 in action Javaday Roma - 01/12/2007
    142. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License La stream page TrackStream.java ● ... public static class Mp3Stream implements StreamResponse{ InputStream inputStream; public Mp3Stream(File file) { try { inputStream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } } public String getContentType() {return \"audio/mpeg3\";} public InputStream getStream() throws IOException{ return inputStream; } public void prepareResponse(Response response) {} } } Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 142 Tapestry5 in action Javaday Roma - 01/12/2007
    143. Realizziamo il jukebox Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License http://localhost:8080/jukeweb/ ● Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 143 Tapestry5 in action Javaday Roma - 01/12/2007
    144. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ??? Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 144 Tapestry5 in action Javaday Roma - 01/12/2007
    145. Ringraziamenti Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Un ringraziamento va a tutti coloro che con il loro impegno e disponibilità hanno permesso la realizzazione del Javaday Naturalmente agli sponsor E in particolare a Mara Marzocchi, Java Italian Portal webmaster, per l'incoraggiamento, il sostegno e la disponibilità (ma anche i consigli, le proposte e le idee). Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 145 Tapestry5 in action Javaday Roma - 01/12/2007
    146. Tapestry5 in action Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License FINE Marco Pugliese bobpuley@gmail.com Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 146 Tapestry5 in action Javaday Roma - 01/12/2007

    + maraexceptionmaraexception, 2 years ago

    custom

    787 views, 0 favs, 0 embeds more stats

    Jakarta Tapestry è un framework basato su un model more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 787
      • 787 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 20
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories

    Groups / Events