SlideShare une entreprise Scribd logo
1  sur  146
Télécharger pour lire hors ligne
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Creiamo un componente..
                                                Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License


        Border.tml (versione 1)
    ●




     <html xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;>
         <head>
         <title>titolo finestra</title>
         <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/layout.cssquot;></link>
         <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/header.cssquot;></link>
         <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/menu.cssquot;></link>
         <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/body.cssquot;></link>
         <script src=quot;/jukeweb/js/script.jsquot; ></script>
         <script src=quot;/jukeweb/js/audio-player.jsquot; ></script>
     </head>
     ...




Marco Pugliese - bobpuley@gmail.com – Java Italian Portal
                                                                                                        24
                                                                             Tapestry5 in action
Javaday Roma - 01/12/2007
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Il componente login
                                                Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License


        (..continua)
    ●




     ...
                    <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;>
                        pass
                    </label>
                    <div class=quot;elementquot;>
                        <t:passwordField t:id=quot;passwordquot;
                            t:validate=quot;required, minLength=5quot; />
                    </div>
                    <div class=quot;submitquot;>
                        <input type=quot;submitquot; value=quot;loginquot;/>
                    </div>
                </t:form>
            </div>
            <div class=quot;vocemenuquot;>
                <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a>
            </div>
     </t:container>


Marco Pugliese - bobpuley@gmail.com – Java Italian Portal
                                                                                                        60
                                                                             Tapestry5 in action
Javaday Roma - 01/12/2007
Il componente login
                                                Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License


        (..continua)
    ●




     ...
                    <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;>
                        pass
                    </label>
                    <div class=quot;elementquot;>
                        <t:passwordField t:id=quot;passwordquot;
                            t:validate=quot;required, minLength=5quot; />
                    </div>
                    <div class=quot;submitquot;>
                        <input type=quot;submitquot; value=quot;loginquot;/>
                    </div>
                </t:form>
            </div>
            <div class=quot;vocemenuquot;>
                <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a>
            </div>
     </t:container>


Marco Pugliese - bobpuley@gmail.com – Java Italian Portal
                                                                                                        61
                                                                             Tapestry5 in action
Javaday Roma - 01/12/2007
Il componente login
                                                Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License


        (..continua)
    ●




     ...
                    <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;>
                        pass
                    </label>
                    <div class=quot;elementquot;>
                        <t:passwordField t:id=quot;passwordquot;
                            t:validate=quot;required, minLength=5quot; />
                    </div>
                    <div class=quot;submitquot;>
                        <input type=quot;submitquot; value=quot;loginquot;/>
                    </div>
                </t:form>
            </div>
            <div class=quot;vocemenuquot;>
                <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a>
            </div>
     </t:container>


Marco Pugliese - bobpuley@gmail.com – Java Italian Portal
                                                                                                        62
                                                                             Tapestry5 in action
Javaday Roma - 01/12/2007
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica
Tapestry 5 in Action Pratica

Contenu connexe

Similaire à Tapestry 5 in Action Pratica

Leaner microservices with Java 10
Leaner microservices with Java 10Leaner microservices with Java 10
Leaner microservices with Java 10Arto Santala
 
Frozen Rails Slides
Frozen Rails SlidesFrozen Rails Slides
Frozen Rails Slidescarllerche
 
Scaling Puppet Usage to a Global Organization
Scaling Puppet Usage to a Global OrganizationScaling Puppet Usage to a Global Organization
Scaling Puppet Usage to a Global OrganizationPuppet
 
Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...
Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...
Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...Martin Bergljung
 
Java 9 and the impact on Maven Projects (JavaOne 2016)
Java 9 and the impact on Maven Projects (JavaOne 2016)Java 9 and the impact on Maven Projects (JavaOne 2016)
Java 9 and the impact on Maven Projects (JavaOne 2016)Robert Scholte
 
JSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & MavenJSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & MavenRaghavan Mohan
 
Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2Raghavan Mohan
 
OpenTuesday: Agile Testautomatisierung und Continuous Integration
OpenTuesday: Agile Testautomatisierung und Continuous IntegrationOpenTuesday: Agile Testautomatisierung und Continuous Integration
OpenTuesday: Agile Testautomatisierung und Continuous IntegrationDigicomp Academy AG
 
The Maven2 Revolution
The Maven2 RevolutionThe Maven2 Revolution
The Maven2 Revolutionelliando dias
 
Seven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseSeven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseMatt Raible
 
Deployment presentation
Deployment presentationDeployment presentation
Deployment presentationCorey Purcell
 
Introduction To Maven2
Introduction To Maven2Introduction To Maven2
Introduction To Maven2Shuji Watanabe
 
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...Jesse Gallagher
 
