SlideShare ist ein Scribd-Unternehmen logo
1 von 75
Downloaden Sie, um offline zu lesen
In The Brain Of
Howard M. Lewis Ship:




     Tapestry 5: Java
     Power, Scripting Ease

TWD Consulting, Inc.
hlship@comcast.net
                       1   © 2010 Howard M. Lewis Ship
Howard Lewis Ship

• Creator, Apache Tapestry
• Author, "Tapestry in Action"
• Independent Consultant
• Java Champion




                            2    © 2010 Howard M. Lewis Ship
What is Tapestry?




         3      © 2010 Howard M. Lewis Ship
Java
 4     © 2010 Howard M. Lewis Ship
Open
Source
  5   © 2010 Howard M. Lewis Ship
Component
  Based
    6   © 2010 Howard M. Lewis Ship
Developer
 Focused
    7   © 2010 Howard M. Lewis Ship
Convention
    over
Configuration
     8    © 2010 Howard M. Lewis Ship
Concise
   9   © 2010 Howard M. Lewis Ship
Fast!
  10    © 2010 Howard M. Lewis Ship
Mature
  11   © 2010 Howard M. Lewis Ship
Tapestry
Elements
       12   © 2010 Howard M. Lewis Ship
Tapestry Templates



        Login.tml

        <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
          <body>
            <h1>Please Login</h1>
                                                        Login
             <t:form>
                <t:label for="userId"/>
                <t:textfield value="userId"/>
                <br/>
                                                                   form
                <t:label for="password"/>
                <t:passwordfield value="password"/>
                <br/>                                              label
                <input type="submit" value="Login"/>
             </t:form>
           </html>
                                                                 textfield


                                                                   label

                                                                passwordfield


                                        13                                  © 2010 Howard M. Lewis Ship
Page Classes


   Login.tml

   <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
     <body>
       <h1>Please Login</h1>
                                                         Login.java
        <t:form>
           <t:label for="userId"/>                       public class Login
           <t:textfield value="userId"/>                 {
           <br/>                                           @Property
           <t:label for="password"/>                       private String userId;
           <t:passwordfield value="password"/>
           <br/>                                             @Property
           <input type="submit" value="Login"/>              private String password;
        </t:form>
      </html>                                                Object onSuccess()
                                                             {
                                                               …
                                                             }
                                                         }




                                                  14                                    © 2010 Howard M. Lewis Ship
Page Flows

  Login.java                               UserProfile.java

  public class Login                       public class UserProfile
  {                                        {
    @Property                                …
    private String userId;                 }
      @Property
      private String password;

      void onValidate()
      {
        …
      }

      Object onSuccess()
      {
        …

          return UserProfile.class;
      }
  }




                                      15                              © 2010 Howard M. Lewis Ship
Inversion of Control
  Login.java

  public class Login
                                                              Your
                                                              code
  {
    @Property
    private String userId;

      @Property
      private String password;

      …                          Inject IoC
      @Inject
                                 Service
      private Session session;   into field

      @CommitAfter
      Object onSuccess()
      {
        …

          User user = (User) session. …

          user.setLastLogin(new Date());



  }
      }
          return UserProfile.class;
                                                   Tapestry
                                                   Services
                                              16              © 2010 Howard M. Lewis Ship
Meta-Programming
 Login.java

 public class Login                Generate getter & setter
 {
   @Property
   private String userId;

     @Property
     private String password;

     @InjectPage
     private UserProfile userProfilePage;

     …

     @Inject
     private Session session;
                                    Commit Hibernate transaction
     @CommitAfter
     Object onSuccess()
     {
       …

         User user = (User) session. …

         user.setLastLogin(new Date());


         return userProfilePage;
     }
 }



                                                    17             © 2010 Howard M. Lewis Ship
State Management


                    UserProfile.java

                    public class UserProfile
                    {                               Shared global value (any page)
                      @Property
                      @SessionState
   This page only     private UserEntity user;

                        @Property
                        @Persist
                        private Date searchStart;

                    }




                                            18                             © 2010 Howard M. Lewis Ship
Template                             Injections



                  Component      Meta-
     Java Class
                              Programming


                   Message
                   Catalog




                        19                   © 2010 Howard M. Lewis Ship
❝Most software today is very much
like an Egyptian pyramid with
millions of bricks piled on top of each
other, with no structural integrity, but
just done by brute force and
thousands of slaves.❞

Alan Kay, co-designer of the Smalltalk programming
language
                        20                  © 2010 Howard M. Lewis Ship
