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.
Kenya Coconut Production Presentation by Dr. Lalith Perera
Tapestry 5 in Action Pratica
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
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. 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. 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. 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=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. 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. 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=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. 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(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. 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. 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. 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. 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. 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. 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. 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. 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 = 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. 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. 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. 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. 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. 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. 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=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. 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. 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. 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
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=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. 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. 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(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. 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. 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. 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. 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=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. 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=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. 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. 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. 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. 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. 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. 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=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. 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. 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. 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. 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 = 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. 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. 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. 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. 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. 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 = 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. 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. 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