SlideShare a Scribd company logo
Tapestry 5: Java
Power,
Scripting Ease!

Howard M. Lewis Ship

TWD Consulting
hlship@comcast.net

                       1   © 2009 Howard M. Lewis Ship
Howard Lewis Ship


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




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




         3      © 2009 Howard M. Lewis Ship
Java
 4     © 2009 Howard M. Lewis Ship
Open
Source
  5   © 2009 Howard M. Lewis Ship
Component
  Based
    6   © 2009 Howard M. Lewis Ship
Developer
 Focused
    7   © 2009 Howard M. Lewis Ship
Concise
   8   © 2009 Howard M. Lewis Ship
Fast!
  9     © 2009 Howard M. Lewis Ship
Mature
  10   © 2009 Howard M. Lewis Ship
Tapestry
Elements
       11   © 2009 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


                                        12                                  © 2009 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()
                                                             {
                                                               …
                                                             }
                                                         }




                                                  13                                    © 2009 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;
      }
  }




                                      14                              © 2009 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
                                              15              © 2009 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;
     }
 }



                                                    16             © 2009 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;

                    }




                                            17                             © 2009 Howard M. Lewis Ship
Template                             Injections



                  Component      Meta-
     Java Class
                              Programming


                   Message
                   Catalog




                        18                   © 2009 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
                        19                  © 2009 Howard M. Lewis Ship
Developer
Productivity
         20    © 2009 Howard M. Lewis Ship
21   © 2009 Howard M. Lewis Ship
Non-Tapestry Exception Reporting




                          22       © 2009 Howard M. Lewis Ship
Index does not contain a property named 'now'


              Available properties: class,
              componentResources, currentTime




                      23                 © 2009 Howard M. Lewis Ship
24   © 2009 Howard M. Lewis Ship
25   © 2009 Howard M. Lewis Ship
Scaffolding




              26   © 2009 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;


                                          27                           © 2009 Howard M. Lewis Ship
28   © 2009 Howard M. Lewis Ship
Parameters
    Property Types




                             BeanEditForm
    Naming Conventions



     Annotations



        Explicit Overrides



Localized Messages

                                            29   © 2009 Howard M. Lewis Ship
Feedback &
Exploration


              30   © 2009 Howard M. Lewis Ship
Flow




31    © 2009 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
                        32                    © 2009 Howard M. Lewis Ship
Internationalization




         33      © 2009 Howard M. Lewis Ship
34   © 2009 Howard M. Lewis Ship
Index_de.properties

page-title=Erstellen Sie eine neue Brettspiel
add-game=Spiel hinzufŸgen

modern=Modernen                     Index.tml
medieval=Mittelalter
bible=Bibel                         <html t:type="layout" title="message:page-title"
abstract=Zusammenfassung              xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
                                      xmlns:p="tapestry:parameter">
war_game=Kriegsspiel
card=Karte                           <t:beaneditform submitlabel="message:add-game" object="game"/>
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




                                                   35                                   © 2009 Howard M. Lewis Ship
Tapestry
Components




       36    © 2009 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

                                          37                                  © 2009 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;




                                        38                            © 2009 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));
      }
  }




                                          39                           © 2009 Howard M. Lewis Ship
40   © 2009 Howard M. Lewis Ship
Tapestry
Performance




        41    © 2009 Howard M. Lewis Ship
Request
Processing
Speed




             42   © 2009 Howard M. Lewis Ship
Java
== Fast
   43   © 2009 Howard M. Lewis Ship
No
Reflection
    44   © 2009 Howard M. Lewis Ship
Page
Pooling
   45   © 2009 Howard M. Lewis Ship
GZIP
Compression
     46   © 2009 Howard M. Lewis Ship
Scalability
47          © 2009 Howard M. Lewis Ship
JavaScript
Aggregation
     48   © 2009 Howard M. Lewis Ship
Far Future
 Expires
 Header
    49   © 2009 Howard M. Lewis Ship
Versioned
  URLs
    50   © 2009 Howard M. Lewis Ship
Content
Delivery
Network
   51      © 2009 Howard M. Lewis Ship
❝Architecture is the decisions that you
wish you could get right early in a
project.❞



Martin Fowler, Chief Scientist, ThoughtWorks
                        52                     © 2009 Howard M. Lewis Ship
Conclusion




         53   © 2009 Howard M. Lewis Ship
54   © 2009 Howard M. Lewis Ship
Infrastructure




            55   © 2009 Howard M. Lewis Ship
Performance




          56   © 2009 Howard M. Lewis Ship
Tapestry: The Expert is
Built In




            57      © 2009 Howard M. Lewis Ship