Developer
Productivity
         21    © 2010 Howard M. Lewis Ship
22   © 2010 Howard M. Lewis Ship
Live Class Reloading




            23         © 2010 Howard M. Lewis Ship
24   © 2010 Howard M. Lewis Ship
Non-Tapestry Exception Reporting




                          25       © 2010 Howard M. Lewis Ship
Index does not contain a property named 'now'
           Available properties: class,
           componentResources, currentTime




                      26                 © 2010 Howard M. Lewis Ship
27   © 2010 Howard M. Lewis Ship
Scaffolding




              28   © 2010 Howard M. Lewis Ship
BoardGame.java

@Entity
public class BoardGame
{
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @NonVisual
  private long id;

  @Validate("required")
  private String title;

  private String creator;

  private String publisher;

  private Date published;

  private boolean inPrint;

  @Validate("required")
  @Column(nullable = false)
  private Genre genre;

  @Validate("required")
  @Column(nullable = false)
  private Theme theme;

  @Validate("min=1")
  private Integer minPlayers;

  @Validate("min=1")
  private Integer maxPlayers;

  @Validate("min=1,max=5")
  private Integer rating;

  @DataType("longtext")
  private String notes;


                                          29                           © 2010 Howard M. Lewis Ship
30   © 2010 Howard M. Lewis Ship
Parameters
    Property Types




                             BeanEditForm
    Naming Conventions



     Annotations



        Explicit Overrides



Localized Messages

                                            31   © 2010 Howard M. Lewis Ship
32   © 2010 Howard M. Lewis Ship
Feedback &
Exploration


              33   © 2010 Howard M. Lewis Ship
Flow




34    © 2010 Howard M. Lewis Ship
❝PHP and Rails have taught us that
development speed is more important
than we thought it was ... you really
don’t understand a feature till you’ve
built it, so the faster you can build
them the faster you understand
them.❞

Tim Bray, Director of Web Technologies, Sun
Microsystems
                        35                    © 2010 Howard M. Lewis Ship
Internationalization




         36      © 2010 Howard M. Lewis Ship
37   © 2010 Howard M. Lewis Ship
Index_de.properties

page-title=Erstellen Sie eine neue Brettspiel
add-game=Spiel hinzufŸgen
game-added=Added Brettspiel          Index.tml

                                     <html t:type="layout" title="message:page-title"
modern=Modernen
                                       xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
medieval=Mittelalter
                                       xmlns:p="tapestry:parameter">
bible=Bibel
abstract=Zusammenfassung
                                       <strong>${message}</strong>
war_game=Kriegsspiel
                                       <t:beaneditform submitlabel="message:add-game" object="game" />
card=Karte
role_playing=Rollenspiele
                                     </html>
cooperative=Genossenschaft

creator-label=Schšpfer
publisher-label=Verlag
published-label=Veršffentlicht
inprint-label=Im Druck
theme-label=Thema
minplayers-label=Mindest-Spieler
maxplayers-label=Maximale Spieler
notes-label=Notation




                                                  38                                   © 2010 Howard M. Lewis Ship
Tapestry
Components




       39    © 2010 Howard M. Lewis Ship
Nested Components
                                                                     Layout
                                                                   title : String
Layout.tml
                                                                 pageNames : List
                                                                pageName : String
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
  xmlns:p="tapestry:parameter">
  <head>
    <title>${title}</title>
  </head>
  <body>
  …
    <div id="menu">
    <ul>
      <li t:type="loop" source="pageNames" value="pageName"
          class="prop:classForPageName">
        <t:pagelink page="prop:pageName">${pageName}</t:pagelink>   Index
      </li>
    </ul>
  </div>
                                                                    Layout
   …



                                                             Loop             PageLink
                  Render property pageName

                                          40                                  © 2010 Howard M. Lewis Ship
Layout Components
Layout.tml


<html xmlns="http://www.w3.org/1999/xhtml"                           ❷
  xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
  xmlns:p="tapestry:parameter">
    <head>
        <title>${title}</title>
    </head>
    <body>

         . . .

             <t:body/>   ❸
         . . .
                   ❺         Index.tml
    </body>
</html>                      <html t:type="layout" title="message:page-title"                      ❶
                               xmlns:t="http://tapestry.apache.org/schema/ ↵
                             tapestry_5_1_0.xsd"
                               xmlns:p="tapestry:parameter">

                                <t:beaneditform submitlabel="message:add-game"
                                   object="game" />
                                                                                 ❹
                             </html>



                                                41                               © 2010 Howard M. Lewis Ship
Component Parameters

