Tapestry 3.0 Final Release


News: Tapestry 3.0 Final Release

  1. Tapestry 3.0 Final Release (17 messages)

    At long last, Tapestry 3.0 final release is now available.

    This release, over one and a half years in the making, represents a significant evolution of the Tapestry web application framework.

    Tapestry 3.0 adds a raft of new features to the framework, all focused on improved developer productivity. Most significantly:

    • Implicit components, defined and configured directly in the HTML template.
    • Dynamic, rather than explicit, lookup of page and component specifications. Just drop the specification files into WEB-INF.
    • Automatic creation of transient and persistent properties at runtime, via bytecode enhancement. Define the properties in the specification, and let Tapestry create the property at runtime.
    • Improved client- and server-side form input validation.
    • Tapestry now uses Jakarta's FileUpload library.
    • Line precise error reporting: runtime errors refer to the exact template or specification file and line at the root of each error.
    But that's not all! The Tapestry team has worked tirelessly to improve and expand the documentation, add new components and improve existing components, extend and improve the framework functionality in many small-yet-significant ways,
    add new tuning and configuration options, and create an extensive JUnit test suite to ensure it all works.


    Binary -

    Tapestry is open source software, distributed under the terms of the Apache Software License 2.0, and hosted at Apache's Jakarta project.

    Threaded Messages (17)

  2. Congratulations[ Go to top ]

    Congratulations and thanks to Mr. Ship and the Tapestry team!
    The vision you have for v3.1 is very exciting also.
    Keep up the good work.
  3. Hi,

    How is Tapestry when it comes to RAD of small web applications? Or is there too much overhead in setting up a project with Tapestry that you might be better off with plain old JSP? Again, I am talking about the development cycle not the speed at run time.


  4. This boils down to how good you are with Tapestry vs. JSP.

    If you are a JSP programmer and never used Tapestry before (and have no intention to learn it for the future), then on a small project just go with JSP. If you know both, I don't think there is too much extra "setup", if any. This is just a different development paradigm, and if you are comfortable with it, you will *very* productive. IMO Tapestry scales well both up and down project complexity axis.


    P.S. Howard and Tapestry team, congrats on 3.0! I really like it, even before I got a hold of the Howard's book and had to figure all the new things on my own :-)
  5. Yes, Tapestry have a learning curve.

    The length of this curve depend of how angry are developers while working with another frameworks :) If they are, length is very small.

    If you allready know Tapestry, you will allways do project using it, just because in small size apps it looks easier too.

    The really thing I curious about, is that how difficult saying what is Tapestry in one sentence. My proposition is:

    1. Define html as a tree of components (look at jwcid attribute)
      <body jwcid="StandardMenuAndStyle">
        <table jwcid="SearchResults">
          <tr> <td> <a jwcid="objectReference"> </td>
               <td> <span jwcid="objectDescription"> </td>

    2. Define in xml how this jwcid related to UI components, and from where their parameters coming from.

    3. White actual components (or reuse existing one) that could write additional HTML, write in DB, whatever, during passing standard stages (or events) while rendering that component tree.

    Thats what is Tapestry in few words.
  6. Spindle![ Go to top ]

    Fire up Spindle, create a new Tapestry project, use the wizards to create new pages. You get command completion in the HTML and XML editors plus pop-up help for components and parameters. You get validations of your HTML and XML files as part of your build (that is, on every save!). Geoff has also created a way to easily run your web app using Jetty.

    The learning curve of Tapestry is largely about thinking in terms of objects, not URLs and query parameters. This throws people ... they are looking for Struts++ and finding something entirely different. There seems to be some pain in unlearning the bad habits that were beaten into you :-)

    Get thee to a bookstore and browse Tapestry In Action. The point of the book was to lead people out of the operation-oriented camp and into Tapestry's component-oriented camp. After that, everything is easy!
  7. Spindle![ Go to top ]

    Get thee to a bookstore and browse Tapestry In Action. The point of the book was to lead people out of the operation-oriented camp and into Tapestry's component-oriented camp. After that, everything is easy!
    I hath gotten myself to the local manuscript dealer - scores of times, and, foreshame, thy book they hath not. Maybe on the next carriage.
  8. Spindle![ Go to top ]

    Prithee, why should thee waste time on such a scoundrel? Forsake this babylonian and pursue one who may honestly refer to himself as a gentlemanly seller of books.

    Yes, I'm reading Quicksilver, but no, the dialog isn't that wierd.
  9. Spindle![ Go to top ]

    Off with their heads!
  10. Spindle![ Go to top ]

    Spindle beta 4 is up.

    Changes: updated to include Tapestry 3.0 final



  11. Tapestry 3.0 Final Release[ Go to top ]


    I just want to mention that I have put up the Tapestry Workbench application at the following address:


    This application is a part of the Tapestry distribution and demonstrates some of the main features and components in Tapestry, including:

    - Forms and field components, including automatic client-side value validation using JavaScript
    - Date fields and the DatePicker component
    - Custom services that generate non-HTML content
    - File uploads
    - Localization
    - JSP and servlet integration
    - Exception reporting and "line precise" error handling in particular
    - Several other cool components such as Palette and Table. They are very simple to use, but do a lot of complicated things behind the curtain.

    Also, clicking on the Tapestry icon in the bottom right corner will bring up the Tapestry Inspector.

    The Inspector will allow you to view the actual HTML template of the pages and see how easy all of the above is. It will also show the page properties, the session state, etc. Check it out -- this is probably the coolest part of the demo.
  12. Tapestry 3.0 Final Release[ Go to top ]

    Congratulations to Tapestry team!! and to us Tapestry fans!!!
  13. JavaServer Faces comparison[ Go to top ]

    Mr. Ship,
    Could you provide a compare/contrast with JavaServer Faces, especially the advantages Tapestry has?
  14. Tapestry and JSF[ Go to top ]



    Seriously, of *course* this comes up constantly. JSF is an attempt to graft a component framework on top of an inhertently incompatible model, layering all sorts of technologies that require an overly complex build-time process to manage.

    JSF came out of a (presumably, well-meaning) cabal within the JCP. JSF has yet to be proven in real applications. JSF requires much more developer effort, regardless of tools. JSF has a less powerful expression/binding language. JSF requires signficantly more Java code (some written by an IDE). JSF is still vaporware, Tapestry has been around and evolving since 2000. Tapestry has been shaped by real user's needs. Tapestry has been constructed in an open process, where the users interact directly with the users (it's open source software, after all). Tapestry is compatible with Servlet API 2.1 and JDK 1.3, which is good if you are using WebSphere.

    That's just off the top of my head ... I have to run out and catch a flight!
  15. components interaction???[ Go to top ]

    I really liked Tapestry. However, the expression of interaction between components is lacking (or not well documented). For example,

    if I would like to register another component as a listener to one component in the same page, how do I do it?

    How do I pass a component as a parameter to another component?
  16. components interaction???[ Go to top ]

    The Table page in the Workbench demonstrates this concept. For example, the specification of this page is the following:
      <component id="localeList" type="LocaleList">
       <binding name="localeSelectionListener" expression="components.localeSelection"/>
      <component id="localeSelection" type="LocaleSelection"/>
    See the binding to the 'localeSelectionListener' parameter -- in this case it allows the LocaleSelection component to be a listener to the LocaleList component in this page.

    Basically, Tapestry allows you to do getComponent("<name>") or getComponents() and from then on it can be like in Java, listeners and all.
  17. Tapestry vs SOFIA[ Go to top ]


    Long ago I used Struts for development until SOFIA (Salmon Open Framework For Internet Applications) arrived in mid 2002 (SOFIA development started in year 1999 by SalmonLlc and was later published as opensource).

    SOFIA (http://salmonllc.com/sofia) is an opensource J2EE and MVC based development framework that gives the developer lots of productivity features. To mention some:

    - Visual development of UI by integrating its pallet of more than 40 visual components (ex:DataTable with sort and paging options included ,Navigation Bar, Tree, Calendar, Input ) with Macromedia?s Dreamweaver.

    - Integration to Intellij and Eclipse.

    - Code generators for many nonvisual tasks such as database access and controllers that provide event handling of view actions (implemented the same way that AWT ones).

    - Automatic binding of the model to any view component. Ex: You can build a DataStore (Database Model) then build a view with input components, bind that input components to the DataStore and when you call the update method of the DataStore changes are automatically reflected on the database and all this without having to code a single line of java code.

    - Clear separation of the design of UI from Java code development. If you look for example at the JSP code of SOFIA pages you will see only JSP tags that represent visual components (zero Java inline code and no tags that in the end try to simulate java code like iteration or conditions tags).

    - Power to manage any attribute of any view component at runtime. Ex: You can disable a view component depending on a complex condition that you declare in a separate Java class or in a declarative way.

    - Easy implementation of new JSP tags: you don't have to follow the whole JSP specification to build a new tag. Just extend SOFIA components and the development of a new tag makes life much easier.

    - Complex validation rules at the model level. View Validators then import the rules having the power to specifiy (depending of the kind of rule) if it should be done at the client or the server side.

    - i18n: use of localization keys that can be specified on some of the SOFIA components and tags that will cause some of the attributes of the
    components to change based on the language preferences of the visiting user.

    - Output to different devices: HTML / WML / Swing

    My personal experience with SOFIA if I compare it for example with Struts is that now I concentrate only in the business requirements and not in the framework details, having gained a lot of productivity and also tidyness of the final code.

    As Tapestry seems to be other of the players in the area of J2EE opensource development frameworks, I would like to know from the Tapestry Team, how would you compare it to SOFIA ?

  18. I recently did a prototype Tapestry app for my work, to serve as part of a decision in picking a new web framework. Their current framework is also event/listener based, and I have been seeing several things (both in their custom framework and tapestry) that I can't seem to get around that are caused by the event/listener model. I was hoping that someone here could either help me out, or point me in the right direction.

    Basically, is there a way to make it so that a link or form, that might exist on multiple screens, can all point to the same place without each individual page class knowing how to forward the request on? A good example would be a "Home" link. As it stands (from my knowledge and limited Tapestry experience) each screen's corresponding page-class would have to have a link that would answer the "Home" event, and forward the user on to the correct place. This means that not only does the display to build the link get duplicated but the navigation logic behind it as well?

    How would you get around this?
    Is there a reason why this is a "better" solution?
    How would you minimize changes in the case where the class that should be responsible for "Home" changes?