Tapestry 5 In Production




                      58   © 2009 Howard M. Lewis Ship
http://tapestry.apache.org




       59           © 2009 Howard M. Lewis Ship
http://tapestry.formos.com




        60          © 2009 Howard M. Lewis Ship
http://howardlewisship.com




    Tapestry 5 Development and Support
   On-site / Hands-on Tapestry Training
                    hlship@comcast.net
            61                  © 2009 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/


                                     62                                 © 2009 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/




                                    63                                 © 2009 Howard M. Lewis Ship

More Related Content

PDF
Codemash-Tapestry.pdf
PDF
Skills Matter Itbo April2010 Tapestry
PDF
Overview Of Lift Framework
PDF
Overview of The Scala Based Lift Web Framework
PPTX
01 Introduction - JavaScript Development
PPTX
2. overview of c#
PDF
Single page webapps & javascript-testing
Codemash-Tapestry.pdf
Skills Matter Itbo April2010 Tapestry
Overview Of Lift Framework
Overview of The Scala Based Lift Web Framework
01 Introduction - JavaScript Development
2. overview of c#
Single page webapps & javascript-testing

What's hot (18)

PDF
Web services tutorial
PDF
fuser interface-development-using-jquery
PPTX
Jquery dojo slides
PPTX
Open Source Ajax Solution @OSDC.tw 2009
PDF
JavaScript
PPTX
Java script
PPT
PDF
Designing a JavaFX Mobile application
PPT
Java script
PDF
CSharp Advanced L05-Attributes+Reflection
PDF
Javascript
PDF
Model Driven Software Development - Data Model Evolution
PPTX
Spring Web Services
PDF
Jsonix - Talking to OGC Web Services in JSON
PPT
Introduction To Dojo
PDF
What's new in DWR version 3
PDF
[DSBW Spring 2009] Unit 02: Web Technologies (2/2)
PDF
Angular - Chapter 4 - Data and Event Handling
Web services tutorial
fuser interface-development-using-jquery
Jquery dojo slides
Open Source Ajax Solution @OSDC.tw 2009
JavaScript
Java script
Designing a JavaFX Mobile application
Java script
CSharp Advanced L05-Attributes+Reflection
Javascript
Model Driven Software Development - Data Model Evolution
Spring Web Services
Jsonix - Talking to OGC Web Services in JSON
Introduction To Dojo
What's new in DWR version 3
[DSBW Spring 2009] Unit 02: Web Technologies (2/2)
Angular - Chapter 4 - Data and Event Handling
Ad

Viewers also liked (20)

PDF
Tapestry In Action For Real
PDF
Tapestry: State of the Union
PPT
Tapestry it is simple
PPTX
The Bayeux Tapestry (complete)
PPTX
Presentation on mini dictionary using C language
PDF
The Flint Michigan Water Crisis: Causes & Effects
PPT
Bio Chip Presentation
PPT
Touch screen technology
PPT
Touchscreen technology
PPT
Touch screen technology-bharadwaj
PPTX
Biochips seminar
PPTX
Touchscreen technology
PPTX
Water scarcity
PPTX
Touchless Touchscreen Technology
PPTX
Touchless Touchscreen
PPTX
Napster and Mp3: Redefining the music industry
PPTX
Touch Screen Technology PRESENTATION
PPTX
Touchless technology Seminar Presentation
PDF
Seminar report on paper battery
PDF
Comparing JVM Web Frameworks - Jfokus 2012
Tapestry In Action For Real
Tapestry: State of the Union
Tapestry it is simple
The Bayeux Tapestry (complete)
Presentation on mini dictionary using C language
The Flint Michigan Water Crisis: Causes & Effects
Bio Chip Presentation
Touch screen technology
Touchscreen technology
Touch screen technology-bharadwaj
Biochips seminar
Touchscreen technology
Water scarcity
Touchless Touchscreen Technology
Touchless Touchscreen
Napster and Mp3: Redefining the music industry
Touch Screen Technology PRESENTATION
Touchless technology Seminar Presentation
Seminar report on paper battery
Comparing JVM Web Frameworks - Jfokus 2012
Ad

Similar to Tapestry 5: Java Power, Scripting Ease (20)