   Layout.java


   public class Layout
   {
     /** The page title, for the <title> element and the <h1> element. */
     @Property
     @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
     private String title;

      @Property
      @Parameter(defaultPrefix = BindingConstants.LITERAL)
      private String sidebarTitle;

      @Property
      @Parameter(defaultPrefix = BindingConstants.LITERAL)
      private Block sidebar;

      @Property
      private String pageName;




                                        42                            © 2010 Howard M. Lewis Ship
Non-Template Components



  OutputDate.java


  public class OutputDate
  {
    private final DateFormat formatter =
      DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);

      @Parameter(required = true, allowNull = false)
      private Date date;

      void beginRender(MarkupWriter writer)
      {
        writer.write(formatter.format(date));
      }
  }




                                          43                           © 2010 Howard M. Lewis Ship
Start




           SetupRender
                                                      Component Rendering
               true
                                            OutputDate.java
                                    false
           BeginRender

                                             void beginRender(MarkupWriter writer)
               true
                            false            {
                                               writer.write(formatter.format(date));
                                             }
          Render Template




           Render Body




  false
            AfterRender
false
                true



          CleanupRender


               true



               End
                                               44                            © 2010 Howard M. Lewis Ship
45   © 2010 Howard M. Lewis Ship
46   © 2010 Howard M. Lewis Ship
Partial Page Updates
Games.tml

                                        Games.tml
<t:actionlink t:id="selectGame"
  context="game" zone="gameDetail">     <t:zone id="gameDetail" t:id="gameDetail">
  ${game.title}                           <t:if test="selectedGame">
</t:actionlink>                             <strong>${selectedGame.title}</strong>
                                            by
                                            <strong>${selectedGame.creator}</strong>
                                            <br />
                                            For ${selectedGame.minPlayers} - ↵
.../games.selectGame/3                  ${selectedGame.maxPlayers} players.
                                          </t:if>
                                        </t:zone>

             Games.java


                @Property
                private BoardGame game, selectedGame;

                @InjectComponent
                private Zone gameDetail;

                Object onActionFromSelectGame(BoardGame game)
                {
                  selectedGame = game;

                    return gameDetail.getBody();
                }
                                                47                          © 2010 Howard M. Lewis Ship
Encapsulation

      48   © 2010 Howard M. Lewis Ship
Tapestry
Performance




        49    © 2010 Howard M. Lewis Ship
Request
Processing
Speed




             50   © 2010 Howard M. Lewis Ship
Java
== Fast
   51   © 2010 Howard M. Lewis Ship
No
Reflection
    52   © 2010 Howard M. Lewis Ship
Page
Pooling
   53   © 2010 Howard M. Lewis Ship
GZIP
Compression
     54   © 2010 Howard M. Lewis Ship
Scalability
55          © 2010 Howard M. Lewis Ship
JavaScript
Aggregation
     56   © 2010 Howard M. Lewis Ship
Far Future
 Expires
 Header
    57   © 2010 Howard M. Lewis Ship
Caching
   58   © 2010 Howard M. Lewis Ship
Content
Delivery
Network
   59      © 2010 Howard M. Lewis Ship
❝Architecture is the decisions that you
wish you could get right early in a
project.❞



Martin Fowler, Chief Scientist, ThoughtWorks
                        60                     © 2010 Howard M. Lewis Ship
Conclusion




         61   © 2010 Howard M. Lewis Ship
62   © 2010 Howard M. Lewis Ship
Infrastructure




            63   © 2010 Howard M. Lewis Ship
Performance




          64   © 2010 Howard M. Lewis Ship
Tapestry: The Expert is
Built In




            65      © 2010 Howard M. Lewis Ship
Tapestry 5 In Production




                      66   © 2010 Howard M. Lewis Ship
http://tapestry.apache.org


            •Downloads
            •Mailing Lists
            •Component Reference
            •User's Guide
            •Wiki




       67                  © 2010 Howard M. Lewis Ship
http://jumpstart.doublenegative.com.au/




                       •Application Skeleton
                       •Detailed tutorials




                  68                    © 2010 Howard M. Lewis Ship
http://chenillekit.codehaus.org/




            69            © 2010 Howard M. Lewis Ship
http://wookicentral.com/



        •Collaborative Book
        Authoring
        •Useful blog
        •Spinning off libraries




   70                     © 2010 Howard M. Lewis Ship
http://tynamo.org/



     •Domain-Driven Design
     •Improved Hibernate
      support
     •RESTful web services
     •JPA support




71                   © 2010 Howard M. Lewis Ship
http://github.com/hlship/t5intro




