tapestry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Tapestry > Index
Date Thu, 29 Jul 2010 08:39:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/1810/9/8/_/styles/combined.css?spaceKey=TAPESTRY&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/TAPESTRY/Index">Index</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~uli">Ulrich
Stärk</a>
    </h4>
        <br/>
                         <h4>Changes (4)</h4>
                                 
    
<div id="page-diffs">
            <table class="diff" cellpadding="0" cellspacing="0">
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" > <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">h2.
What is Apache Tapestry? <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">h2.
Welcome to Apache Tapestry! <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">Apache
Tapestry is an open-source framework for creating dynamic, robust, highly scalable web applications
in Java. Tapestry complements and builds upon the standard Java Servlet API, and so it works
in any servlet container or application server. <br> <br>Tapestry divides a web
application into a set of pages, each constructed from components. This provides a consistent
structure, allowing the Tapestry framework to assume responsibility for key concerns such
as URL construction and dispatch, persistent state storage on the client or on the server,
user input validation, localization/internationalization, and exception reporting. Developing
Tapestry applications involves creating HTML templates using plain HTML, and combining the
templates with small amounts of Java code. In Tapestry, you create your application in terms
of objects, and the methods and properties of those objects -- and specifically not in terms
of URLs and query parameters. Tapestry brings true object oriented development to Java web
applications. <br> <br>Tapestry is specifically designed to make creating new
components very easy, as this is a routine approach when building applications. <br>
<br>Tapestry is architected to scale from tiny, single-page applications all the way
up to massive applications consisting of hundreds of individual pages, developed by large,
diverse teams. Tapestry easily integrates with any kind of backend, including JEE, Spring
and Hibernate. <br> <br>It&#39;s more than what you can do with Tapestry ...
it&#39;s also how you do it! Tapestry is a vastly productive environment. Java developers
love it because they can make Java code changes and see them immediately ... no redeploy,
no restart! And it&#39;s blazingly fast to boot (even when files change). Designers love
it because Tapestry templates are so close to ordinary HTML, without all the cruft and confusion
seen in JavaServer Pages. Managers love it because it makes it easy for large teams to work
together, and because they know important features (including localization) are baked right
in. Once you work in Tapestry there&#39;s no going back! <br> <br>Tapestry
is released under the Apache Software Licence 2.0. <br> <br> <br>h2. New
And Of Note <br> <br>* Tapestry now uses the Blackbird JavaScript console. <br>*
Tapestry now automatically combines multiple JavaScript libraries into a single request. <br>*
An Ajax event request may now return a MultiZoneUpdate instance to update multiple zones in
the client web browser. <br>* Client-side numeric validation is now locale-sensitive.
<br>* Some significant performance improvements over Tapestry 5.0.18: the time to initially
load a page, and the time to render a page have decreased. <br>* Tapestry IoC services
can now be easily advised as well as decorated (both of these refer to Aspect Oriented Techniques
applied to Tapestry IoC services). <br>* Tapestry Services can now be injected into
Spring Beans, when using the Tapestry/Spring integration library. <br>* Tapestry now
compresses responses for clients that support GZIP compression. Context and classpath assets
are now handled uniformly: versioned URLs, far-future expiration headers, and GZIP compression
where applicable. <br>* Ordered and mapped configurations can now have overrides. <br>*
Property expressions have been improved: You can now invoke methods with parameters, or create
a list (very useful for link contexts). <br>* IoC Service contributions may now be made
in terms of classes (that are automatically instantiated) as well as instances. <br>*
A simpler method of overriding built-in services has been added. <br> <br>h2.
Roadmap <br> <br>Now that that 5.0 release is finally out and available, work
is rounding out on the 5.1 release. <br> <br>The goal is to produce such releases
on a regular schedule, every 4 - 6 months. <br> <br>High priorities for 5.2 include
Spring Web Flow integration, and support for developing Tapestry applications as Portlets.
<br>Third Party Libraries, Tutorials and Resources <br> <br>A number of
Third Party Libraries, Tutorials and Resources are listed on the Tapestry Home Page. <br>
<br>h2. Adaptive API <br> <br>A key feature of Tapestry 5 is adaptive API.
<br> <br>In traditional Java frameworks, including Tapestry 4, user code is expected
to conform to the framework. You create classes that extend from framework-provided base classes,
or implement framework-provided interfaces. <br> <br>This works well until you
upgrade to the next release of the framework: with the new features of the upgrade, you will
more often than not experience breaks in backwards compatibility. Interfaces or base classes
will have changed and your existing code will need to be changed to match. <br> <br>In
Tapestry 5, the framework adapts to your code. You have control over the names of the methods,
the parameters they take, and the value that is returned. This is driven by annotations, which
tell Tapestry under what circumstances your methods are to be invoked. <br> <br>For
example, you may have a login form and have a method that gets invoked when the form is submitted:
<br> <br>{code:JAVA} <br>public class Login <br>{ <br>    @Persist
<br>    @Property <br>    private String userId; <br> <br>    @Property
<br>    private String password; <br> <br>    @Component <br>    private
Form form; <br> <br>    @Inject <br>    private LoginAuthenticator authenticator;
<br> <br>    void onValidateForm() <br>    { <br>        if (! authenticator.isValidLogin(userId,
password)) <br>        { <br>            form.recordError(&quot;Invalid user
name or password.&quot;); <br>        } <br>    } <br> <br>  
 Object onSuccess() <br>    { <br>        return PostLogin.class; <br> 
  } <br>} <br>{code} <br> <br>This short snippet demonstrates a bit