JRuby and Google App Engine
JRuby and Google App EngineJRuby and Google App Engine
JRuby and Google App Enginejoshsmoore
 
Java EE 7: the Voyage of the Cloud Treader
Java EE 7: the Voyage of the Cloud TreaderJava EE 7: the Voyage of the Cloud Treader
Java EE 7: the Voyage of the Cloud TreaderSaltmarch Media
 
The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9jClarity
 

Similaire à Tapestry 5 in Action Pratica (20)

Apache Maven 2 Part 2
Apache Maven 2 Part 2Apache Maven 2 Part 2
Apache Maven 2 Part 2
 
Leaner microservices with Java 10
Leaner microservices with Java 10Leaner microservices with Java 10
Leaner microservices with Java 10
 
Frozen Rails Slides
Frozen Rails SlidesFrozen Rails Slides
Frozen Rails Slides
 
Scaling Puppet Usage to a Global Organization
Scaling Puppet Usage to a Global OrganizationScaling Puppet Usage to a Global Organization
Scaling Puppet Usage to a Global Organization
 
Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...
Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...
Alfresco DevCon 2018: SDK 3 Multi Module project using Nexus 3 for releases a...
 
Ant, Maven and Jenkins
Ant, Maven and JenkinsAnt, Maven and Jenkins
Ant, Maven and Jenkins
 
Java 9 and the impact on Maven Projects (JavaOne 2016)
Java 9 and the impact on Maven Projects (JavaOne 2016)Java 9 and the impact on Maven Projects (JavaOne 2016)
Java 9 and the impact on Maven Projects (JavaOne 2016)
 
JSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & MavenJSF, Facelets, Spring-JSF & Maven
JSF, Facelets, Spring-JSF & Maven
 
Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2Jsf, facelets, spring, hibernate, maven2
Jsf, facelets, spring, hibernate, maven2
 
OpenTuesday: Agile Testautomatisierung und Continuous Integration
OpenTuesday: Agile Testautomatisierung und Continuous IntegrationOpenTuesday: Agile Testautomatisierung und Continuous Integration
OpenTuesday: Agile Testautomatisierung und Continuous Integration
 
The Maven2 Revolution
The Maven2 RevolutionThe Maven2 Revolution
The Maven2 Revolution
 
Seven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseSeven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuse
 
Build system
Build systemBuild system
Build system
 
Deployment presentation
Deployment presentationDeployment presentation
Deployment presentation
 
Introduction To Maven2
Introduction To Maven2Introduction To Maven2
Introduction To Maven2
 
RubyConf 2009
RubyConf 2009RubyConf 2009
RubyConf 2009
 
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
 
JRuby and Google App Engine
JRuby and Google App EngineJRuby and Google App Engine
JRuby and Google App Engine
 
Java EE 7: the Voyage of the Cloud Treader
Java EE 7: the Voyage of the Cloud TreaderJava EE 7: the Voyage of the Cloud Treader
Java EE 7: the Voyage of the Cloud Treader
 
The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9
 

Dernier

8447779800, Low rate Call girls in Uttam Nagar Delhi NCR
8447779800, Low rate Call girls in Uttam Nagar Delhi NCR8447779800, Low rate Call girls in Uttam Nagar Delhi NCR
8447779800, Low rate Call girls in Uttam Nagar Delhi NCRashishs7044
 
Buy gmail accounts.pdf Buy Old Gmail Accounts
Buy gmail accounts.pdf Buy Old Gmail AccountsBuy gmail accounts.pdf Buy Old Gmail Accounts
Buy gmail accounts.pdf Buy Old Gmail AccountsBuy Verified Accounts
 
8447779800, Low rate Call girls in Saket Delhi NCR
8447779800, Low rate Call girls in Saket Delhi NCR8447779800, Low rate Call girls in Saket Delhi NCR
8447779800, Low rate Call girls in Saket Delhi NCRashishs7044
 
India Consumer 2024 Redacted Sample Report
India Consumer 2024 Redacted Sample ReportIndia Consumer 2024 Redacted Sample Report
India Consumer 2024 Redacted Sample ReportMintel Group
 
8447779800, Low rate Call girls in Tughlakabad Delhi NCR
8447779800, Low rate Call girls in Tughlakabad Delhi NCR8447779800, Low rate Call girls in Tughlakabad Delhi NCR
8447779800, Low rate Call girls in Tughlakabad Delhi NCRashishs7044
 
APRIL2024_UKRAINE_xml_0000000000000 .pdf
APRIL2024_UKRAINE_xml_0000000000000 .pdfAPRIL2024_UKRAINE_xml_0000000000000 .pdf
APRIL2024_UKRAINE_xml_0000000000000 .pdfRbc Rbcua
 