              72          © 2010 Howard M. Lewis Ship
http://howardlewisship.com




    Tapestry 5 Development and Support
   On-site / Hands-on Tapestry Training
                    hlship@comcast.net
            73                  © 2010 Howard M. Lewis Ship
Image Credits
   © 2006 Chris Walton
   http://www.flickr.com/photos/philocrites/245011706/

                                                © 2009 Nataline Fung
                  http://www.flickr.com/photos/metaphora/3384569933/
   © 2006 Martino Sabia
   http://www.flickr.com/photos/ezu/297634534/
                                                 © 2008 Alan Grinberg
                   http://www.flickr.com/photos/agrinberg/2465119180/
   © 2008 Manu Gómez
   http://www.flickr.com/photos/manugomi/2884678938/
                                                  © 2006 Tom Magliery
                      http://www.flickr.com/photos/mag3737/267638148/
   © 2003 A. Lipson
   http://www.andrewlipson.com/escher/relativity.html

                                                      © 2009 viernest
                    http://www.flickr.com/photos/viernest/3380560365/
   © 2007 Jojo Cence
   http://www.flickr.com/photos/jojocence/1372693375/

                                                © 2007 Patrick Dirden
                     http://www.flickr.com/photos/sp8254/2052236004/
   © 2009 Dani Ihtatho
   http://www.flickr.com/photos/ihtatho/627226315/


                                     74                                 © 2010 Howard M. Lewis Ship
Image Credits
   © 2008 Christophe Delaere
   http://www.flickr.com/photos/delaere/2514143242/

                                         © 2007 Marina Campos Vinhal
                http://www.flickr.com/photos/marinacvinhal/379111290/
   © 2006 kris247
   http://www.flickr.com/photos/kris247/86924080/
                                                        © Randal Munroe
                                                   http://xkcd.com/303/
   © 2009 Howard M. Lewis Ship
   http://www.flickr.com/photos/hlship/3388927572/

                                          © 2008 Howard M. Lewis Ship
                      http://www.flickr.com/photos/hlship/3107467741/




