SlideShare a Scribd company logo
1 of 73
Download to read offline
Tapestry 5: Java
Power,
Scripting Ease
Howard M. Lewis Ship

TWD Consulting
hlship@comcast.net




                       1   © 2010 Howard M. Lewis Ship
Howard Lewis Ship


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




                            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://github.com/hlship/t5intro




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




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

                                                © 2010 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

                                                      © 2010 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/
   © 2010 Dani Ihtatho
   http://www.flickr.com/photos/ihtatho/627226315/


                                     72                                 © 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/
   © 2010 Howard M. Lewis Ship
   http://www.flickr.com/photos/hlship/3388927572/

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




                                    73                                    © 2010 Howard M. Lewis Ship

More Related Content

What's hot

Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastGabriel Hamilton
 
Jquery dojo slides
Jquery dojo slidesJquery dojo slides
Jquery dojo slideshelenmga
 
Model Driven Software Development - Data Model Evolution
Model Driven Software Development - Data Model EvolutionModel Driven Software Development - Data Model Evolution
Model Driven Software Development - Data Model EvolutionSander Vermolen
 
Single page webapps & javascript-testing
Single page webapps & javascript-testingSingle page webapps & javascript-testing
Single page webapps & javascript-testingsmontanari
 
Web services tutorial
Web services tutorialWeb services tutorial
Web services tutorialprathap kumar
 
Top Ten Web Defenses - DefCamp 2012
Top Ten Web Defenses  - DefCamp 2012Top Ten Web Defenses  - DefCamp 2012
Top Ten Web Defenses - DefCamp 2012DefCamp
 
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
 
Programming services-slides
Programming services-slidesProgramming services-slides
Programming services-slidesMasterCode.vn
 
Jsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSONJsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSONorless
 

What's hot (11)

Dojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, FastDojo: Beautiful Web Apps, Fast
Dojo: Beautiful Web Apps, Fast
 
Jquery dojo slides
Jquery dojo slidesJquery dojo slides
Jquery dojo slides
 
Model Driven Software Development - Data Model Evolution
Model Driven Software Development - Data Model EvolutionModel Driven Software Development - Data Model Evolution
Model Driven Software Development - Data Model Evolution
 
Single page webapps & javascript-testing
Single page webapps & javascript-testingSingle page webapps & javascript-testing
Single page webapps & javascript-testing
 
Web services tutorial
Web services tutorialWeb services tutorial
Web services tutorial
 
Top Ten Web Defenses - DefCamp 2012
Top Ten Web Defenses  - DefCamp 2012Top Ten Web Defenses  - DefCamp 2012
Top Ten Web Defenses - DefCamp 2012
 
Jquery
JqueryJquery
Jquery
 
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
 
Programming services-slides
Programming services-slidesProgramming services-slides
Programming services-slides
 
Complete xss walkthrough
Complete xss walkthroughComplete xss walkthrough
Complete xss walkthrough
 
Jsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSONJsonix - Talking to OGC Web Services in JSON
Jsonix - Talking to OGC Web Services in JSON
 

Viewers also liked

Backbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The BrowserBackbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The BrowserHoward Lewis Ship
 
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
Have Your Cake and Eat It Too: Meta-Programming Techniques for JavaHave Your Cake and Eat It Too: Meta-Programming Techniques for Java
Have Your Cake and Eat It Too: Meta-Programming Techniques for JavaHoward Lewis Ship
 
Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd PerspectiveArduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd PerspectiveHoward Lewis Ship
 
Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapHoward Lewis Ship
 
Testing Web Applications with GEB
Testing Web Applications with GEBTesting Web Applications with GEB
Testing Web Applications with GEBHoward Lewis Ship
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestHoward Lewis Ship
 

Viewers also liked (6)

Backbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The BrowserBackbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The Browser
 
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
Have Your Cake and Eat It Too: Meta-Programming Techniques for JavaHave Your Cake and Eat It Too: Meta-Programming Techniques for Java
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
 
Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd PerspectiveArduino: Open Source Hardware Hacking from the Software Nerd Perspective
Arduino: Open Source Hardware Hacking from the Software Nerd Perspective
 
Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter Bootstrap
 
Testing Web Applications with GEB
Testing Web Applications with GEBTesting Web Applications with GEB
Testing Web Applications with GEB
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: A Highly Logical Way To Test
Spock: A Highly Logical Way To Test
 

Similar to Codemash-Tapestry.pdf

softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EEAlexis Hassler
 
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
 
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
 
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
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020Thodoris Bais
 
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
 
Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpaStaples
 
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
 
Intro to HTML5 Web Storage
Intro to HTML5 Web StorageIntro to HTML5 Web Storage
Intro to HTML5 Web Storagedylanks
 
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
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your CodeDrupalDay
 
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
 
NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020Thodoris Bais
 
Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"Anna Shymchenko
 
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
 
Modx Evo Basic Cheatsheet 1 3
Modx Evo Basic Cheatsheet 1 3Modx Evo Basic Cheatsheet 1 3
Modx Evo Basic Cheatsheet 1 3Oleh Burkhay
 

Similar to Codemash-Tapestry.pdf (20)

softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EE
 
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
 
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
 
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
 
NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020NoSQL Endgame Percona Live Online 2020
NoSQL Endgame Percona Live Online 2020
 
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
 
Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpa
 
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
 
Intro to HTML5 Web Storage
Intro to HTML5 Web StorageIntro to HTML5 Web Storage
Intro to HTML5 Web Storage
 
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"
 
Jquery Basics
Jquery BasicsJquery Basics
Jquery Basics
 
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
 
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
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
 
NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020
 
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
 
Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"Андрей Слободяник "Test driven development using mockito"
Андрей Слободяник "Test driven development using mockito"
 
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
 
Modx Evo Basic Cheatsheet 1 3
Modx Evo Basic Cheatsheet 1 3Modx Evo Basic Cheatsheet 1 3
Modx Evo Basic Cheatsheet 1 3
 

More from Howard Lewis Ship

Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)
Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)
Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)Howard Lewis Ship
 
Practical Clojure Programming
Practical Clojure ProgrammingPractical Clojure Programming
Practical Clojure ProgrammingHoward Lewis Ship
 
Clojure: Towards The Essence of Programming
Clojure: Towards The Essence of ProgrammingClojure: Towards The Essence of Programming
Clojure: Towards The Essence of ProgrammingHoward Lewis Ship
 
Brew up a Rich Web Application with Cappuccino
Brew up a Rich Web Application with CappuccinoBrew up a Rich Web Application with Cappuccino
Brew up a Rich Web Application with CappuccinoHoward Lewis Ship
 
Clojure: Functional Concurrency for the JVM (presented at OSCON)
Clojure: Functional Concurrency for the JVM (presented at OSCON)Clojure: Functional Concurrency for the JVM (presented at OSCON)
Clojure: Functional Concurrency for the JVM (presented at OSCON)Howard Lewis Ship
 
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)Howard Lewis Ship
 

More from Howard Lewis Ship (9)

Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)
Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)
Clojure: Towards The Essence Of Programming (What's Next? Conference, May 2011)
 
Practical Clojure Programming
Practical Clojure ProgrammingPractical Clojure Programming
Practical Clojure Programming
 
Clojure: Towards The Essence of Programming
Clojure: Towards The Essence of ProgrammingClojure: Towards The Essence of Programming
Clojure: Towards The Essence of Programming
 
Codemash-Clojure.pdf
Codemash-Clojure.pdfCodemash-Clojure.pdf
Codemash-Clojure.pdf
 
Brew up a Rich Web Application with Cappuccino
Brew up a Rich Web Application with CappuccinoBrew up a Rich Web Application with Cappuccino
Brew up a Rich Web Application with Cappuccino
 
Clojure Deep Dive
Clojure Deep DiveClojure Deep Dive
Clojure Deep Dive
 
Clojure: Functional Concurrency for the JVM (presented at OSCON)
Clojure: Functional Concurrency for the JVM (presented at OSCON)Clojure: Functional Concurrency for the JVM (presented at OSCON)
Clojure: Functional Concurrency for the JVM (presented at OSCON)
 
Cascade
CascadeCascade
Cascade
 
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
Clojure: Functional Concurrency for the JVM (presented at Open Source Bridge)
 

Codemash-Tapestry.pdf

  • 1. Tapestry 5: Java Power, Scripting Ease Howard M. Lewis Ship TWD Consulting hlship@comcast.net 1 © 2010 Howard M. Lewis Ship
  • 2. Howard Lewis Ship • Creator, Apache Tapestry • Author, "Tapestry in Action" • Independent Consultant 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://github.com/hlship/t5intro 70 © 2010 Howard M. Lewis Ship
  • 71. http://howardlewisship.com Tapestry 5 Development and Support On-site / Hands-on Tapestry Training hlship@comcast.net 71 © 2010 Howard M. Lewis Ship
  • 72. Image Credits © 2006 Chris Walton http://www.flickr.com/photos/philocrites/245011706/ © 2010 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 © 2010 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/ © 2010 Dani Ihtatho http://www.flickr.com/photos/ihtatho/627226315/ 72 © 2010 Howard M. Lewis Ship
  • 73. 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/ © 2010 Howard M. Lewis Ship http://www.flickr.com/photos/hlship/3388927572/ © 2008 Howard M. Lewis Ship http://www.flickr.com/photos/hlship/3107467741/ 73 © 2010 Howard M. Lewis Ship