about how Tapestry operates. Pages and services within the application are injected with the
@Inject annotation. The method names, onValidateForm() and onSuccess(), inform Tapestry about
when the method is to be invoked. The two events validateForm and success occur when a form
is submitted; &quot;validateForm&quot; is triggered to perform cross-field validations,
and &quot;success&quot; is only triggered when there are no validation errors. The
onSuccess() method&#39;s return value directs Tapestry on what to do next: jump to another
page within the application (here identified as the class for the page, but many other options
exist). When there are exceptions, the page will be redisplayed to the user. <br> <br>This
also represents a distinct change from Tapestry 4. In earlier versions of Tapestry, the Form
component&#39;s listener parameter would be bound to the method to invoke, by name. Further,
the listener method had to be public. This new approach not only support multiple listeners,
but provides an improved separation of view concerns (inside the page&#39;s HTML template)
and logic concerns, inside the Java class. <br> <br>In many cases, additional
information about the event is available, and can be passed into the method by adding parameters
to the method. Again, Tapestry will adapt to your parameters, in whatever order you supply
them. <br> <br>Tapestry also saves you effort: the @Property annotation marks
a field as readable and writable; Tapestry will provide the accessor methods automatically.
<br> <br>Finally, Tapestry 5 explicitly separates actions (requests that change
things) and rendering (requests that render pages) into two separate requests. Performing
an action, such as clicking a link or submitting a form, results in a client side redirect
to the new page. This is often called &quot;redirect after post&quot;. This helps
ensure that URLs in the browser are book-markable ... but also requires that a bit more information
be stored in the session between requests (using the @Persist annotation). <br> <br>h2.
About Snapshots and Releases <br> <br>Tapestry is built using Maven, which makes
it really easy to download the source and build it yourself, either the whole project, or
just one single module. <br> <br>Better yet, you can pull down Tapestry modules
from the central Maven repository. <br> <br>The use of Maven has let us move with
great speed, providing preview releases and snapshots. <br> <br>Snapshots are
intermediate versions of releases. As I&#39;m writing this, the most recent preview release
is 5.0.2 and the current snapshots are for 5.0.3-SNAPSHOT. Maven keys off the -SNAPSHOT suffix
and handles the dependency specially. It knows that snapshot releases can change frequently,
so it will keep checking (at least once a day, maybe more often) to see if there&#39;s
an updated version of the snapshot. <br> <br>A nightly build process on Tapestry&#39;s
continuous integration server creates new snapshots every night. <br> <br>Snapshots
don&#39;t go in the central Maven repository (that&#39;s reserved for full releases).
Instead, they go into the Tapestry snapshots repository at http://tapestry.formos.com/maven-snapshot-repository.
<br> <br>To access this repository, you may add {{-DremoteRepositories={nolink:http://tapestry.formos.com/maven-snapshot-repository}}}
to the command line when running Maven. <br> <br>Your best bet is to use the quickstart
Maven archetype to create your initial Tapestry project; it generates a full project directory,
including a POM that links to the Apache snapshots repository. <br> <br>Documentation
on this site usually refers to the latest snapshot ... that is, it is usually ahead of the
last official release. In some cases, it is written as if the snapshot release is stable;
if documentation refers to version 5.1.x.x and that doesn&#39;t work, try 5.1.x.x-SNAPSHOT.
<br> <br>h2. Principle 1 -- Static Structure, Dynamic Behavior <br> <br>Tapestry
is designed to be extremely scalable in several dimensions: <br> <br>* Tapestry
applications may contain large numbers of pages and many custom components. <br>* Tapestry
applications may contain very complex functionality. <br>* Tapestry applications may
be created by large, diverse teams. <br>* Tapestry applications can service large numbers
of concurrent users. <br> <br>One core architecture decision in Tapestry exists
to service many of the above goals (and others that are harder to describe). Static Structure,
Dynamic Behavior <br> <br>In Tapestry, the structure of any particular page is
static. This is necessary for several reasons, most importantly because Tapestry pages are
pooled. Creating a Tapestry page is an involved process, because the page object is simply
the root of a large tree of other objects including user provided components, many kinds of
structural objects, template objects, and others. Creating a new page instance for each request
is simply not scalable. <br> <br>Instead, Tapestry pools pages. Once created,
a page instance will be stored in a pool for that particular type of page, and reused in later
requests. An incoming request, the result of a user clicking a link or submitting a form,
will be processed by some server within a cluster, and will use some page instance within
the page pool. Because page instances are static and uniform across instances and servers,
Tapestry can use any available page instance, or create a new one as needed. <br> <br>Tapestry
does not need to store page instances inside the HttpSession. At most, it stores a smattering
of persistent field values from the page, but not the entire page instance. This lean use
of the HttpSession is key to Tapestry&#39;s very high scalability, especially in a clustered
configuration. <br> <br>In some Tapestry-like frameworks, such as Faces and Wicket,
the page structure is more dynamic, at the cost of storing much, much more data in the HttpSession.
<br> <br>This static structure is not so limiting as you might think. With different
kinds of conditional and looping components, and the ability to &quot;jump out of the
flow&quot; and render components in an arbitrary order, you will not find Tapestry to
be rigid ... anything but! <br> <br>h2. Public vs. Internal <br> <br>An
issue plaguing previous versions of Tapestry 4 (and earlier) was the lack of a clear delineator
between private, internal APIs and public, external APIs. The fact that your code would extend
from base objects but that many of the methods on those base objects were &quot;off limits&quot;
further confused the issue. This has been identified as a key factor in the &quot;steep
learning curve of Tapestry&quot; meme. <br> <br>With the clean slate of Tapestry
5, we are being much more ruthless about internal vs. external. <br> <br>First
of all, anything inside the org.apache.tapestry5.internal package is internal. It is part
of the implementation of Tapestry. It is the man behind the curtain. You should not ever need
to directly use this code. It is a bad idea to do so, because internal code may change from
one release to the next without concern for backwards compatibility. <br> <br>h2.
Backwards Compatibility <br> <br>Tapestry has been plagued by backwards compatibility
problems with every major release. Tapestry 5 does not even attempt to be backwards compatible
to Tapestry 4. Instead, it lays the ground work for true backwards compatibility going forwards.
<br> <br>Tapestry 5&#39;s API is based almost entirely on naming conventions
and annotations. You components are just ordinary Java classes; you will annotate fields to
allow Tapestry to maintain their state or to allow Tapestry to inject resources, and you will
name (or annotate) methods to tell Tapestry under what circumstances a method should be invoked.
<br> <br>Tapestry will adapt to your classes. It will call your methods, passing
in values via method parameters. Instead of the rigidness of a fixed interface to implement,
Tapestry will simply adapt to your classes, using the hints provided by annotations and simple
naming conventions. <br> <br>Because of this, Tapestry will be able to change
internally to a great degree without it affecting any of the application code you write. This
should finally crack the backwards compatibility nut, allowing you to have great assurance
that you can upgrade to future releases of Tapestry without breaking your existing applications.
<br> <br>This is already evident in Tapestry 5.1, where many new features and
improvements have occurred, but is still 100% backwards compatible to Tapestry 5.0, as long
as you&#39;ve avoided the temptation to make use of internal APIs. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">Introductory
text here... <br></td></tr>
            <tr><td class="diff-unchanged" > <br>h2. Who is using Tapestry?
<br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
        </table>
</div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        
<div id="top">
  <h1>
    <img src="http://people.apache.org/~uli/images/tapestry.png" alt="Tapestry" id="tapestry"/>
  </h1>
  <div id="aside">Component oriented framework for creating dynamic, robust, highly
scalable web applications in Java.</div>
  <div class="clearer"></div>
</div>

<div id="features">
<ul class="alternate" type="square">
	<li><h3><a name="Index-Javapower"></a>Java power</h3>
<div class="feature radied relief">
<p>First key feature. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consequat
imperdiet consequat. Quisque rutrum ultricies dolor nec imperdiet. Integer sem lectus, lobortis
in cursus sed, consequat vitae turpis.</p>
</div></li>
	<li><h3><a name="Index-Scriptease"></a>Script ease</h3>
<div class="feature radied relief">
<p>Second key feature. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consequat
imperdiet consequat. Quisque rutrum ultricies dolor nec imperdiet. Integer sem lectus, lobortis
in cursus sed, consequat vitae turpis.</p>
</div></li>
	<li><h3><a name="Index-HighlyProductive"></a>Highly Productive</h3>
<div class="feature radied relief">
<p>Last key feature. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consequat
imperdiet consequat. Quisque rutrum ultricies dolor nec imperdiet. Integer sem lectus, lobortis
in cursus sed, consequat vitae turpis.</p>
</div></li>
</ul>


<div class="clearer"></div></div>

<div id="bar">
<p><b>We think you will love Tapestry!</b> Give us 20 minutes and <b><a
href="/confluence/pages/createpage.action?spaceKey=TAPESTRY&amp;title=Tutorial&amp;linkCreation=true&amp;fromPageId=20645177"
class="createlink">follow our tutorial</a></b>.</p>
</div>

<div id="content" class="big-col">
<div id="col">
<h2><a name="Index-News%21Feedicon.gif%21https%3A%2F%2Fcwiki.apache.org%2Fconfluence%2Fcreaterssfeed.action%3Ftypes%3Dblogpost%26spaces%3DTAPESTRY%26title%3DApacheTapestryNewsRSSFeed%26labelString%253D%26sort%3Dmodified%26maxResults%3D10%26timeSpan%3D5%26confirm%3DCreate%26showContent%3Dfalse%26showDiff%3Dfalse"></a>News
<a href="https://cwiki.apache.org/confluence/createrssfeed.action?types=blogpost&amp;spaces=TAPESTRY&amp;title=Apache+Tapestry+News+RSS+Feed&amp;labelString%3D&amp;sort=modified&amp;maxResults=10&amp;timeSpan=5&amp;confirm=Create&amp;showContent=false&amp;showDiff=false"
class="external-link" rel="nofollow"><span class="image-wrap" style=""><img src="/confluence/download/attachments/20645177/Feed-icon.gif?version=1&amp;modificationDate=1274858890000"
style="border: 0px solid black" /></span></a></h2>

    
                    <div class="blogSurtitle">
                <img src="/confluence/images/icons/blogentry_16.gif" height="16" width="16"
border="0" align="absmiddle" />
                <a class="blogDate" href="/confluence/display/TAPESTRY/2010/05/26">Wednesday,
26 May 2010</a>
            </div>
        
        <div class="blogpost" style="margin-bottom: 30px">
            <div><a class="blogHeading" href="/confluence/display/TAPESTRY/2010/05/26/New+Website">New
Website</a></div>

            <div class="pagesubheading">
                            Last changed Jul 08, 2010 11:05 by <a class="confluence-userlink
username:uli url fn" href="/confluence/display/~uli">Ulrich Stärk</a>
                                            </div>
                <div class="wiki-content">
                 <p>The Apache Tapestry project is pleased to announce the launch of
its new website...</p>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam a felis diam, vel
ultrices quam. Etiam ligula nisl, tristique id tincidunt ut, blandit non nisi. Nulla ultricies
lacinia ipsum, sit amet pellentesque nibh rutrum in. Nulla facilisi. Vestibulum eget felis
sed ipsum vestibulum laoreet. Morbi vitae odio erat. Vivamus eu mauris eu purus euismod auctor
at at lectus. Quisque varius blandit nibh, &hellip;</p>
                </div>
                                    <p><a href="/confluence/display/TAPESTRY/2010/05/26/New+Website"
title="Read the rest of New Website">Read more&hellip;</a></p>
                            <div class="endsection">
                <b>Posted at May 26, 2010</b> by
                <img src="/confluence/images/icons/user_16.gif" height="16" width="16"
border="0" align="absmiddle" title="User Profile: Ulrich St&#xE4;rk">
                <a class="confluence-userlink username:uli url fn" href="/confluence/display/~uli">Ulrich
Stärk</a>                |
                <img src="/confluence/images/icons/comment_16.gif" height="16" width="16"
border="0" align="absmiddle">
                                    <a href="/confluence/display/TAPESTRY/2010/05/26/New+Website?showComments=true#comments">0
comments</a>
                                                |
                    <a href="/confluence/pages/editblogpost.action?pageId=21791140">Edit</a>
                            </div>
        </div>
    
</div>


<h2><a name="Index-WelcometoApacheTapestry%21"></a>Welcome to Apache Tapestry!</h2>

<p>Introductory text here...</p>

<h2><a name="Index-WhoisusingTapestry%3F"></a>Who is using Tapestry?</h2>

<div id="references">
<ul class="alternate" type="square">
	<li><span class="image-wrap" style=""><img src="/confluence/download/attachments/20645177/wooki.png?version=1&amp;modificationDate=1274884868000"
style="border: 0px solid black" /></span><br/>
<a href="http://www.wooki.com" class="external-link" rel="nofollow">Wooki</a>
: Opensource collaboration app</li>
	<li><span class="image-wrap" style=""><img src="/confluence/download/attachments/20645177/seesaw.png?version=1&amp;modificationDate=1274884869000"
style="border: 0px solid black" /></span><br/>
<a href="http://www.seesaw.com" class="external-link" rel="nofollow">Seesaw</a>
: Video streaming</li>
	<li><span class="image-wrap" style=""><img src="/confluence/download/attachments/20645177/wooki.png?version=1&amp;modificationDate=1274884868000"
style="border: 0px solid black" /></span><br/>
<a href="http://www.wooki.com" class="external-link" rel="nofollow">Wooki</a>
: Opensource collaboration app</li>
	<li><span class="image-wrap" style=""><img src="/confluence/download/attachments/20645177/seesaw.png?version=1&amp;modificationDate=1274884869000"
style="border: 0px solid black" /></span><br/>
<a href="http://www.seesaw.com" class="external-link" rel="nofollow">Seesaw</a>
: Video streaming</li>
</ul>


<div class="clearer"></div></div>
</div><div class="clearer"></div>

    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;">
            <a href="https://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
        </div>
        <a href="https://cwiki.apache.org/confluence/display/TAPESTRY/Index">View Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=20645177&revisedVersion=26&originalVersion=25">View
Changes</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message