                                    75                                    © 2010 Howard M. Lewis Ship

Weitere ähnliche Inhalte

Was ist angesagt?

Jquery dojo slides
Jquery dojo slidesJquery dojo slides
Jquery dojo slideshelenmga
 
Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastGabriel Hamilton
 
Starting with jQuery
Starting with jQueryStarting with jQuery
Starting with jQueryAnil Kumar
 
Single page webapps & javascript-testing
Single page webapps & javascript-testingSingle page webapps & javascript-testing
Single page webapps & javascript-testingsmontanari
 
Rich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkitRich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkitalexklaeser
 
Top Ten Web Defenses - DefCamp 2012
Top Ten Web Defenses  - DefCamp 2012Top Ten Web Defenses  - DefCamp 2012
Top Ten Web Defenses - DefCamp 2012DefCamp
 
fuser interface-development-using-jquery
fuser interface-development-using-jqueryfuser interface-development-using-jquery
fuser interface-development-using-jqueryKostas Mavridis
 

Was ist angesagt? (7)

Jquery dojo slides
Jquery dojo slidesJquery dojo slides
Jquery dojo slides
 
Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, Fast
 
Starting with jQuery
Starting with jQueryStarting with jQuery
Starting with jQuery
 
Single page webapps & javascript-testing
Single page webapps & javascript-testingSingle page webapps & javascript-testing
Single page webapps & javascript-testing
 
Rich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkitRich internet application development using the dojo toolkit
Rich internet application development using the dojo toolkit
 
Top Ten Web Defenses - DefCamp 2012
Top Ten Web Defenses  - DefCamp 2012Top Ten Web Defenses  - DefCamp 2012
Top Ten Web Defenses - DefCamp 2012
 
fuser interface-development-using-jquery
fuser interface-development-using-jqueryfuser interface-development-using-jquery
fuser interface-development-using-jquery
 

Andere mochten auch

Tapestry In Action For Real
Tapestry In Action For RealTapestry In Action For Real
Tapestry In Action For RealSkills Matter
 
The Bayeux Tapestry (complete)
The Bayeux Tapestry (complete)The Bayeux Tapestry (complete)
The Bayeux Tapestry (complete)anthony_morgan
 
Comparing JVM Web Frameworks - Jfokus 2012
Comparing JVM Web Frameworks - Jfokus 2012Comparing JVM Web Frameworks - Jfokus 2012
Comparing JVM Web Frameworks - Jfokus 2012Matt Raible
 
HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012
HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012
HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012Matt Raible
 
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and WicketComparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and WicketMatt Raible
 

Andere mochten auch (6)

Tapestry In Action For Real
Tapestry In Action For RealTapestry In Action For Real
Tapestry In Action For Real
 
Tapestry it is simple
Tapestry it is simpleTapestry it is simple
Tapestry it is simple
 
The Bayeux Tapestry (complete)
The Bayeux Tapestry (complete)The Bayeux Tapestry (complete)
The Bayeux Tapestry (complete)
 
Comparing JVM Web Frameworks - Jfokus 2012
Comparing JVM Web Frameworks - Jfokus 2012Comparing JVM Web Frameworks - Jfokus 2012
Comparing JVM Web Frameworks - Jfokus 2012
 
HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012
HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012
HTML5 with Play Scala, CoffeeScript and Jade - Jfokus 2012
 
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and WicketComparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
Comparing JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket
 

Ähnlich wie Skills Matter Itbo April2010 Tapestry

softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EEAlexis Hassler
 
A Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETA Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETJames Johnson
 
Creating an Uber Clone - Part XII.pdf
Creating an Uber Clone - Part XII.pdfCreating an Uber Clone - Part XII.pdf
Creating an Uber Clone - Part XII.pdfShaiAlmog1
 
Programming services-slides
Programming services-slidesProgramming services-slides
Programming services-slidesMasterCode.vn
 
A Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETA Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETJames Johnson
 
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"LogeekNightUkraine
 
Creating a Java EE 7 Websocket Chat Application
Creating a Java EE 7 Websocket Chat ApplicationCreating a Java EE 7 Websocket Chat Application
Creating a Java EE 7 Websocket Chat ApplicationMicha Kops
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020Thodoris Bais
 
Integrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsIntegrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsDan Wahlin
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfShaiAlmog1
 
Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010Cleverson Sacramento
 
Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpaStaples
 
Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"Anna Shymchenko
 
Intro to HTML5 Web Storage
Intro to HTML5 Web StorageIntro to HTML5 Web Storage
Intro to HTML5 Web Storagedylanks
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your CodeDrupalDay
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotationjavatwo2011
 

Ähnlich wie Skills Matter Itbo April2010 Tapestry (20)

softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EE
 
A Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETA Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NET
 
Creating an Uber Clone - Part XII.pdf
Creating an Uber Clone - Part XII.pdfCreating an Uber Clone - Part XII.pdf
Creating an Uber Clone - Part XII.pdf
 
Programming services-slides
Programming services-slidesProgramming services-slides
Programming services-slides
 
A Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETA Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NET
 
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
 
Creating a Java EE 7 Websocket Chat Application
Creating a Java EE 7 Websocket Chat ApplicationCreating a Java EE 7 Websocket Chat Application
Creating a Java EE 7 Websocket Chat Application
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
 
Integrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsIntegrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight Applications
 
Jquery Basics
Jquery BasicsJquery Basics
Jquery Basics
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdf
 
Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010Demoiselle 2.0 no JavaOne Brasil 2010
Demoiselle 2.0 no JavaOne Brasil 2010
 
Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpa
 
Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"
 
Intro to HTML5 Web Storage
Intro to HTML5 Web StorageIntro to HTML5 Web Storage
Intro to HTML5 Web Storage
 
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter LehtoJavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your Code
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your Code
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 

Mehr von Skills Matter

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard LawrenceSkills Matter
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applicationsSkills Matter
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmSkills Matter
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimSkills Matter
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Skills Matter
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlSkills Matter
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsSkills Matter
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Skills Matter
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Skills Matter
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldSkills Matter
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Skills Matter
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Skills Matter
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingSkills Matter
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveSkills Matter
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSkills Matter
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tSkills Matter
 

Mehr von Skills Matter (20)

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberl
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.js
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source world
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testing
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
 
Serendipity-neo4j
Serendipity-neo4jSerendipity-neo4j
Serendipity-neo4j
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
 
Plug 20110217
Plug   20110217Plug   20110217
Plug 20110217
 
Lug presentation
Lug presentationLug presentation
Lug presentation
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
 
Plug saiku
Plug   saikuPlug   saiku
Plug saiku
 

Kürzlich hochgeladen

The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 

Kürzlich hochgeladen (20)

The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 

Skills Matter Itbo April2010 Tapestry

