Jump to content

Apache Tapestry

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by Rharner (talk | contribs) at 23:58, 15 April 2016 (Made HLS name not a link). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Apache Tapestry
Original author(s)Howard Lewis Ship
Developer(s)Apache Software Foundation
Stable release
5.4.1 / March 16, 2016 (2016-03-16)
Repository
Written inJava
Operating systemCross-platform (Java Virtual Machine)
TypeWeb Framework
LicenseApache License 2.0
Websitetapestry.apache.org

Apache Tapestry is an open-source component-oriented Java web application framework conceptually similar to JavaServer Faces and Apache Wicket.[1] Tapestry was created by Howard Lewis Ship, and was adopted by the Apache Software Foundation as a top-level project in 2006.[2]

Tapestry emphasizes simplicity, ease of use, and developer productivity. It adheres to the Convention over Configuration paradigm, eliminating almost all XML configuration.[3] Tapestry uses a modular approach to web development, by having a strong binding between each user interface component (object) on the web page and its corresponding Java class. This component-based architecture borrows many ideas from WebObjects.[4]

Notable Features

Live Class Reloading
Tapestry monitors the file system for changes to Java page classes, component classes, service implementation classes, HTML templates and component property files, and it hot-swaps the changes into the running application without requiring a restart. This provides a very short code-save-view feedback cycle that is claimed to greatly improve developer productivity.[5]
Component-based
Pages may be constructed with small nestable components, each having a template and component class. Custom components are purportedly trivial to construct.[6]
Convention over configuration
Tapestry uses naming conventions and annotations, rather than XML, to configure the application.[7]
Spare use of HTTPSession
By making minimal use of the HTTPSession, Tapestry is designed to be highly efficient in a clustered, session-replicated environment.[8]
Post/Redirect/Get
Most form submissions follow the Post/Redirect/Get (PRG) pattern, which reduces multiple form submission accidents and makes URLs friendlier and more bookmarkable, along with enabling the browser Back and Refresh buttons to operate normally.[9]
Inversion of Control (IOC)
Tapestry is built on a lightweight Inversion of Control layer with similarities to Google Guice but designed to make nearly all aspects of Tapestry's behavior configurable and replaceable.[10]

Hello World Example

A minimal, templated, Tapestry application needs only three files:

HelloWorld.tml
The (X)HTML template for the /helloworld page. Tapestry templates can contain any well-formed (X)HTML markup.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
<body>
    <p>Hello, ${username}</p>
</body>
</html>
HelloWorld.java
The page class associated with the template. Here it merely provides a *username* property that the template can access.
package org.example.demo.pages;

/** a page class (automatically associated with the template file of the same name) */
public class HelloWorld {

    /** an ordinary getter */
    public String getUsername() {
        return "world";
    }
}
web.xml
The servlet application Deployment Descriptor, which installs Tapestry as a servlet filter.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>Tapestry Example</display-name>
    <context-param>
        <!-- tell Tapestry 5 where to look for pages, components and mixins -->
        <param-name>tapestry.app-package</param-name>
        <param-value>org.example.demo</param-value>
    </context-param>
    <filter>
        <!-- define the Tapestry servlet filter -->
        <filter-name>app</filter-name>
        <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
    </filter>
    <filter-mapping>
        <!-- tell the servlet container which requests to send to the Tapestry servlet filter -->
        <filter-name>app</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Class Transformation

Tapestry uses bytecode manipulation to transform page and component classes at runtime. This approach allows the page and component classes to be written as simple POJOs, with a few naming conventions and annotations potentially triggering substantial additional behavior at class load time. Tapestry versions 5.0, 5.1 and 5.2 used the Javassist bytecode manipulation library. Subsequent versions replaced Javassist with a new bytecode manipulation layer called Plastic which is based on ObjectWeb ASM.[11][12]

Client-side Support

Tapestry 5 versions up through 5.3 bundled the Prototype and script.aculo.us JavaScript frameworks, along with a Tapestry-specific library, so as to support Ajax operations as first-class citizens. Third party modules are available to integrate jQuery instead of, or in addition to, Prototype/Scriptaculous.