Intro to BCG's Carbon Emissions Benchmark_vF.pdf
Intro to BCG's Carbon Emissions Benchmark_vF.pdfIntro to BCG's Carbon Emissions Benchmark_vF.pdf
Intro to BCG's Carbon Emissions Benchmark_vF.pdfpollardmorgan
 
Innovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdfInnovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdfrichard876048
 
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCRashishs7044
 
IoT Insurance Observatory: summary 2024
IoT Insurance Observatory:  summary 2024IoT Insurance Observatory:  summary 2024
IoT Insurance Observatory: summary 2024Matteo Carbone
 
Case study on tata clothing brand zudio in detail
Case study on tata clothing brand zudio in detailCase study on tata clothing brand zudio in detail
Case study on tata clothing brand zudio in detailAriel592675
 
Global Scenario On Sustainable and Resilient Coconut Industry by Dr. Jelfina...
Global Scenario On Sustainable  and Resilient Coconut Industry by Dr. Jelfina...Global Scenario On Sustainable  and Resilient Coconut Industry by Dr. Jelfina...
Global Scenario On Sustainable and Resilient Coconut Industry by Dr. Jelfina...ictsugar
 
8447779800, Low rate Call girls in New Ashok Nagar Delhi NCR
8447779800, Low rate Call girls in New Ashok Nagar Delhi NCR8447779800, Low rate Call girls in New Ashok Nagar Delhi NCR
8447779800, Low rate Call girls in New Ashok Nagar Delhi NCRashishs7044
 
PSCC - Capability Statement Presentation
PSCC - Capability Statement PresentationPSCC - Capability Statement Presentation
PSCC - Capability Statement PresentationAnamaria Contreras
 
Organizational Structure Running A Successful Business
Organizational Structure Running A Successful BusinessOrganizational Structure Running A Successful Business
Organizational Structure Running A Successful BusinessSeta Wicaksana
 
Kenya Coconut Production Presentation by Dr. Lalith Perera
Kenya Coconut Production Presentation by Dr. Lalith PereraKenya Coconut Production Presentation by Dr. Lalith Perera
Kenya Coconut Production Presentation by Dr. Lalith Pereraictsugar
 

Dernier (20)

8447779800, Low rate Call girls in Uttam Nagar Delhi NCR
8447779800, Low rate Call girls in Uttam Nagar Delhi NCR8447779800, Low rate Call girls in Uttam Nagar Delhi NCR
8447779800, Low rate Call girls in Uttam Nagar Delhi NCR
 
Buy gmail accounts.pdf Buy Old Gmail Accounts
Buy gmail accounts.pdf Buy Old Gmail AccountsBuy gmail accounts.pdf Buy Old Gmail Accounts
Buy gmail accounts.pdf Buy Old Gmail Accounts
 
8447779800, Low rate Call girls in Saket Delhi NCR
8447779800, Low rate Call girls in Saket Delhi NCR8447779800, Low rate Call girls in Saket Delhi NCR
8447779800, Low rate Call girls in Saket Delhi NCR
 
India Consumer 2024 Redacted Sample Report
India Consumer 2024 Redacted Sample ReportIndia Consumer 2024 Redacted Sample Report
India Consumer 2024 Redacted Sample Report
 
8447779800, Low rate Call girls in Tughlakabad Delhi NCR
8447779800, Low rate Call girls in Tughlakabad Delhi NCR8447779800, Low rate Call girls in Tughlakabad Delhi NCR
8447779800, Low rate Call girls in Tughlakabad Delhi NCR
 
APRIL2024_UKRAINE_xml_0000000000000 .pdf
APRIL2024_UKRAINE_xml_0000000000000 .pdfAPRIL2024_UKRAINE_xml_0000000000000 .pdf
APRIL2024_UKRAINE_xml_0000000000000 .pdf
 
Intro to BCG's Carbon Emissions Benchmark_vF.pdf
Intro to BCG's Carbon Emissions Benchmark_vF.pdfIntro to BCG's Carbon Emissions Benchmark_vF.pdf
Intro to BCG's Carbon Emissions Benchmark_vF.pdf
 
Innovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdfInnovation Conference 5th March 2024.pdf
Innovation Conference 5th March 2024.pdf
 
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
8447779800, Low rate Call girls in Kotla Mubarakpur Delhi NCR
 
IoT Insurance Observatory: summary 2024
IoT Insurance Observatory:  summary 2024IoT Insurance Observatory:  summary 2024
IoT Insurance Observatory: summary 2024
 