  • 1. In The Brain Of Howard M. Lewis Ship: Tapestry 5: Java Power, Scripting Ease TWD Consulting, Inc. hlship@comcast.net 1 © 2010 Howard M. Lewis Ship
  • 2. Howard Lewis Ship • Creator, Apache Tapestry • Author, "Tapestry in Action" • Independent Consultant • Java Champion 2 © 2010 Howard M. Lewis Ship
  • 3. What is Tapestry? 3 © 2010 Howard M. Lewis Ship
  • 4. Java 4 © 2010 Howard M. Lewis Ship
  • 5. Open Source 5 © 2010 Howard M. Lewis Ship
  • 6. Component Based 6 © 2010 Howard M. Lewis Ship
  • 7. Developer Focused 7 © 2010 Howard M. Lewis Ship
  • 8. Convention over Configuration 8 © 2010 Howard M. Lewis Ship
  • 9. Concise 9 © 2010 Howard M. Lewis Ship
  • 10. Fast! 10 © 2010 Howard M. Lewis Ship
  • 11. Mature 11 © 2010 Howard M. Lewis Ship
  • 12. Tapestry Elements 12 © 2010 Howard M. Lewis Ship
  • 13. Tapestry Templates Login.tml <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"> <body> <h1>Please Login</h1> Login <t:form> <t:label for="userId"/> <t:textfield value="userId"/> <br/> form <t:label for="password"/> <t:passwordfield value="password"/> <br/> label <input type="submit" value="Login"/> </t:form> </html> textfield label passwordfield 13 © 2010 Howard M. Lewis Ship
  • 14. Page Classes Login.tml <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"> <body> <h1>Please Login</h1> Login.java <t:form> <t:label for="userId"/> public class Login <t:textfield value="userId"/> { <br/> @Property <t:label for="password"/> private String userId; <t:passwordfield value="password"/> <br/> @Property <input type="submit" value="Login"/> private String password; </t:form> </html> Object onSuccess() { … } } 14 © 2010 Howard M. Lewis Ship
  • 15. Page Flows Login.java UserProfile.java public class Login public class UserProfile { { @Property … private String userId; } @Property private String password; void onValidate() { … } Object onSuccess() { … return UserProfile.class; } } 15 © 2010 Howard M. Lewis Ship
  • 16. Inversion of Control Login.java public class Login Your code { @Property private String userId; @Property private String password; … Inject IoC @Inject Service private Session session; into field @CommitAfter Object onSuccess() { … User user = (User) session. … user.setLastLogin(new Date()); } } return UserProfile.class; Tapestry Services 16 © 2010 Howard M. Lewis Ship
  • 17. Meta-Programming Login.java public class Login Generate getter & setter { @Property private String userId; @Property private String password; @InjectPage private UserProfile userProfilePage; … @Inject private Session session; Commit Hibernate transaction @CommitAfter Object onSuccess() { … User user = (User) session. … user.setLastLogin(new Date()); return userProfilePage; } } 17 © 2010 Howard M. Lewis Ship
  • 18. State Management UserProfile.java public class UserProfile { Shared global value (any page) @Property @SessionState This page only private UserEntity user; @Property @Persist private Date searchStart; } 18 © 2010 Howard M. Lewis Ship
  • 19. Template Injections Component Meta- Java Class Programming Message Catalog 19 © 2010 Howard M. Lewis Ship
  • 20. ❝Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves.❞ Alan Kay, co-designer of the Smalltalk programming language 20 © 2010 Howard M. Lewis Ship
  • 21. Developer Productivity 21 © 2010 Howard M. Lewis Ship
  • 22. 22 © 2010 Howard M. Lewis Ship
  • 23. Live Class Reloading 23 © 2010 Howard M. Lewis Ship
  • 24. 24 © 2010 Howard M. Lewis Ship
  • 25. Non-Tapestry Exception Reporting 25 © 2010 Howard M. Lewis Ship
  • 26. Index does not contain a property named 'now' Available properties: class, componentResources, currentTime 26 © 2010 Howard M. Lewis Ship
  • 27. 27 © 2010 Howard M. Lewis Ship
  • 28. Scaffolding 28 © 2010 Howard M. Lewis Ship
  • 29. BoardGame.java @Entity public class BoardGame { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @NonVisual private long id; @Validate("required") private String title; private String creator; private String publisher; private Date published; private boolean inPrint; @Validate("required") @Column(nullable = false) private Genre genre; @Validate("required") @Column(nullable = false) private Theme theme; @Validate("min=1") private Integer minPlayers; @Validate("min=1") private Integer maxPlayers; @Validate("min=1,max=5") private Integer rating; @DataType("longtext") private String notes; 29 © 2010 Howard M. Lewis Ship
  • 30. 30 © 2010 Howard M. Lewis Ship
  • 31. Parameters Property Types BeanEditForm Naming Conventions Annotations Explicit Overrides Localized Messages 31 © 2010 Howard M. Lewis Ship
  • 32. 32 © 2010 Howard M. Lewis Ship
  • 33. Feedback & Exploration 33 © 2010 Howard M. Lewis Ship
  • 34. Flow 34 © 2010 Howard M. Lewis Ship
  • 35. ❝PHP and Rails have taught us that development speed is more important than we thought it was ... you really don’t understand a feature till you’ve built it, so the faster you can build them the faster you understand them.❞ Tim Bray, Director of Web Technologies, Sun Microsystems 35 © 2010 Howard M. Lewis Ship
  • 36. Internationalization 36 © 2010 Howard M. Lewis Ship
  • 37. 37 © 2010 Howard M. Lewis Ship
  • 38. Index_de.properties page-title=Erstellen Sie eine neue Brettspiel add-game=Spiel hinzufŸgen game-added=Added Brettspiel Index.tml <html t:type="layout" title="message:page-title" modern=Modernen xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" medieval=Mittelalter xmlns:p="tapestry:parameter"> bible=Bibel abstract=Zusammenfassung <strong>${message}</strong> war_game=Kriegsspiel <t:beaneditform submitlabel="message:add-game" object="game" /> card=Karte role_playing=Rollenspiele </html> cooperative=Genossenschaft creator-label=Schšpfer publisher-label=Verlag published-label=Veršffentlicht inprint-label=Im Druck theme-label=Thema minplayers-label=Mindest-Spieler maxplayers-label=Maximale Spieler notes-label=Notation 38 © 2010 Howard M. Lewis Ship
  • 39. Tapestry Components 39 © 2010 Howard M. Lewis Ship
  • 40. Nested Components Layout title : String Layout.tml pageNames : List pageName : String <html xmlns="http://www.w3.org/1999/xhtml" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> <head> <title>${title}</title> </head> <body> … <div id="menu"> <ul> <li t:type="loop" source="pageNames" value="pageName" class="prop:classForPageName"> <t:pagelink page="prop:pageName">${pageName}</t:pagelink> Index </li> </ul> </div> Layout … Loop PageLink Render property pageName 40 © 2010 Howard M. Lewis Ship
  • 41. Layout Components Layout.tml <html xmlns="http://www.w3.org/1999/xhtml" ❷ xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> <head> <title>${title}</title> </head> <body> . . . <t:body/> ❸ . . . ❺ Index.tml </body> </html> <html t:type="layout" title="message:page-title" ❶ xmlns:t="http://tapestry.apache.org/schema/ ↵ tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> <t:beaneditform submitlabel="message:add-game" object="game" /> ❹ </html> 41 © 2010 Howard M. Lewis Ship
  • 42. Component Parameters Layout.java public class Layout { /** The page title, for the <title> element and the <h1> element. */ @Property @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL) private String title; @Property @Parameter(defaultPrefix = BindingConstants.LITERAL) private String sidebarTitle; @Property @Parameter(defaultPrefix = BindingConstants.LITERAL) private Block sidebar; @Property private String pageName; 42 © 2010 Howard M. Lewis Ship
  • 43. Non-Template Components OutputDate.java public class OutputDate { private final DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); @Parameter(required = true, allowNull = false) private Date date; void beginRender(MarkupWriter writer) { writer.write(formatter.format(date)); } } 43 © 2010 Howard M. Lewis Ship
  • 44. Start SetupRender Component Rendering true OutputDate.java false BeginRender void beginRender(MarkupWriter writer) true false { writer.write(formatter.format(date)); } Render Template Render Body false AfterRender false true CleanupRender true End 44 © 2010 Howard M. Lewis Ship
  • 45. 45 © 2010 Howard M. Lewis Ship
  • 46. 46 © 2010 Howard M. Lewis Ship
  • 47. Partial Page Updates Games.tml Games.tml <t:actionlink t:id="selectGame" context="game" zone="gameDetail"> <t:zone id="gameDetail" t:id="gameDetail"> ${game.title} <t:if test="selectedGame"> </t:actionlink> <strong>${selectedGame.title}</strong> by <strong>${selectedGame.creator}</strong> <br /> For ${selectedGame.minPlayers} - ↵ .../games.selectGame/3 ${selectedGame.maxPlayers} players. </t:if> </t:zone> Games.java @Property private BoardGame game, selectedGame; @InjectComponent private Zone gameDetail; Object onActionFromSelectGame(BoardGame game) { selectedGame = game; return gameDetail.getBody(); } 47 © 2010 Howard M. Lewis Ship
  • 48. Encapsulation 48 © 2010 Howard M. Lewis Ship
  • 49. Tapestry Performance 49 © 2010 Howard M. Lewis Ship
  • 50. Request Processing Speed 50 © 2010 Howard M. Lewis Ship
  • 51. Java == Fast 51 © 2010 Howard M. Lewis Ship
  • 52. No Reflection 52 © 2010 Howard M. Lewis Ship
  • 53. Page Pooling 53 © 2010 Howard M. Lewis Ship
  • 54. GZIP Compression 54 © 2010 Howard M. Lewis Ship
  • 55. Scalability 55 © 2010 Howard M. Lewis Ship
  • 56. JavaScript Aggregation 56 © 2010 Howard M. Lewis Ship
  • 57. Far Future Expires Header 57 © 2010 Howard M. Lewis Ship
  • 58. Caching 58 © 2010 Howard M. Lewis Ship
  • 59. Content Delivery Network 59 © 2010 Howard M. Lewis Ship
  • 60. ❝Architecture is the decisions that you wish you could get right early in a project.❞ Martin Fowler, Chief Scientist, ThoughtWorks 60 © 2010 Howard M. Lewis Ship
  • 61. Conclusion 61 © 2010 Howard M. Lewis Ship
  • 62. 62 © 2010 Howard M. Lewis Ship
  • 63. Infrastructure 63 © 2010 Howard M. Lewis Ship
  • 64. Performance 64 © 2010 Howard M. Lewis Ship
  • 65. Tapestry: The Expert is Built In 65 © 2010 Howard M. Lewis Ship
  • 66. Tapestry 5 In Production 66 © 2010 Howard M. Lewis Ship
  • 67. http://tapestry.apache.org •Downloads •Mailing Lists •Component Reference •User's Guide •Wiki 67 © 2010 Howard M. Lewis Ship
  • 68. http://jumpstart.doublenegative.com.au/ •Application Skeleton •Detailed tutorials 68 © 2010 Howard M. Lewis Ship
  • 69. http://chenillekit.codehaus.org/ 69 © 2010 Howard M. Lewis Ship
  • 70. http://wookicentral.com/ •Collaborative Book Authoring •Useful blog •Spinning off libraries 70 © 2010 Howard M. Lewis Ship
  • 71. http://tynamo.org/ •Domain-Driven Design •Improved Hibernate support •RESTful web services •JPA support 71 © 2010 Howard M. Lewis Ship
  • 72. http://github.com/hlship/t5intro 72 © 2010 Howard M. Lewis Ship
  • 73. http://howardlewisship.com Tapestry 5 Development and Support On-site / Hands-on Tapestry Training hlship@comcast.net 73 © 2010 Howard M. Lewis Ship
  • 74. Image Credits © 2006 Chris Walton http://www.flickr.com/photos/philocrites/245011706/ © 2009 Nataline Fung http://www.flickr.com/photos/metaphora/3384569933/ © 2006 Martino Sabia http://www.flickr.com/photos/ezu/297634534/ © 2008 Alan Grinberg http://www.flickr.com/photos/agrinberg/2465119180/ © 2008 Manu Gómez http://www.flickr.com/photos/manugomi/2884678938/ © 2006 Tom Magliery http://www.flickr.com/photos/mag3737/267638148/ © 2003 A. Lipson http://www.andrewlipson.com/escher/relativity.html © 2009 viernest http://www.flickr.com/photos/viernest/3380560365/ © 2007 Jojo Cence http://www.flickr.com/photos/jojocence/1372693375/ © 2007 Patrick Dirden http://www.flickr.com/photos/sp8254/2052236004/ © 2009 Dani Ihtatho http://www.flickr.com/photos/ihtatho/627226315/ 74 © 2010 Howard M. Lewis Ship
  • 75. Image Credits © 2008 Christophe Delaere http://www.flickr.com/photos/delaere/2514143242/ © 2007 Marina Campos Vinhal http://www.flickr.com/photos/marinacvinhal/379111290/ © 2006 kris247 http://www.flickr.com/photos/kris247/86924080/ © Randal Munroe http://xkcd.com/303/ © 2009 Howard M. Lewis Ship http://www.flickr.com/photos/hlship/3388927572/ © 2008 Howard M. Lewis Ship http://www.flickr.com/photos/hlship/3107467741/ 75 © 2010 Howard M. Lewis Ship