You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

General Questions

How do I get started with Tapestry?

The easiest way to get started is to use Apache Maven to create your initial project; Maven can use an archetype (a kind of project template) to create a bare-bones Tapestry application for you.

One you have Maven installed, execute the command mvn archetype:generate -DarchetypeCatalog=http://tapestry.apache.org. Maven will (after performing a large number of one-time downloads) ask you questions about how to create the new project, including a group id (like a package name) and an artifact id for your new project.

$ mvn archetype:generate -DarchetypeCatalog=http://tapestry.apache.org
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
[INFO] No goals needed for project - skipping
[INFO] [archetype:generate {execution: default-cli}]
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: http://tapestry.apache.org -> quickstart (Tapestry 5.2.1-SNAPSHOT Quickstart Project)
2: http://tapestry.apache.org -> tapestry-archetype (Tapestry 4.1.6 Archetype)
Choose a number: : 1
Choose version: 
1: 5.0.19
2: 5.1.0.5
3: 5.2.0
4: 5.2.1-SNAPSHOT
Choose a number: : 3
Define value for property 'groupId': : com.example
Define value for property 'artifactId': : newapp
Define value for property 'version': 1.0-SNAPSHOT:    
Define value for property 'package': com.example: com.example.newapp
Confirm properties configuration:
groupId: com.example
artifactId: newapp
version: 1.0-SNAPSHOT
package: com.example.newapp
Y: 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25 seconds
[INFO] Finished at: Tue Aug 17 14:01:50 PDT 2010
[INFO] Final Memory: 16M/81M
[INFO] ------------------------------------------------------------------------
/tmp
$ tree newapp
newapp
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- example
    |   |           `-- newapp
    |   |               |-- components
    |   |               |   `-- Layout.java
    |   |               |-- pages
    |   |               |   |-- About.java
    |   |               |   |-- Contact.java
    |   |               |   `-- Index.java
    |   |               `-- services
    |   |                   `-- AppModule.java
    |   |-- resources
    |   |   |-- com
    |   |   |   `-- example
    |   |   |       `-- newapp
    |   |   |           |-- components
    |   |   |           |   `-- Layout.tml
    |   |   |           `-- pages
    |   |   |               `-- Index.properties
    |   |   `-- log4j.properties
    |   `-- webapp
    |       |-- About.tml
    |       |-- Contact.tml
    |       |-- Index.tml
    |       |-- WEB-INF
    |       |   |-- app.properties
    |       |   `-- web.xml
    |       |-- favicon.ico
    |       `-- layout
    |           |-- images
    |           |   |-- img01.jpg
    |           |   |-- img02.jpg
    |           |   |-- img03.jpg
    |           |   |-- img04.jpg
    |           |   |-- img05.gif
    |           |   |-- img06.gif
    |           |   |-- img07.gif
    |           |   |-- img08.gif
    |           |   |-- img09.gif
    |           |   |-- img10.gif
    |           |   |-- img11.gif
    |           |   |-- img12.gif
    |           |   |-- img13.gif
    |           |   |-- img14.gif
    |           |   |-- img15.gif
    |           |   |-- img16.gif
    |           |   |-- img17.gif
    |           |   |-- img18.gif
    |           |   |-- img19.gif
    |           |   |-- img20.gif
    |           |   `-- spacer.gif
    |           |-- layout.css
    |           `-- license.txt
    |-- site
    |   |-- apt
    |   |   `-- index.apt
    |   `-- site.xml
    `-- test
        |-- conf
        |   |-- testng.xml
        |   `-- webdefault.xml
        |-- java
        |   `-- PLACEHOLDER
        `-- resources
            `-- PLACEHOLDER

25 directories, 44 files
/tmp
$ 

The exact content and layout of project generated from the archetype will change across different releases of Tapestry.

Once it is created, you can load it into any IDE and start coding, or use mvn jetty:run 1 . Again, more one-time downloads, but then you can open your browser to http://localhost:8080 to run the application.

Why does Tapestry use Prototype? Why not insert favorite JavaScript library here?

An important goal for Tapestry is seamless DHTML and Ajax integration. To serve that goal, it was important that the built in components
be capable of Ajax operations, such as dynamically re-rendering parts of the page. Because of that, it made sense to bundle a well-known JavaScript library as part of Tapestry.

At the time (this would be 2006-ish), Prototype and Scriptaculous were well known and well documented, and jQuery was just getting started.

The intent has always been to make this aspect of Tapestry pluggable. This is work expected in Tapestry 5.3, where a kind of adapter layer will be introduced so that Tapestry can be easily customized to work with any of the major JavaScript libraries.

Why does Tapestry have its own Inversion of Control Container? Why not Spring or Guice?

An Inversion of Control Container is the key piece of Tapestry's infrastructure. It is absolutely necessary to create software as robust, performant and extensible as Tapestry.

Tapestry IoC includes a number of features that distinguish itself from other containers:

  • Configured in code, not XML
  • Built-in extension mechanism for services: configurations and contributions
  • Built-in aspect oriented programming model (service decorations and advice)
  • Easy modularization
  • Best-of-breed exception reporting

Because Tapestry is implemented on top of its IoC container, and because the container makes it easy to extend or replace any service inside the container, it is possible to make the small changes to Tapestry needed to customize it to any project's needs.

How do I upgrade from Tapestry 4 to Tapestry 5?

There is no existing tool that supports upgrading from Tapestry 4 to Tapestry 5; Tapestry 5 is a complete rewrite.

Many of the basic concepts in Tapestry 4 are still present in Tapestry 5, but refactored, improved, streamlined, and simplified. The basic concept of pages, templates and components are largely the same. Other aspects, such as server-side event handling, is markedly different.


  1. Jetty is a well-known, open-source, high-performance servlet container. Jetty starts up quickly, and implements the official Servlet specification very closely.     

  • No labels