PDF
Os Lewisship
PDF
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
PDF
Unit 07: Design Patterns and Frameworks (3/3)
PDF
NIG 系統開發指引
PPTX
ADP- Chapter 3 Implementing Inter-Servlet Communication
PDF
Creating a Facebook Clone - Part XXV - Transcript.pdf
PPTX
Java Technology
ODP
Codemotion appengine
KEY
jRecruiter - The AJUG Job Posting Service
PDF
Doctrator Symfony Live 2011 San Francisco
PDF
Struts database access
PDF
Trustparency web doc spring 2.5 & hibernate
KEY
A Walking Tour of (almost) all of Springdom
PPTX
Sessionex1
PPT
What is Advance Java J2EE
PDF
Experiences on a Design Approach for Interactive Web Applications
PDF
#NoXML: Eliminating XML in Spring Projects - SpringOne 2GX 2015
PPT
Form demoinplaywithmysql
PPTX
Jsp presentation
DOC
J2EE Online Training
Os Lewisship
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Unit 07: Design Patterns and Frameworks (3/3)
NIG 系統開發指引
ADP- Chapter 3 Implementing Inter-Servlet Communication
Creating a Facebook Clone - Part XXV - Transcript.pdf
Java Technology
Codemotion appengine
jRecruiter - The AJUG Job Posting Service
Doctrator Symfony Live 2011 San Francisco
Struts database access
Trustparency web doc spring 2.5 & hibernate
A Walking Tour of (almost) all of Springdom
Sessionex1
What is Advance Java J2EE
Experiences on a Design Approach for Interactive Web Applications
#NoXML: Eliminating XML in Spring Projects - SpringOne 2GX 2015
Form demoinplaywithmysql
Jsp presentation
J2EE Online Training

More from Howard Lewis Ship (15)

PDF
Testing Web Applications with GEB
PDF
Spock: A Highly Logical Way To Test
PDF
Backbone.js: Run your Application Inside The Browser
PDF
Modern Application Foundations: Underscore and Twitter Bootstrap
KEY
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
PDF
Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)
PDF
Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
PDF
Practical Clojure Programming
PDF
Clojure: Towards The Essence of Programming
PDF
Codemash-Clojure.pdf
PDF
Brew up a Rich Web Application with Cappuccino
PDF
Clojure Deep Dive
PDF
Clojure: Functional Concurrency for the JVM (presented at OSCON)
PDF
ZIP
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
Testing Web Applications with GEB
Spock: A Highly Logical Way To Test
Backbone.js: Run your Application Inside The Browser
Modern Application Foundations: Underscore and Twitter Bootstrap
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)
Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
Practical Clojure Programming
Clojure: Towards The Essence of Programming
Codemash-Clojure.pdf
Brew up a Rich Web Application with Cappuccino
Clojure Deep Dive
Clojure: Functional Concurrency for the JVM (presented at OSCON)
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)

Recently uploaded (20)

PPTX
Cloud computing and distributed systems.
PDF
cuic standard and advanced reporting.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Approach and Philosophy of On baking technology
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Spectroscopy.pptx food analysis technology
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Encapsulation theory and applications.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
KodekX | Application Modernization Development
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Cloud computing and distributed systems.
cuic standard and advanced reporting.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Unlocking AI with Model Context Protocol (MCP)
Approach and Philosophy of On baking technology
Spectral efficient network and resource selection model in 5G networks
Spectroscopy.pptx food analysis technology
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Encapsulation theory and applications.pdf
Chapter 3 Spatial Domain Image Processing.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Machine learning based COVID-19 study performance prediction
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
MYSQL Presentation for SQL database connectivity
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
KodekX | Application Modernization Development
Dropbox Q2 2025 Financial Results & Investor Presentation
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...