Enjoy ➥8448380779▻ Call Girls In Sector 18 Noida Escorts Delhi NCR
Enjoy ➥8448380779▻ Call Girls In Sector 18 Noida Escorts Delhi NCREnjoy ➥8448380779▻ Call Girls In Sector 18 Noida Escorts Delhi NCR
Enjoy ➥8448380779▻ Call Girls In Sector 18 Noida Escorts Delhi NCR
 
Japan IT Week 2024 Brochure by 47Billion (English)
Japan IT Week 2024 Brochure by 47Billion (English)Japan IT Week 2024 Brochure by 47Billion (English)
Japan IT Week 2024 Brochure by 47Billion (English)
 
Case study on tata clothing brand zudio in detail
Case study on tata clothing brand zudio in detailCase study on tata clothing brand zudio in detail
Case study on tata clothing brand zudio in detail
 
Global Scenario On Sustainable and Resilient Coconut Industry by Dr. Jelfina...
Global Scenario On Sustainable  and Resilient Coconut Industry by Dr. Jelfina...Global Scenario On Sustainable  and Resilient Coconut Industry by Dr. Jelfina...
Global Scenario On Sustainable and Resilient Coconut Industry by Dr. Jelfina...
 
Call Us ➥9319373153▻Call Girls In North Goa
Call Us ➥9319373153▻Call Girls In North GoaCall Us ➥9319373153▻Call Girls In North Goa
Call Us ➥9319373153▻Call Girls In North Goa
 
Corporate Profile 47Billion Information Technology
Corporate Profile 47Billion Information TechnologyCorporate Profile 47Billion Information Technology
Corporate Profile 47Billion Information Technology
 
8447779800, Low rate Call girls in New Ashok Nagar Delhi NCR
8447779800, Low rate Call girls in New Ashok Nagar Delhi NCR8447779800, Low rate Call girls in New Ashok Nagar Delhi NCR
8447779800, Low rate Call girls in New Ashok Nagar Delhi NCR
 
PSCC - Capability Statement Presentation
PSCC - Capability Statement PresentationPSCC - Capability Statement Presentation
PSCC - Capability Statement Presentation
 
Organizational Structure Running A Successful Business
Organizational Structure Running A Successful BusinessOrganizational Structure Running A Successful Business
Organizational Structure Running A Successful Business
 
Kenya Coconut Production Presentation by Dr. Lalith Perera
Kenya Coconut Production Presentation by Dr. Lalith PereraKenya Coconut Production Presentation by Dr. Lalith Perera
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
  • 24. Creiamo un componente.. Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License Border.tml (versione 1) ● <html xmlns:t=quot;http://tapestry.apache.org/schema/tapestry_5_0_0.xsdquot;> <head> <title>titolo finestra</title> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/layout.cssquot;></link> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/header.cssquot;></link> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/menu.cssquot;></link> <link rel=quot;stylesheetquot; href=quot;/jukeweb/styles/body.cssquot;></link> <script src=quot;/jukeweb/js/script.jsquot; ></script> <script src=quot;/jukeweb/js/audio-player.jsquot; ></script> </head> ... Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 24 Tapestry5 in action Javaday Roma - 01/12/2007
  • 25. 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
  • 60. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;> pass </label> <div class=quot;elementquot;> <t:passwordField t:id=quot;passwordquot; t:validate=quot;required, minLength=5quot; /> </div> <div class=quot;submitquot;> <input type=quot;submitquot; value=quot;loginquot;/> </div> </t:form> </div> <div class=quot;vocemenuquot;> <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 60 Tapestry5 in action Javaday Roma - 01/12/2007
  • 61. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;> pass </label> <div class=quot;elementquot;> <t:passwordField t:id=quot;passwordquot; t:validate=quot;required, minLength=5quot; /> </div> <div class=quot;submitquot;> <input type=quot;submitquot; value=quot;loginquot;/> </div> </t:form> </div> <div class=quot;vocemenuquot;> <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 61 Tapestry5 in action Javaday Roma - 01/12/2007
  • 62. Il componente login Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License (..continua) ● ... <label t:type=quot;labelquot; t:for=quot;passwordquot; class=quot;labelquot;> pass </label> <div class=quot;elementquot;> <t:passwordField t:id=quot;passwordquot; t:validate=quot;required, minLength=5quot; /> </div> <div class=quot;submitquot;> <input type=quot;submitquot; value=quot;loginquot;/> </div> </t:form> </div> <div class=quot;vocemenuquot;> <a href=quot;#quot; t:type=quot;actionLinkquot; t:id=quot;logoutquot;>logout</a> </div> </t:container> Marco Pugliese - bobpuley@gmail.com – Java Italian Portal 62 Tapestry5 in action Javaday Roma - 01/12/2007
  • 63. 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