Starting with version 5.4, Tapestry includes a new JavaScript layer that removes built-in components' reliance on Prototype, allowing jQuery or another JavaScript framework to be plugged in.[13]

Version 5.4 also introduces support for JavaScript modules using the RequireJS module loading system.

Core Principles

The Tapestry project documentation cites four "principles" that govern all development decisions for Tapestry, starting with version 5 in 2008:[14]

  • Static Structure, Dynamic Behavior—page and component structure is essentially static, eliminating the need to construct (and store in session memory) large page and component trees.
  • Adaptive API—the framework is designed to adapt to the code, rather than having the code adapt to the framework
  • Differentiate Public vs. Internal APIs—all APIs are explicitly "internal" (private) except those that are necessarily public.
  • Ensure Backwards Compatibility—The Tapestry developers are reportedly committed to ensuring that upgrading to the latest version of Tapestry is always easy.

Criticism

Tapestry has been criticized as not being backward-compatible across major versions, especially noted in the transition from version 4 to version 5, where no clean migration path was available for existing applications.[15] Project team members have acknowledged this as a major problem for Tapestry's users in the past, and backward compatibility was made a major design goal for Tapestry going forward. From early on in the development of version 5, backward compatibility was listed as one of Tapestry's four new "Core Principles", and two of the other three were intended to make the evolution of the framework possible without sacrificing backward compatibility. Project team members claim that all Tapestry releases since 5.0 have been highly backward compatible.

Early criticisms of Tapestry 5 also mentioned documentation as a shortcoming. Project members now claim that this deficiency has been largely addressed with a thoroughly revised and updated User's Guide and other documentation.

Since version 5.0, Tapestry has bundled the Prototype and Scriptaculous JavaScript libraries. According to Howard Lewis Ship, in the 2008-2009 timeframe these were reasonable choices. Since then, however, Prototype's popularity has declined, and jQuery's has risen dramatically. In response, the Tapestry community developed modules that allowed jQuery to be used in addition to, or instead of, Prototype. Meanwhile, the current version of Tapestry, 5.4, removes the dependency on Prototype entirely, replacing it with a compatibility layer into which either jQuery or Prototype (or potentially any other JavaScript framework) can be plugged.

Relation to other frameworks

According to Howard Lewis Ship, Tapestry was initially conceived as an attempt to implement in Java some of the general concepts and approaches found in WebObjects, which was at that time written in Objective-C and closed-source.[16]

Apache Wicket was developed as a response to the complexity of early versions of Tapestry, according to Wicket originator Jonathan Locke.[17]

Facelets, the default view technology in JavaServer Faces, was reportedly inspired by early versions of Tapestry, as an attempt to fill the need for "a framework like Tapestry, backed by JavaServer Faces as the industry standard".[18][19]

History

Version Date Description
Old version, no longer maintained: 1.0 2000 Developed by Howard Lewis Ship for internal use
Old version, no longer maintained: 2.0 2002-04 First made available on SourceForge under the GNU Lesser General Public License.[20]
Old version, no longer maintained: 3.0 2004-04 The first release under Apache, as a Jakarta sub-project.[21]
Old version, no longer maintained: 4.0 2006-01 Introduced support for JDK 1.5 annotations, a new input validation subsystem, and improved error reporting [22]
Old version, yet still maintained: 5.0 2008-12 A nearly complete rewrite from Tapestry 4, introducing a new POJO-based component model emphasizing convention over configuration, and replaced Hivemind with a new no-XML Inversion of Control layer.
Old version, yet still maintained: 5.1 2009-04 Performance and memory improvements, automatic GZIP compression, JavaScript aggregation, but remained backwards compatible to Tapestry 5.0.
Old version, yet still maintained: 5.2 2010-12 Added JSR 303 Bean Validation.[23] Extended live class reloading to service implementations. Removed page pooling.[24]
Old version, yet still maintained: 5.3 2011-11 Added support for HTML5 doctype, JSR-330 annotations for injection,[25] performance and memory improvements, new components, switched from JavaAssist to ASM bytecode manipulation
Old version, yet still maintained: 5.3.1 - 5.3.8 2012-2014 Bug fixes and minor enhancements
Current stable version: 5.4 2015 Current stable version. Major client-side enhancements. New JavaScript layer for switchable jQuery/Prototype support, uses Require.js for its JavaScript module system, Twitter Bootstrap for its default styling.[26]