Tapestry 5: Java Power, Scripting Ease

  • 1. Tapestry 5: Java Power, Scripting Ease! Howard M. Lewis Ship TWD Consulting [email protected] 1 © 2009 Howard M. Lewis Ship
  • 2. Howard Lewis Ship • Creator, Apache Tapestry • Author, "Tapestry in Action" • Independent Consultant 2 © 2009 Howard M. Lewis Ship
  • 3. What is Tapestry? 3 © 2009 Howard M. Lewis Ship
  • 4. Java 4 © 2009 Howard M. Lewis Ship
  • 5. Open Source 5 © 2009 Howard M. Lewis Ship
  • 6. Component Based 6 © 2009 Howard M. Lewis Ship
  • 7. Developer Focused 7 © 2009 Howard M. Lewis Ship
  • 8. Concise 8 © 2009 Howard M. Lewis Ship
  • 9. Fast! 9 © 2009 Howard M. Lewis Ship
  • 10. Mature 10 © 2009 Howard M. Lewis Ship
  • 11. Tapestry Elements 11 © 2009 Howard M. Lewis Ship
  • 12. 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 12 © 2009 Howard M. Lewis Ship
  • 13. 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() { … } } 13 © 2009 Howard M. Lewis Ship
  • 14. 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; } } 14 © 2009 Howard M. Lewis Ship
  • 15. 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 15 © 2009 Howard M. Lewis Ship
  • 16. 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; } } 16 © 2009 Howard M. Lewis Ship
  • 17. 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; } 17 © 2009 Howard M. Lewis Ship
  • 18. Template Injections Component Meta- Java Class Programming Message Catalog 18 © 2009 Howard M. Lewis Ship
  • 19. ❝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 19 © 2009 Howard M. Lewis Ship
  • 20. Developer Productivity 20 © 2009 Howard M. Lewis Ship
  • 21. 21 © 2009 Howard M. Lewis Ship
  • 22. Non-Tapestry Exception Reporting 22 © 2009 Howard M. Lewis Ship
  • 23. Index does not contain a property named 'now' Available properties: class, componentResources, currentTime 23 © 2009 Howard M. Lewis Ship
  • 24. 24 © 2009 Howard M. Lewis Ship
  • 25. 25 © 2009 Howard M. Lewis Ship
  • 26. Scaffolding 26 © 2009 Howard M. Lewis Ship
  • 27. 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; 27 © 2009 Howard M. Lewis Ship
  • 28. 28 © 2009 Howard M. Lewis Ship
  • 29. Parameters Property Types BeanEditForm Naming Conventions Annotations Explicit Overrides Localized Messages 29 © 2009 Howard M. Lewis Ship
  • 30. Feedback & Exploration 30 © 2009 Howard M. Lewis Ship
  • 31. Flow 31 © 2009 Howard M. Lewis Ship
  • 32. ❝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 32 © 2009 Howard M. Lewis Ship
  • 33. Internationalization 33 © 2009 Howard M. Lewis Ship
  • 34. 34 © 2009 Howard M. Lewis Ship
  • 35. Index_de.properties page-title=Erstellen Sie eine neue Brettspiel add-game=Spiel hinzufŸgen modern=Modernen Index.tml medieval=Mittelalter bible=Bibel <html t:type="layout" title="message:page-title" abstract=Zusammenfassung xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> war_game=Kriegsspiel card=Karte <t:beaneditform submitlabel="message:add-game" object="game"/> 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 35 © 2009 Howard M. Lewis Ship
  • 36. Tapestry Components 36 © 2009 Howard M. Lewis Ship
  • 37. 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 37 © 2009 Howard M. Lewis Ship
  • 38. 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; 38 © 2009 Howard M. Lewis Ship
  • 39. 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)); } } 39 © 2009 Howard M. Lewis Ship
  • 40. 40 © 2009 Howard M. Lewis Ship
  • 41. Tapestry Performance 41 © 2009 Howard M. Lewis Ship
  • 42. Request Processing Speed 42 © 2009 Howard M. Lewis Ship
  • 43. Java == Fast 43 © 2009 Howard M. Lewis Ship
  • 44. No Reflection 44 © 2009 Howard M. Lewis Ship
  • 45. Page Pooling 45 © 2009 Howard M. Lewis Ship
  • 46. GZIP Compression 46 © 2009 Howard M. Lewis Ship
  • 47. Scalability 47 © 2009 Howard M. Lewis Ship
  • 48. JavaScript Aggregation 48 © 2009 Howard M. Lewis Ship
  • 49. Far Future Expires Header 49 © 2009 Howard M. Lewis Ship
  • 50. Versioned URLs 50 © 2009 Howard M. Lewis Ship
  • 51. Content Delivery Network 51 © 2009 Howard M. Lewis Ship
  • 52. ❝Architecture is the decisions that you wish you could get right early in a project.❞ Martin Fowler, Chief Scientist, ThoughtWorks 52 © 2009 Howard M. Lewis Ship
  • 53. Conclusion 53 © 2009 Howard M. Lewis Ship
  • 54. 54 © 2009 Howard M. Lewis Ship
  • 55. Infrastructure 55 © 2009 Howard M. Lewis Ship
  • 56. Performance 56 © 2009 Howard M. Lewis Ship
  • 57. Tapestry: The Expert is Built In 57 © 2009 Howard M. Lewis Ship
  • 58. Tapestry 5 In Production 58 © 2009 Howard M. Lewis Ship
  • 59. http://tapestry.apache.org 59 © 2009 Howard M. Lewis Ship
  • 60. http://tapestry.formos.com 60 © 2009 Howard M. Lewis Ship
  • 61. http://howardlewisship.com Tapestry 5 Development and Support On-site / Hands-on Tapestry Training [email protected] 61 © 2009 Howard M. Lewis Ship
  • 62. 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/ 62 © 2009 Howard M. Lewis Ship
  • 63. 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/ 63 © 2009 Howard M. Lewis Ship