See also

References

  • Drobiazko, Igor (2012), Tapestry 5: Rapid web application development in Java, Igor Drobiazko, p. 482
  • Kolesnikov, Alexander (January 15, 2008), Tapestry 5: Building Web Applications: A step-by-step guide to Java Web development with the developer-friendly Apache Tapestry framework, Packt Publishing, p. 280, ISBN 1-84719-307-2
  • Iok Tong, Ka (January 1, 2007), Enjoying Web Development with Tapestry (3rd ed.), p. 497, ASIN B00262M3HS
  • Ship, Howard M. Lewis (2004), Tapestry in Action, Manning, p. 580, ISBN 1932394117

Notes

  1. ^ "Howard Lewis Ship of Tapestry interview [part 1] (2012-10-22)". Retrieved 2013-01-28.
  2. ^ Drobiazko 2012, p. 1.
  3. ^ http://tapestryjava.blogspot.com/2006/07/tapestry-5-updates.html
  4. ^ Tapestry in Action - Preface by Howard Lewis Ship
  5. ^ http://tapestry.apache.org/class-reloading.html
  6. ^ Drobiazko 2012, p. 20.
  7. ^ Drobiazko 2012, p. 7.
  8. ^ http://tapestry.apache.org/performance-and-clustering.html
  9. ^ http://tapestry.apache.org/forms-and-validation.html
  10. ^ Drobiazko 2012, p. 7.
  11. ^ http://tawus.wordpress.com/2011/04/18/meeting-plastic/
  12. ^ http://mail-archive.ow2.org/asm/2011-04/msg00033.html
  13. ^ http://tapestryjava.blogspot.com/2012/10/zeroing-in-on-tapestry-54.html
  14. ^ "Principles". 2010-12-21. Archived from the original on 12 October 2012. Retrieved 2012-10-12. {{cite web}}: Unknown parameter |deadurl= ignored (|url-status= suggested) (help)
  15. ^ "Tapestry5 future compatiblity [sic]". 2009-04-30. Retrieved 2013-01-21.
  16. ^ http://devrates.com/post/show/345948/howard-lewis-ship-of-tapestry-interview-%5Bpart-1%5D
  17. ^ http://web.archive.org/web/20040909074534/http://www.theserverside.com/news/thread.tss?thread_id=28162
  18. ^ http://web.archive.org/web/20070706220453/https://facelets.dev.java.net/
  19. ^ http://web.archive.org/web/20130113100928/http://www.jsfcentral.com/articles/facelets_1.html
  20. ^ "Tapestry: Java Web Components Release 2.0 is Out". Retrieved 2013-01-20.
  21. ^ "Tapestry 3.0 Final Release". Retrieved 2013-01-20.
  22. ^ "Tapestry 4.0 Released". Retrieved 2013-01-20.
  23. ^ "Tapestry and JSR-303 Bean Validation API". 2010-01-04. Archived from the original on 16 April 2010. Retrieved 2010-03-13. {{cite web}}: Unknown parameter |deadurl= ignored (|url-status= suggested) (help)
  24. ^ "Announcing Tapestry 5.2". 2010-12-17. Archived from the original on 12 November 2012. Retrieved 2012-11-14. {{cite web}}: |archive-date= / |archive-url= timestamp mismatch; 14 November 2012 suggested (help); Unknown parameter |deadurl= ignored (|url-status= suggested) (help)
  25. ^ http://tapestry.apache.org/using-jsr-330-standard-annotations.html
  26. ^ "JavaScript Rewrite". Archived from the original on 2012-11-14. Retrieved 2013-01-20.