Author: buildbot
Date: Sat Nov 22 18:19:55 2014
New Revision: 930122
Log:
Production update by buildbot for tapestry
Modified:
websites/production/tapestry/content/cache/main.pageCache
websites/production/tapestry/content/creating-the-skeleton-application.html
websites/production/tapestry/content/exploring-the-project.html
websites/production/tapestry/content/loading-the-project-into-eclipse.html
websites/production/tapestry/content/tapestry-tutorial.html
Modified: websites/production/tapestry/content/cache/main.pageCache
==============================================================================
Binary files - no diff available.
Modified:
websites/production/tapestry/content/creating-the-skeleton-application.html
==============================================================================
--- websites/production/tapestry/content/creating-the-skeleton-application.html
(original)
+++ websites/production/tapestry/content/creating-the-skeleton-application.html
Sat Nov 22 18:19:55 2014
@@ -74,7 +74,7 @@ table.ScrollbarTable td.ScrollbarParent
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width:
16px;border: none;}
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="dependencies-tools-and-plugins.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect"
href="loading-the-project-into-eclipse.html">Loading the Project Into
Eclipse</a></td><td colspan="1" rowspan
="1" class="ScrollbarNextIcon"><a shape="rect"
href="loading-the-project-into-eclipse.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div><p>Before we can get down to the fun,
we have to create an empty application. Tapestry uses a feature of Maven to do
this: <strong>archetypes</strong> (a too-clever way of saying "project
templates").</p><p>For the tutorial, we're using a fresh install of Eclipse and
an empty workspace at <code>/users/joeuser/workspace</code>. You may need to
adjust a few things for other operating systems or local paths.</p><h2
id="CreatingTheSkeletonApplication-UsingtheQuickstartArchetype">Using the
Quickstart Archetype</h2><p>From Eclipse, we'll use a Maven archetype to create
a skeleton Tapestry project.</p> <div class="aui-message hint shadowed
information-macro">
+/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="dependencies-tools-and-plugins.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect" href="exploring-the-project.html">Exploring
the Project</a></td><td colspan="1" rowspan="1" class="ScrollbarN
extIcon"><a shape="rect" href="exploring-the-project.html"><img align="middle"
border="0" src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif"
width="16" height="16"></a></td></tr></table></div><p>Before we can get down to
the fun, we have to create an empty application. Tapestry uses a feature of
Maven to do this: <strong>archetypes</strong> (a too-clever way of saying
"project templates").</p><p>For the tutorial, we're using a fresh install of
Eclipse and an empty workspace at <code>/users/joeuser/workspace</code>. You
may need to adjust a few things for other operating systems or local
paths.</p><h2
id="CreatingTheSkeletonApplication-UsingtheQuickstartArchetype">Using the
Quickstart Archetype</h2><p>From Eclipse, we'll use a Maven archetype to create
a skeleton Tapestry project.</p> <div class="aui-message hint shadowed
information-macro">
<p class="title">Maven Behind a Firewall</p>
<span class="aui-icon icon-hint">Icon</span>
<div class="message-content">
@@ -97,7 +97,13 @@ table.ScrollbarTable td.ScrollbarNextIco
</div></div><p>Of course, adjust the <code>localRepository</code> element to
match the correct path for your computer.</p>
</div>
</div>
-<p>Okay, let's get started creating our new project.</p><p>In Eclipse, go to
<strong>File > New ></strong> <strong>Project... > Maven > Maven
Project</strong></p><p><img class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/select-a-wizard.png?version=1&modificationDate=1416675284654&api=v2"
data-image-src="/confluence/download/attachments/23340356/select-a-wizard.png?version=1&modificationDate=1416675284654&api=v2"></p><p>Then
click <strong>Next</strong>, <strong>Next</strong> (again), and then on the
<strong>Select an Archetype</strong> page click the <strong>Configure</strong>
button on the Catalog line. The <strong>Archetype</strong> preferences dialog
should appear. Click the <strong>Add Remote Catalog...</strong>
button:</p><p><img class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/add-archetype-catalog.png?version=1&modificationDate=14166753
54423&api=v2"
data-image-src="/confluence/download/attachments/23340356/add-archetype-catalog.png?version=1&modificationDate=1416675354423&api=v2"></p><p>As
shown above, enter <span class="nolink"><span
class="nolink">"http://tapestry.apache.org"</span></span> in the Catalog File
field, and "Apache Tapestry" in the Description field.</p><p>Click
<strong>OK</strong>, then<strong> OK</strong> again.</p><p>On the Select an
Archetype dialog, select the newly-added Apache Tapestry catalog, then select
the "quickstart" artifact from the list and click
<strong>Next</strong>.</p><p><img class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/select-archetype.png?version=1&modificationDate=1416675447884&api=v2"
data-image-src="/confluence/download/attachments/23340356/select-archetype.png?version=1&modificationDate=1416675447884&api=v2"></p><p>Fill
in the Group Id, Artifact Id, Version and Package  as follows:<
/p><p><img class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/specify-archetype-parameters.png?version=1&modificationDate=1416675494780&api=v2"
data-image-src="/confluence/download/attachments/23340356/specify-archetype-parameters.png?version=1&modificationDate=1416675494780&api=v2"></p><p>then
click Finish.</p> <div class="aui-message hint shadowed information-macro">
+<p>Okay, let's get started creating our new project.</p><p>In Eclipse, go to
<strong>File > New ></strong> <strong>Project... > Maven > Maven
Project</strong></p><p><img class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/select-a-wizard.png?version=1&modificationDate=1416675284654&api=v2"
data-image-src="/confluence/download/attachments/23340356/select-a-wizard.png?version=1&modificationDate=1416675284654&api=v2"></p><p>Then
click <strong>Next</strong>, <strong>Next</strong> (again), and then on the
<strong>Select an Archetype</strong> page click the <strong>Configure</strong>
button on the Catalog line. The <strong>Archetype</strong> preferences dialog
should appear. Click the <strong>Add Remote Catalog...</strong>
button:</p><p><img class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/add-archetype-catalog.png?version=1&modificationDate=14166753
54423&api=v2"
data-image-src="/confluence/download/attachments/23340356/add-archetype-catalog.png?version=1&modificationDate=1416675354423&api=v2"></p><p>As
shown above, enter <span class="nolink"><span
class="nolink">"http://tapestry.apache.org"</span></span> in the Catalog File
field, and "Apache Tapestry" in the Description field.</p> <div
class="aui-message hint shadowed information-macro">
+ <span class="aui-icon icon-hint">Icon</span>
+ <div class="message-content">
+ <p>If you want to try an unreleased (alpha or
beta) version of Tapestry, use <span
class="nolink">https://repository.apache.org/content/repositories/staging</span>
archetype catalog file instead.</p>
+ </div>
+ </div>
+<p>Click <strong>OK</strong>, then<strong> OK</strong> again.</p><p>On the
Select an Archetype dialog, select the newly-added Apache Tapestry catalog,
then select the "quickstart" artifact from the list and click
<strong>Next</strong>.</p><p><img class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/select-archetype.png?version=1&modificationDate=1416675447884&api=v2"
data-image-src="/confluence/download/attachments/23340356/select-archetype.png?version=1&modificationDate=1416675447884&api=v2"></p><p>Fill
in the Group Id, Artifact Id, Version and Package  as follows:</p><p><img
class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/specify-archetype-parameters.png?version=1&modificationDate=1416675494780&api=v2"
data-image-src="/confluence/download/attachments/23340356/specify-archetype-parameters.png?version=1&modificationDate=1416675494780&api=v
2"></p><p>then click Finish.</p> <div class="aui-message hint shadowed
information-macro">
<span class="aui-icon icon-hint">Icon</span>
<div class="message-content">
<p>The first time you use Maven, project creation
may take several minutes as Maven downloads hundreds of JAR dependencies. These
downloaded files are cached locally and will not need to be downloaded again,
but you do have to be patient on first use.</p>
@@ -123,13 +129,7 @@ Application 'app' (version 1.0-SNAPSHOT-
2011-11-22 11:46:45.636::INFO: Started [email protected]:8080
[INFO] Started Jetty Server
</pre>
-</div></div><p> </p><p>You can now open a web browser to <a shape="rect"
class="external-link" href="http://localhost:8080/tutorial1/"
>http://localhost:8080/tutorial1/</a> to see the running
application:</p><p> </p><p><img class="confluence-embedded-image
confluence-content-image-border image-left" height="525" width="700"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/startpage.png?version=6&modificationDate=1416272937000&api=v2"
data-image-src="/confluence/download/attachments/23340356/startpage.png?version=6&modificationDate=1416272937000&api=v2"></p><p> </p><div
style="clear: both"></div><p style="text-align: left;">The date and time in
the middle of the page proves that this is a live application.</p><p>This is a
complete little application; it doesn't do much, but it demonstrate how to
create a number of pages sharing a common layout, and demonstrates some simple
navigation and link handling. You can see that it has three
different pages that share a common layout. (<span style="line-height:
1.4285715;"><em>Layout</em> is a loose term meaning common look and feel and
navigation across many or all of the pages of an application. Often an
application will include a Layout component to provide that
commonness.)</span></p> <div class="aui-message problem shadowed
information-macro">
- <span class="aui-icon icon-problem">Icon</span>
- <div class="message-content">
- <p>You should hit Control-C in the Terminal window
to close down Jetty before continuing with the tutorial.</p>
- </div>
- </div>
-<style type="text/css">/*<![CDATA[*/
+</div></div><p> </p><p>You can now open a web browser to <a shape="rect"
class="external-link" href="http://localhost:8080/tutorial1/"
>http://localhost:8080/tutorial1/</a> to see the running
application:</p><p> </p><p><img class="confluence-embedded-image
confluence-content-image-border image-left" height="525" width="700"
src="https://cwiki.apache.org/confluence/download/attachments/23340356/startpage.png?version=6&modificationDate=1416272937000&api=v2"
data-image-src="/confluence/download/attachments/23340356/startpage.png?version=6&modificationDate=1416272937000&api=v2"></p><p> </p><div
style="clear: both"></div><p style="text-align: left;">The date and time in
the middle of the page proves that this is a live application.</p><p>This is a
complete little application; it doesn't do much, but it demonstrate how to
create a number of pages sharing a common layout, and demonstrates some simple
navigation and link handling. You can see that it has three
different pages that share a common layout. (<span style="line-height:
1.4285715;"><em>Layout</em> is a loose term meaning common look and feel and
navigation across many or all of the pages of an application. Often an
application will include a Layout component to provide that
commonness.)</span></p><p> </p><style type="text/css">/*<![CDATA[*/
table.ScrollbarTable {border: none;padding: 3px;width: 100%;padding:
3px;margin: 0px;background-color: #f0f0f0}
table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width:
16px;border: none;}
table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
@@ -137,12 +137,7 @@ table.ScrollbarTable td.ScrollbarParent
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width:
16px;border: none;}
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="dependencies-tools-and-plugins.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect"
href="loading-the-project-into-eclipse.html">Loading the Project Into
Eclipse</a></td><td colspan="1" rowspan
="1" class="ScrollbarNextIcon"><a shape="rect"
href="loading-the-project-into-eclipse.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div> <div class="aui-message hint
shadowed information-macro">
- <span class="aui-icon icon-hint">Icon</span>
- <div class="message-content">
- <p>If you want to try an unreleased (alpha or
beta) version of Tapestry, use <span
class="nolink">https://repository.apache.org/content/repositories/staging</span>
archetype catalog URL instead.</p>
- </div>
- </div></div>
+/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="dependencies-tools-and-plugins.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect" href="exploring-the-project.html">Exploring
the Project</a></td><td colspan="1" rowspan="1" class="ScrollbarN
extIcon"><a shape="rect" href="exploring-the-project.html"><img align="middle"
border="0" src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif"
width="16"
height="16"></a></td></tr></table></div><p> </p><p> </p></div>
</div>
<div class="clearer"></div>
Modified: websites/production/tapestry/content/exploring-the-project.html
==============================================================================
--- websites/production/tapestry/content/exploring-the-project.html (original)
+++ websites/production/tapestry/content/exploring-the-project.html Sat Nov 22
18:19:55 2014
@@ -48,19 +48,13 @@
</div></div>
<div id="top">
-<div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em
1em .1em 1em">
-<p>
-<span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &
blogs:</span>
-</p><form enctype="application/x-www-form-urlencoded" method="get"
action="http://tapestry.apache.org/search.html">
+<div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em
1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues,
wikis & blogs:</span>
+<form enctype="application/x-www-form-urlencoded" method="get"
action="http://tapestry.apache.org/search.html">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
-</div>
-
-<div class="emblem" style="float:left"><a shape="rect" href="index.html"><img
class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/21791252/tapestry_s.png?version=3&modificationDate=1293093635000&api=v2"
data-image-src="/confluence/download/attachments/21791252/tapestry_s.png?version=3&modificationDate=1293093635000&api=v2"></a></div>
-<div class="title" style="float:left; margin: 0 0 0 3em">
-<h1 id="SmallBanner-PageTitle">Exploring the Project</h1></div></div>
+</div><div class="emblem" style="float:left"><p><a shape="rect"
href="index.html"><img class="confluence-embedded-image
confluence-external-resource"
src="http://tapestry.apache.org/images/tapestry_small.png"
data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></a></p></div><div
class="title" style="float:left; margin: 0 0 0 3em"><h1
id="SmallBanner-PageTitle">Exploring the Project</h1></div></div>
<div class="clearer"></div>
</div>
@@ -80,7 +74,7 @@ table.ScrollbarTable td.ScrollbarParent
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width:
16px;border: none;}
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="loading-the-project-into-eclipse.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="loading-the-project-into-eclipse.html">Loading the Project Into
Eclipse</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect"
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo
Guessing Game</a></td><td colspa
n="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect"
href="implementing-the-hi-lo-guessing-game.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div><p>The layout of the project follows
the sensible standards promoted by Maven:</p><ul><li>Java source files under
<code>src/main/java</code></li><li>Web application files under
<code>src/main/webapp</code> (including
<code>src/main/webapp/WEB-INF</code>)</li><li>Java test sources under
<code>src/test/java</code></li><li>Non-code resources (including Tapestry page
and component templates) under <code>src/main/resources</code> and
<code>src/test/resources</code></li></ul><p>Let's look at what Maven has
created from the archetype, starting with the web.xml configuration
file:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>src/main/webapp/WEB-INF
/web.xml</b></div><div class="codeContent panelContent pdl">
+/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="creating-the-skeleton-application.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="creating-the-skeleton-application.html">Creating The Skeleton
Application</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect"
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo
Guessing Game</a></td><td col
span="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect"
href="implementing-the-hi-lo-guessing-game.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div><p>The layout of the project follows
the sensible standards promoted by Maven:</p><ul><li>Java source files under
<code>src/main/java</code></li><li>Web application files under
<code>src/main/webapp</code> (including
<code>src/main/webapp/WEB-INF</code>)</li><li>Java test sources under
<code>src/test/java</code></li><li>Non-code resources (including Tapestry page
and component templates) under <code>src/main/resources</code> and
<code>src/test/resources</code></li></ul><p>Let's look at what Maven has
created from the archetype, starting with the web.xml configuration
file:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>src/main/webapp/WEB-
INF/web.xml</b></div><div class="codeContent panelContent pdl">
<script class="theme: Default; brush: xml; gutter: false"
type="syntaxhighlighter"><![CDATA[<?xml version="1.0"
encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN"
@@ -172,7 +166,7 @@ public class Index
}
}
]]></script>
-</div></div><p>There's a bit going on in this listing, as the Index page
attempts to demonstrate a bunch of different ideas in Tapestry. Even so, the
class is essentially pretty simple: Tapestry pages and components have no base
classes to extend, no interfaces to implement, and are just a very pure POJO
(Plain Old Java Object) ... with some special naming conventions and
annotations for fields and methods.</p><p>You do have to meet the Tapestry
framework partway:</p><ul><li>You need to put the Java class in the expected
package, here com.example.tutorial.pages</li><li>The class must be
public</li><li>You need to make sure there's a public, no-arguments constructor
(here, the Java compiler has silently provided one for us)</li><li>All
non-static fields must be <strong>private</strong></li></ul><p>As we saw when
running the application, the page displays the current date and time, as well
as a couple of extra links. The <code>currentTime</code> property is where that
value comes from
; shortly we'll see how that value is referenced in the template, so it can be
extracted from the page and output.</p><p>Tapestry always matches a page class
to a template; neither is functional without the other. In fact, components
within a page are treated the same way (except that components do not always
have templates).</p><p>You will often hear about the <a shape="rect"
class="external-link" href="http://en.wikipedia.org/wiki/Model_view_controller"
>Model-View-Controller pattern</a> (MVC). In Tapestry, the page class acts as
both the Model (the source of data) and the controller (the logic that responds
to user interaction). The template is the View in MVC. As a model, the page
exposes JavaBeans properties that can be referenced in the
template.</p><p>Let's look at how the component template builds on the Java
class to provide the full user interface.</p><h1
id="ExploringtheProject-ComponentTemplate">Component Template</h1><p>Tapestry
pages are the combination of a POJO Java
class with a Tapestry component template. The template has the same name as
the Java class, but has the extension <code>.tml</code>. Since the Java class
here is com.example.tutorial.pages.Index, the template file will be located at
src/main/resource/com/example/tutorial/pages/Index.tml. Ultimately, both the
Java class and the component template file will be stored in the same folder
within the deployed WAR file.</p><p>Tapestry component templates are
well-formed XML documents. This means that you can use any available XML
editor. Templates may even have a DOCTYPE or an XML schema to validate the
structure of the template page</p><p></p><p></p><p></p><p></p><p><style
type='text/css'>
+</div></div><p>There's a bit going on in this listing, as the Index page
attempts to demonstrate a bunch of different ideas in Tapestry. Even so, the
class is essentially pretty simple: Tapestry pages and components have no base
classes to extend, no interfaces to implement, and are just a very pure POJO
(Plain Old Java Object) ... with some special naming conventions and
annotations for fields and methods.</p><p>You do have to meet the Tapestry
framework partway:</p><ul><li>You need to put the Java class in the expected
package, here com.example.tutorial.pages</li><li>The class must be
public</li><li>You need to make sure there's a public, no-arguments constructor
(here, the Java compiler has silently provided one for us)</li><li>All
non-static fields must be <strong>private</strong></li></ul><p>As we saw when
running the application, the page displays the current date and time, as well
as a couple of extra links. The <code>currentTime</code> property is where that
value comes from
; shortly we'll see how that value is referenced in the template, so it can be
extracted from the page and output.</p><p>Tapestry always matches a page class
to a template; neither is functional without the other. In fact, components
within a page are treated the same way (except that components do not always
have templates).</p><p>You will often hear about the <a shape="rect"
class="external-link" href="http://en.wikipedia.org/wiki/Model_view_controller"
>Model-View-Controller pattern</a> (MVC). In Tapestry, the page class acts as
both the Model (the source of data) and the controller (the logic that responds
to user interaction). The template is the View in MVC. As a model, the page
exposes JavaBeans properties that can be referenced in the
template.</p><p>Let's look at how the component template builds on the Java
class to provide the full user interface.</p><h1
id="ExploringtheProject-ComponentTemplate">Component Template</h1><p>Tapestry
pages are the combination of a POJO Java
class with a Tapestry component template. The template has the same name as
the Java class, but has the extension <code>.tml</code>. Since the Java class
here is com.example.tutorial.pages.Index, the template file will be located at
src/main/resource/com/example/tutorial/pages/Index.tml. Ultimately, both the
Java class and the component template file will be stored in the same folder
within the deployed WAR file.</p><p>Tapestry component templates are
well-formed XML documents. This means that you can use any available XML
editor. Templates may even have a DOCTYPE or an XML schema to validate the
structure of the template
page</p><p> </p><p> </p><p> </p><p> </p><style
type='text/css'>
.FootnoteMarker, .FootnoteNum a {
background: transparent
url(/confluence/download/resources/com.adaptavist.confluence.footnoteMacros:footnote/gfx/footnote.png)
no-repeat top right;
padding: 1px 2px 0px 1px;
@@ -244,7 +238,7 @@ var footnoteMarkerHighlight = function(i
1
</a>
</sup>
-</p><p></p><p></p><p></p><p></p><p>.</p><p> </p><p>For the most part, a
Tapestry component template looks like ordinary XHTML:</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width:
1px;"><b>src/main/resources/com/example/tutorial/pages/Index.tml</b></div><div
class="codeContent panelContent pdl">
+<p> </p><p> </p><p> </p><p> </p><p>.</p><p> </p><p>For
the most part, a Tapestry component template looks like ordinary
XHTML:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>src/main/resources/com/example/tutorial/pages/Index.tml</b></div><div
class="codeContent panelContent pdl">
<script class="theme: Default; brush: xml; gutter: false"
type="syntaxhighlighter"><![CDATA[<html t:type="layout"
title="tutorial1 Index"
t:sidebarTitle="Framework Version"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
@@ -294,13 +288,13 @@ var footnoteMarkerHighlight = function(i
<p>You do have to name your component template
file, Index.tml, with the <strong>exact same case</strong> as the component
class name, Index. If you get the case wrong, it may work on some operating
systems (such as Mac OS X, Windows) and not on others (Linux, and most others).
This can be really vexing, as it is common to develop on Windows and deploy on
Linux or Solaris, so be careful about case in this one area.</p>
</div>
</div>
-<p>The goal in Tapestry is for component templates, such as Index.tml, to look
as much as possible like ordinary, static HTML
files</p><p></p><p></p><p></p><p></p><p>
+<p>The goal in Tapestry is for component templates, such as Index.tml, to look
as much as possible like ordinary, static HTML
files</p><p> </p><p> </p><p> </p><p> </p>
<sup id="FootnoteMarker2">
<a shape="rect" class="FootnoteMarker" name="FootnoteMarker2"
href="#Footnote2" onclick="footnoteHighlight("2",true);"
alt="Footnote: Click here to display the footnote" title="Footnote: Click here
to display the footnote">
2
</a>
</sup>
-</p><p></p><p></p><p></p><p></p><p>. In fact, the expectation is that in many
cases, the templates will start as static HTML files, created by a web
developer, and then be <em>instrumented</em> to act as live Tapestry
pages.</p><p> </p><p>Tapestry hides non-standard elements and attributes
inside XML namespaces. By convention, the prefix "t:" is used for the primary
namespace, but that is not a requirement, any prefix you want to use is
fine.</p><p>This short template demonstrates quite a few features of
Tapestry.</p> <div class="aui-message problem shadowed information-macro">
+<p> </p><p> </p><p> </p><p> </p><p>. In fact, the
expectation is that in many cases, the templates will start as static HTML
files, created by a web developer, and then be <em>instrumented</em> to act as
live Tapestry pages.</p><p> </p><p>Tapestry hides non-standard elements
and attributes inside XML namespaces. By convention, the prefix "t:" is used
for the primary namespace, but that is not a requirement, any prefix you want
to use is fine.</p><p>This short template demonstrates quite a few features of
Tapestry.</p> <div class="aui-message problem shadowed information-macro">
<span class="aui-icon icon-problem">Icon</span>
<div class="message-content">
<p>Part of the concept of the quickstart archetype
is to demonstrate a bunch of different features, approaches and common patterns
used in Tapestry, thus we're hitting you with a lot all at once.</p>
@@ -319,37 +313,37 @@ var footnoteMarkerHighlight = function(i
<p>If you are coming to Tapestry 5 from Tapestry 4
or earlier, expansions are a concise replacement for the Insert component.</p>
</div>
</div>
-<p>The value inside the curly braces is a <em>property expression</em>.
Tapestry uses its own property expression language that is expressive, fast,
and type-safe</p><p></p><p></p><p></p><p></p><p>
+<p>The value inside the curly braces is a <em>property expression</em>.
Tapestry uses its own property expression language that is expressive, fast,
and type-safe</p><p> </p><p> </p><p> </p><p> </p>
<sup id="FootnoteMarker3">
<a shape="rect" class="FootnoteMarker" name="FootnoteMarker3"
href="#Footnote3" onclick="footnoteHighlight("3",true);"
alt="Footnote: Click here to display the footnote" title="Footnote: Click here
to display the footnote">
3
</a>
</sup>
-</p><p></p><p></p><p></p><p></p><p>. More advanced property expressions can
traverse multiple properties (for example, <code>user.address.city</code>), or
even invoke public methods. Here the expansion simply reads the
<code>currentTime</code> property of the page.</p><p> </p><p>Tapestry
follows the rules defined by Sun's JavaBeans specification: a property name of
<code>currentTime</code> maps to two methods: <code>getCurrentTime()</code> and
<code>setCurrentTime()</code>. If you omit one or the other of these methods,
the property is either read only (as here), or write
only</p><p></p><p></p><p></p><p></p><p>
+<p> </p><p> </p><p> </p><p> </p><p>. More advanced
property expressions can traverse multiple properties (for example,
<code>user.address.city</code>), or even invoke public methods. Here the
expansion simply reads the <code>currentTime</code> property of the
page.</p><p> </p><p>Tapestry follows the rules defined by Sun's JavaBeans
specification: a property name of <code>currentTime</code> maps to two methods:
<code>getCurrentTime()</code> and <code>setCurrentTime()</code>. If you omit
one or the other of these methods, the property is either read only (as here),
or write only</p><p> </p><p> </p><p> </p><p> </p>
<sup id="FootnoteMarker4">
<a shape="rect" class="FootnoteMarker" name="FootnoteMarker4"
href="#Footnote4" onclick="footnoteHighlight("4",true);"
alt="Footnote: Click here to display the footnote" title="Footnote: Click here
to display the footnote">
4
</a>
</sup>
-</p><p></p><p></p><p></p><p></p><p>.</p><p> </p><p>Tapestry does go one
step further: it ignores case when matching properties inside the expansion to
properties of the page. In the template we could say ${currenttime} or
${CurrentTime} or any variation, and Tapestry will <em>still</em> invoke the
<code>getCurrentTime()</code> method.</p><p>Note that in Tapestry it is not
necessary to configure what object holds the <code>currentTime</code> property;
a template and a page are always used in combination with each other;
expressions are always rooted in the page instance, in this case, an instance
of the Index class.</p><p>The Index.tml template includes a second
expansion:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
+<p> </p><p> </p><p> </p><p> </p><p>.</p><p> </p><p>Tapestry
does go one step further: it ignores case when matching properties inside the
expansion to properties of the page. In the template we could say
${currenttime} or ${CurrentTime} or any variation, and Tapestry will
<em>still</em> invoke the <code>getCurrentTime()</code> method.</p><p>Note that
in Tapestry it is not necessary to configure what object holds the
<code>currentTime</code> property; a template and a page are always used in
combination with each other; expressions are always rooted in the page
instance, in this case, an instance of the Index class.</p><p>The Index.tml
template includes a second expansion:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
<script class="theme: Default; brush: xml; gutter: false"
type="syntaxhighlighter"><![CDATA[ <p>${message:greeting}</p>
]]></script>
-</div></div><p>Here <code>greeting</code> is not a property of the page; its
actually a localized message key. Every Tapestry page and component is allowed
to have its own message catalog</p><p></p><p></p><p></p><p></p><p>
+</div></div><p>Here <code>greeting</code> is not a property of the page; its
actually a localized message key. Every Tapestry page and component is allowed
to have its own message
catalog</p><p> </p><p> </p><p> </p><p> </p>
<sup id="FootnoteMarker5">
<a shape="rect" class="FootnoteMarker" name="FootnoteMarker5"
href="#Footnote5" onclick="footnoteHighlight("5",true);"
alt="Footnote: Click here to display the footnote" title="Footnote: Click here
to display the footnote">
5
</a>
</sup>
-</p><p></p><p></p><p></p><p></p><p>.</p><p> </p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width:
1px;"><b>src/main/resources/com/example/tutorial/pages/Index.properties</b></div><div
class="codeContent panelContent pdl">
+<p> </p><p> </p><p> </p><p> </p><p>.</p><p> </p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width:
1px;"><b>src/main/resources/com/example/tutorial/pages/Index.properties</b></div><div
class="codeContent panelContent pdl">
<script class="theme: Default; brush: java; gutter: false"
type="syntaxhighlighter"><![CDATA[greeting=Welcome to Tapestry 5! We hope that
this project template will get you going in style.
]]></script>
-</div></div><p>Message catalogs are useful for storing repeating strings
outside of code or templates, though their primary purpose is related to
localization of the application (which will be described in more detail in a
later chapter). Messages that may be used across multiple pages can be stored
in the application's global message catalog,
src/main/webapp/WEB-INF/app.properties, instead.</p><p>This "message:" prefix
is not some special case; there are actually quite a few of these <em>binding
prefixes</em> built into Tapestry, each having a specific purpose. In fact,
omitting a binding prefix in an expansion is exactly the same as using the
"prop:" binding prefix, which means to treat the binding as a property
expression.</p><p>Expansions are useful for extracting a piece of information
and rendering it out to the client as a string, but the real heavy lifting of
Tapestry occurs inside components.</p><h1
id="ExploringtheProject-ComponentsInsideTemplates">Components Inside Templa
tes</h1><p>Components can be represented inside a component template in two
ways</p><p></p><p></p><p></p><p></p><p>
+</div></div><p>Message catalogs are useful for storing repeating strings
outside of code or templates, though their primary purpose is related to
localization of the application (which will be described in more detail in a
later chapter). Messages that may be used across multiple pages can be stored
in the application's global message catalog,
src/main/webapp/WEB-INF/app.properties, instead.</p><p>This "message:" prefix
is not some special case; there are actually quite a few of these <em>binding
prefixes</em> built into Tapestry, each having a specific purpose. In fact,
omitting a binding prefix in an expansion is exactly the same as using the
"prop:" binding prefix, which means to treat the binding as a property
expression.</p><p>Expansions are useful for extracting a piece of information
and rendering it out to the client as a string, but the real heavy lifting of
Tapestry occurs inside components.</p><h1
id="ExploringtheProject-ComponentsInsideTemplates">Components Inside Templa
tes</h1><p>Components can be represented inside a component template in two
ways</p><p> </p><p> </p><p> </p><p> </p>
<sup id="FootnoteMarker6">
<a shape="rect" class="FootnoteMarker" name="FootnoteMarker6"
href="#Footnote6" onclick="footnoteHighlight("6",true);"
alt="Footnote: Click here to display the footnote" title="Footnote: Click here
to display the footnote">
6
</a>
</sup>
-</p><p></p><p></p><p></p><p></p><p>:</p><p> </p><ul><li>As an ordinary
element, but with a t:type attribute to define the type of
component.</li></ul><ul><li>As an element in the Tapestry namespace, in which
case the element name determines the type.</li></ul><p>Here we've used an
<html> element to represent the application's Layout component.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+<p> </p><p> </p><p> </p><p> </p><p>:</p><p> </p><ul><li>As
an ordinary element, but with a t:type attribute to define the type of
component.</li></ul><ul><li>As an element in the Tapestry namespace, in which
case the element name determines the type.</li></ul><p>Here we've used an
<html> element to represent the application's Layout component.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
<script class="theme: Default; brush: xml; gutter: false"
type="syntaxhighlighter"><![CDATA[<html t:type="layout" ...>
...
</html>
@@ -366,13 +360,13 @@ var footnoteMarkerHighlight = function(i
-<span class="gliffy-container" id="gliffy-container-24346949-7418"
data-fullwidth="913" data-ceoid="24188263"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="/confluence/plugins/gliffy/viewer.action?inline=false&attachmentId=24346949&attachmentVersion=2&lastPage=%2Fpages%2Fviewpage.action%3FpageId%3D24188263"
data-filename="Templates and Parameters">
+<span class="gliffy-container" id="gliffy-container-24346949-7996"
data-fullwidth="913" data-ceoid="24188263"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="/confluence/plugins/gliffy/viewer.action?inline=false&attachmentId=24346949&attachmentVersion=2&lastPage=%2Fpages%2Fviewpage.action%3FpageId%3D24188263"
data-filename="Templates and Parameters">
- <map id="gliffy-map-24346949-1405" name="gliffy-map-24346949-1405"></map>
+ <map id="gliffy-map-24346949-6882" name="gliffy-map-24346949-6882"></map>
- <img class="gliffy-image gliffy-image-border"
id="gliffy-image-24346949-7418" width="304" height="300" data-full-width="913"
data-full-height="901"
src="https://cwiki.apache.org/confluence/download/attachments/24188263/Templates%20and%20Parameters.png?version=2&modificationDate=1371888025000&api=v2"
alt="Templates and Parameters" usemap="#gliffy-map-24346949-1405">
+ <img class="gliffy-image gliffy-image-border"
id="gliffy-image-24346949-7996" width="304" height="300" data-full-width="913"
data-full-height="901"
src="https://cwiki.apache.org/confluence/download/attachments/24188263/Templates%20and%20Parameters.png?version=2&modificationDate=1371888025000&api=v2"
alt="Templates and Parameters" usemap="#gliffy-map-24346949-6882">
- <map class="gliffy-dynamic" id="gliffy-dynamic-map-24346949-7418"
name="gliffy-dynamic-map-24346949-7418"></map>
+ <map class="gliffy-dynamic" id="gliffy-dynamic-map-24346949-7996"
name="gliffy-dynamic-map-24346949-7996"></map>
</span>
@@ -399,7 +393,7 @@ var footnoteMarkerHighlight = function(i
<p>This level of detail reflects that the
application has been configured to run in <em>development mode</em> instead of
<em>production mode</em>. In production mode, the exception report would simply
be the top level exception message. However, most production applications go
further and customize how Tapestry handles and reports exceptions.</p>
</div>
</div>
-<p>There was a bunch of other stuff on this page, related to links and Ajax
and other things, that we'll ignore for the
moment.</p><hr><p> </p><p></p><p></p><p></p><p></p><p></p><p><table
class="Footnotes" style="width: 100%; border:none;" cellspacing="0"
cellpadding="0" summary="This table contains one or more notes for references
made elsewhere on the page."><caption
class="accessibility">Footnotes</caption><thead class="accessibility"><tr
class="accessibility"><th colspan="1" rowspan="1" class="accessibility"
id="footnote-th1">Reference</th><th colspan="1" rowspan="1"
class="accessibility" id="footnote-th2">Notes</th></tr></thead><tbody><tr
name="Footnote1"><td colspan="1" rowspan="1" valign="top" class="FootnoteNum"
headings="footnote-th1">
+<p>There was a bunch of other stuff on this page, related to links and Ajax
and other things, that we'll ignore for the
moment.</p><hr><p> </p><p> </p><p> </p><p> </p><p><table
class="Footnotes" style="width: 100%; border:none;" cellspacing="0"
cellpadding="0" summary="This table contains one or more notes for references
made elsewhere on the page."><caption
class="accessibility">Footnotes</caption><thead class="accessibility"><tr
class="accessibility"><th colspan="1" rowspan="1" class="accessibility"
id="footnote-th1">Reference</th><th colspan="1" rowspan="1"
class="accessibility" id="footnote-th2">Notes</th></tr></thead><tbody><tr
name="Footnote1"><td colspan="1" rowspan="1" valign="top" class="FootnoteNum"
headings="footnote-th1">
<a shape="rect" id="FootnoteNum1" href="#FootnoteMarker1"
onclick="footnoteMarkerHighlight("1");"
onmouseover="footnoteHighlight("1",false);" alt="Footnote: Click to
return to reference in text" title="Footnote: Click to return to reference in
text">
1
</a>
@@ -436,7 +430,7 @@ var footnoteMarkerHighlight = function(i
</a>
</td><td colspan="1" rowspan="1" valign="top" class="Footnote"
id="Footnote6" width="100%" headings="footnote-th2">
Ok, there's a third way as well, which will be discussed in good
time.
- </td></tr></tbody></table></p><p></p><p></p><p></p><p></p><style
type="text/css">/*<![CDATA[*/
+
</td></tr></tbody></table></p><p> </p><p> </p><p> </p><style
type="text/css">/*<![CDATA[*/
table.ScrollbarTable {border: none;padding: 3px;width: 100%;padding:
3px;margin: 0px;background-color: #f0f0f0}
table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width:
16px;border: none;}
table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
@@ -444,7 +438,7 @@ table.ScrollbarTable td.ScrollbarParent
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width:
16px;border: none;}
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="loading-the-project-into-eclipse.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="loading-the-project-into-eclipse.html">Loading the Project Into
Eclipse</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect"
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo
Guessing Game</a></td><td colspa
n="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect"
href="implementing-the-hi-lo-guessing-game.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div></div>
+/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="creating-the-skeleton-application.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="creating-the-skeleton-application.html">Creating The Skeleton
Application</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect"
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo
Guessing Game</a></td><td col
span="1" rowspan="1" class="ScrollbarNextIcon"><a shape="rect"
href="implementing-the-hi-lo-guessing-game.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div></div>
</div>
<div class="clearer"></div>
Modified:
websites/production/tapestry/content/loading-the-project-into-eclipse.html
==============================================================================
--- websites/production/tapestry/content/loading-the-project-into-eclipse.html
(original)
+++ websites/production/tapestry/content/loading-the-project-into-eclipse.html
Sat Nov 22 18:19:55 2014
@@ -26,16 +26,6 @@
</title>
<link type="text/css" rel="stylesheet" href="/resources/space.css">
- <link href='/resources/highlighter/styles/shCoreCXF.css' rel='stylesheet'
type='text/css' />
- <link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet'
type='text/css' />
- <script src='/resources/highlighter/scripts/shCore.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushJava.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushXml.js'
type='text/javascript'></script>
- <script src='/resources/highlighter/scripts/shBrushPlain.js'
type='text/javascript'></script>
- <script type="text/javascript">
- SyntaxHighlighter.defaults['toolbar'] = false;
- SyntaxHighlighter.all();
- </script>
<link href="/styles/style.css" rel="stylesheet" type="text/css"/>
@@ -61,92 +51,12 @@
<div class="clearer"></div>
<div id="breadcrumbs">
- <a href="index.html">Apache Tapestry</a> > <a
href="documentation.html">Documentation</a> > <a
href="tapestry-tutorial.html">Tapestry Tutorial</a> > <a
href="loading-the-project-into-eclipse.html">Loading the Project Into
Eclipse</a>
+ <a href="index.html">Apache Tapestry</a> > <a
href="index.html">Index</a> > <a
href="redirects.html">Redirects</a> > <a
href="loading-the-project-into-eclipse.html">Loading the Project Into
Eclipse</a>
<a class="edit" title="Edit this page (requires approval -- just ask on
the mailing list)"
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=24188253">edit</a>
</div>
<div id="content">
-<div id="ConfluenceContent"><style type="text/css">/*<![CDATA[*/
-table.ScrollbarTable {border: none;padding: 3px;width: 100%;padding:
3px;margin: 0px;background-color: #f0f0f0}
-table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width:
16px;border: none;}
-table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
-table.ScrollbarTable td.ScrollbarParent {text-align: center;border: none;}
-table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
-table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width:
16px;border: none;}
-
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="creating-the-skeleton-application.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="creating-the-skeleton-application.html">Creating The Skeleton
Application</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect" href="exploring-the-project.html">Exploring
the Project</a></td><td colspan="1" rowspan="1" class="Sc
rollbarNextIcon"><a shape="rect" href="exploring-the-project.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div><p>The first step is to ask Maven to
generate the Eclipse control files (<code>.classpath</code> and
<code>.project</code>) for us:</p><div class="preformatted panel"
style="border-width: 1px;"><div class="preformattedContent panelContent">
-<pre>$ mvn eclipse:eclipse -DdownloadSources=true
-[INFO] Scanning for projects...
-Downloading:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-war-plugin/2.1.1/maven-war-plugin-2.1.1.pom
-Downloaded:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-war-plugin/2.1.1/maven-war-plugin-2.1.1.pom
(7 KB at 7.1 KB/sec)
-Downloading:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-war-plugin/2.1.1/maven-war-plugin-2.1.1.jar
-Downloaded:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-war-plugin/2.1.1/maven-war-plugin-2.1.1.jar
(76 KB at 83.4 KB/sec)
-Downloading:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/maven-metadata.xml
-Downloaded:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/maven-metadata.xml
(680 B at 1.9 KB/sec)
-Downloading:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/2.8/maven-eclipse-plugin-2.8.pom
-Downloaded:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/2.8/maven-eclipse-plugin-2.8.pom
(12 KB at 22.9 KB/sec)
-Downloading:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-plugins/17/maven-plugins-17.pom
-Downloaded:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-plugins/17/maven-plugins-17.pom
(13 KB at 25.6 KB/sec)
-Downloading:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/2.8/maven-eclipse-plugin-2.8.jar
-Downloaded:
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-eclipse-plugin/2.8/maven-eclipse-plugin-2.8.jar
(202 KB at 237.8 KB/sec)
-[INFO]
-[INFO] ------------------------------------------------------------------------
-[INFO] Building tutorial1 Tapestry 5 Application 1.0-SNAPSHOT
-[INFO] ------------------------------------------------------------------------
-[INFO]
-[INFO] >>> maven-eclipse-plugin:2.8:eclipse (default-cli) @ tutorial1
>>>
-[INFO]
-[INFO] <<< maven-eclipse-plugin:2.8:eclipse (default-cli) @ tutorial1
<<<
-[INFO]
-[INFO] --- maven-eclipse-plugin:2.8:eclipse (default-cli) @ tutorial1 ---
-Downloading:
http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-7/plexus-archiver-1.0-alpha-7.pom
-Downloaded:
http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-7/plexus-archiver-1.0-alpha-7.pom
(2 KB at 2.3 KB/sec)
-Downloading:
http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom
-Downloaded:
http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom
(2 KB at 3.7 KB/sec)
-Downloading:
http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/1.2/plexus-utils-1.2.pom
-Downloaded:
http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/1.2/plexus-utils-1.2.pom
(767 B at 1.5 KB/sec)
-
-(...hundreds of lines omitted here...)
-
-Downloading:
https://repository.apache.org/content/groups/staging/com/google/inject/guice/2.0/guice-2.0-sources.jar
-Downloading:
http://repo1.maven.org/maven2/com/google/inject/guice/2.0/guice-2.0-sources.jar
-Downloading:
https://repository.apache.org/content/groups/staging/org/apache/tapestry/tapestry-yuicompressor/5.3/tapestry-yuicompressor-5.3-sources.jar
-Downloaded:
https://repository.apache.org/content/groups/staging/org/apache/tapestry/tapestry-yuicompressor/5.3/tapestry-yuicompressor-5.3-sources.jar
(7 KB at 25.8 KB/sec)
-Downloading:
https://repository.apache.org/content/groups/staging/rhino/js/1.6R7/js-1.6R7-sources.jar
-Downloading: http://repo1.maven.org/maven2/rhino/js/1.6R7/js-1.6R7-sources.jar
-[INFO] Wrote settings to
/Users/hlship/Documents/workspace/tutorial1/.settings/org.eclipse.jdt.core.prefs
-[INFO] Wrote Eclipse project for "tutorial1" to
/Users/hlship/Documents/workspace/tutorial1.
-[INFO]
- Sources for some artifacts are not available.
- List of artifacts without a source archive:
- o org.beanshell:bsh:2.0b4
- o xalan:serializer:2.7.1
- o org.apache.tomcat:catalina:6.0.30
- o org.apache.tomcat:servlet-api:6.0.30
- o org.apache.tomcat:juli:6.0.30
- o org.apache.tomcat:annotations-api:6.0.30
- o org.apache.tomcat:coyote:6.0.30
- o org.apache.tomcat:dbcp:6.0.30
-
-[INFO] ------------------------------------------------------------------------
-[INFO] BUILD SUCCESS
-[INFO] ------------------------------------------------------------------------
-[INFO] Total time: 39.526s
-[INFO] Finished at: Fri Mar 1 11:52:57 PST 2013
-[INFO] Final Memory: 9M/81M
-[INFO] ------------------------------------------------------------------------
-~/Documents/workspace/tutorial1
-
-</pre>
-</div></div><p>At this point, Maven has created the Eclipse
<code>.project</code> and <code>.classpath</code> files, and we can import the
project. In addition, since we specified <code>-DdownloadSources=true</code>,
Maven has also downloaded the sources of each library and linked to the source
JAR (where available); that means we can see the sources for any Tapestry
classes right inside Eclipse, which is very useful when debugging or
exploring.</p><p>At this point, we are ready to import the project created by
Maven into Eclipse so we can start working with it. Launch Eclipse and switch
over to the Java Perspective.</p><p>Right click inside the Package Explorer
view and select <strong>Import ...</strong></p><p><img
class="confluence-embedded-image confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-java-persp.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-java-persp.png?version=1&modificationDate=1291067922000&api=v2"></p><p>Ch
oose the "existing projects" option:</p><p><img
class="confluence-embedded-image confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-import.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-import.png?version=1&modificationDate=1291067922000&api=v2"></p><p>Now
select the folder created by Maven:</p><p><img
class="confluence-embedded-image confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-import-folder.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-import-folder.png?version=1&modificationDate=1291067922000&api=v2"></p><p>When
you click the Finish button, the project will be imported into the Eclipse
workspace.</p><p><img class="confluence-embedded-image confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-project-errors.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-project-errors.png?version=1&modificationDate=1291067922000&am
p;api=v2"></p><p>However; there are many errors. Maven expects that you will
configure a classpath variable, <code>M2_REPO</code>, that points at your local
repository; a directory in your home directory that stores all those downloaded
JARs and other files. Open Eclipse's preferences panel and navigate to
<strong>Java > Build Path > Classpath Variables</strong>:</p><p><img
class="confluence-embedded-image confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-classpath-vars.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-classpath-vars.png?version=1&modificationDate=1291067921000&api=v2"></p><p>Click
the <strong>New</strong> button, and enter the new variable (you'll have to
adjust this for your operating system and local paths):</p><p><img
class="confluence-embedded-image confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-new-var.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-n
ew-var.png?version=1&modificationDate=1291067942000&api=v2"></p><p>Eclipse
will ask to perform a clean build, and the errors will be gone once it has
done so.</p><h1
id="LoadingtheProjectIntoEclipse-RunningtheApplicationinsideEclipse">Running
the Application inside Eclipse</h1><p>The task is to set up Jetty to run our
application directly out of our Eclipse workspace. This is a great way to
develop web applications, since we don't want to have to use Maven to compile
and run the application ... or worse yet, use Maven to package and deploy the
application. That's for later, when we want to put the application into
production. For development, we want a fast, agile environment that can keep up
with our changes, and that means we can't wait for redeploys and
restarts.</p><p>Choose the <strong>Run ...</strong> item from the Eclipse
<strong>Run</strong> menu to get the launch configuration dialog:</p><p><img
class="confluence-embedded-image confluence-thumbnail" src="loading-the
-project-into-eclipse.thumbs/eclipse-run.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-run.png?version=1&modificationDate=1291068594000&api=v2"></p><p>Select
<strong>Jetty Webapp</strong> and click the <strong>New</strong> button, then
fill in a few values:</p><p><img class="confluence-embedded-image
confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-launch.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-launch.png?version=2&modificationDate=1321979047000&api=v2"></p><p>You
will need to click the "Show advanced Options" checkbox, then uncheck "SSL"
and "Enable Scanner".</p><p>Tapestry runs best with a couple of additional
options; click the "Arguments" tab and enter the following VM Arguments:
<code>-XX:MaxPermSize=256M -Xmx600m
-Dtapestry.execution-mode=development</code></p><p><img
class="confluence-embedded-image confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-launch
-vmargs.png"
data-image-src="/confluence/download/attachments/24188253/eclipse-launch-vmargs.png?version=1&modificationDate=1321979336000&api=v2"></p><p>Tapestry
uses more PermGen space (the part of Java memory used for loading classes)
than a typical application, and uses more heap memory than the default; the
above settings are good for a medium-to-large size Tapestry application, and
will keep Java from running the Garbage Collector too often. The setting of
tapestry.execution mode tells Tapestry to run in development mode, where
runtime exceptions are reported more exhaustively.</p><p>With those settings in
place, you can then click <strong>Run</strong> and Jetty will launch (it takes
only a few seconds):</p><p>Once you click Run, Jetty will start up and launch
(it should take a second or two).</p><p><img class="confluence-embedded-image
confluence-thumbnail"
src="loading-the-project-into-eclipse.thumbs/eclipse-jetty.png"
data-image-src="/confluence/download/attachments/
24188253/eclipse-jetty.png?version=3&modificationDate=1321979524000&api=v2"></p><p>You
may now start the application with the URL <a shape="rect"
class="external-link" href="http://localhost:8080/tutorial1/"
>http://localhost:8080/tutorial1/</a></p><style type="text/css">/*<![CDATA[*/
-table.ScrollbarTable {border: none;padding: 3px;width: 100%;padding:
3px;margin: 0px;background-color: #f0f0f0}
-table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width:
16px;border: none;}
-table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
-table.ScrollbarTable td.ScrollbarParent {text-align: center;border: none;}
-table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
-table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width:
16px;border: none;}
-
-/*]]>*/</style><div class="Scrollbar"><table class="ScrollbarTable"><tr><td
colspan="1" rowspan="1" class="ScrollbarPrevIcon"><a shape="rect"
href="creating-the-skeleton-application.html"><img align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/back_16.gif" width="16"
height="16"></a></td><td colspan="1" rowspan="1" class="ScrollbarPrevName"
width="33%"><a shape="rect"
href="creating-the-skeleton-application.html">Creating The Skeleton
Application</a> </td><td colspan="1" rowspan="1" class="ScrollbarParent"
width="33%"><sup><a shape="rect" href="tapestry-tutorial.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/up_16.gif" width="8"
height="8"></a></sup><a shape="rect" href="tapestry-tutorial.html">Tapestry
Tutorial</a></td><td colspan="1" rowspan="1" class="ScrollbarNextName"
width="33%"> <a shape="rect" href="exploring-the-project.html">Exploring
the Project</a></td><td colspan="1" rowspan="1" class="Sc
rollbarNextIcon"><a shape="rect" href="exploring-the-project.html"><img
align="middle" border="0"
src="https://cwiki.apache.org/confluence/images/icons/forwd_16.gif" width="16"
height="16"></a></td></tr></table></div></div>
+<div id="ConfluenceContent"><p>This page is no longer used. See <a
shape="rect" href="tapestry-tutorial.html">Tapestry Tutorial</a></p></div>
</div>
<div class="clearer"></div>
Modified: websites/production/tapestry/content/tapestry-tutorial.html
==============================================================================
--- websites/production/tapestry/content/tapestry-tutorial.html (original)
+++ websites/production/tapestry/content/tapestry-tutorial.html Sat Nov 22
18:19:55 2014
@@ -48,19 +48,13 @@
</div></div>
<div id="top">
-<div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em
1em .1em 1em">
-<p>
-<span style="color: #999; font-size: 90%">Tapestry docs, issues, wikis &
blogs:</span>
-</p><form enctype="application/x-www-form-urlencoded" method="get"
action="http://tapestry.apache.org/search.html">
+<div id="smallbanner"><div class="searchbox" style="float:right;margin: .3em
1em .1em 1em"><span style="color: #999; font-size: 90%">Tapestry docs, issues,
wikis & blogs:</span>
+<form enctype="application/x-www-form-urlencoded" method="get"
action="http://tapestry.apache.org/search.html">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
-</div>
-
-<div class="emblem" style="float:left"><a shape="rect" href="index.html"><img
class="confluence-embedded-image"
src="https://cwiki.apache.org/confluence/download/attachments/21791252/tapestry_s.png?version=3&modificationDate=1293093635000&api=v2"
data-image-src="/confluence/download/attachments/21791252/tapestry_s.png?version=3&modificationDate=1293093635000&api=v2"></a></div>
-<div class="title" style="float:left; margin: 0 0 0 3em">
-<h1 id="SmallBanner-PageTitle">Tapestry Tutorial</h1></div></div>
+</div><div class="emblem" style="float:left"><p><a shape="rect"
href="index.html"><img class="confluence-embedded-image
confluence-external-resource"
src="http://tapestry.apache.org/images/tapestry_small.png"
data-image-src="http://tapestry.apache.org/images/tapestry_small.png"></a></p></div><div
class="title" style="float:left; margin: 0 0 0 3em"><h1
id="SmallBanner-PageTitle">Tapestry Tutorial</h1></div></div>
<div class="clearer"></div>
</div>
@@ -88,7 +82,7 @@
<span class="icon icon-page" title="Page">Page:</span>
</div>
<div class="details">
- <a shape="rect"
href="tapestry-tutorial.html">Tapestry Tutorial</a>
+ <a shape="rect"
href="tapestry-for-jsf-users.html">Tapestry for JSF Users</a>
</div>
@@ -97,7 +91,7 @@
<span class="icon icon-page" title="Page">Page:</span>
</div>
<div class="details">
- <a shape="rect"
href="tapestry-for-jsf-users.html">Tapestry for JSF Users</a>
+ <a shape="rect"
href="principles.html">Principles</a>
</div>
@@ -106,7 +100,7 @@
<span class="icon icon-page" title="Page">Page:</span>
</div>
<div class="details">
- <a shape="rect"
href="principles.html">Principles</a>
+ <a shape="rect"
href="getting-started.html">Getting Started</a>
</div>
@@ -115,12 +109,12 @@
<span class="icon icon-page" title="Page">Page:</span>
</div>
<div class="details">
- <a shape="rect"
href="getting-started.html">Getting Started</a>
+ <a shape="rect"
href="tapestry-tutorial.html">Tapestry Tutorial</a>
</div>
</li></ul>
-</div><h1 id="TapestryTutorial-TableofContents">Table of
Contents</h1><p></p><ul class="childpages-macro"><li><a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a></li><li><a shape="rect"
href="creating-the-skeleton-application.html">Creating The Skeleton
Application</a></li><li><a shape="rect"
href="loading-the-project-into-eclipse.html">Loading the Project Into
Eclipse</a></li><li><a shape="rect" href="exploring-the-project.html">Exploring
the Project</a></li><li><a shape="rect"
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo
Guessing Game</a></li><li><a shape="rect"
href="using-beaneditform-to-create-user-forms.html">Using BeanEditForm To
Create User Forms</a></li><li><a shape="rect"
href="using-tapestry-with-hibernate.html">Using Tapestry With
Hibernate</a></li></ul><h1
id="TapestryTutorial-Introduction">Introduction</h1><p>Welcome to
Tapestry!</p><p>This is a tutorial for people who will be creating Tapestry 5
app
lications. It doesn't matter whether you have experience with Tapestry 4 (or
Tapestry 3, for that matter) or whether you are completely new to Tapestry. In
fact, in some ways, the less you know about web development in general, and
older Tapestry versions in particular, the better off you may be ... that much
less to unlearn!</p><p>You do need to have a reasonable understanding of HTML,
a smattering of XML, and a good understanding of basic Java language features,
including Annotations.</p><h1
id="TapestryTutorial-TheChallengesofWebApplicationDevelopment">The Challenges
of Web Application Development</h1><p>If you're used to developing web
applications using servlets and JSPs, or with Struts, you are simply used to a
lot of pain. So much pain, you may not even understand the dire situation you
are in! These are environments with no safety net; Struts and the Servlet API
have no idea how your application is structured, or how the different pieces
fit together. Any URL can be an actio
n and any action can forward to any view (usually a JSP) to provide an HTML
response to the web browser. The pain is the unending series of small, yet
important, decisions you have to make as a developer (and communicate to the
rest of your team). What are the naming conventions for actions, for pages, for
attributes stored in the HttpSession or HttpServletRequest? Where do
cross-cutting concerns such as database transactions, caching and security get
implemented (and do you have to cut-and-paste Java or XML to make it work?) How
are your packages organized ... where to the user interface classes go, and
where do the data and entity objects go? How do you share code from one part of
your application to another?</p><p>On top of all that, the traditional
approaches thrust something most unwanted in your face: <em>multi-threaded
coding</em>. Remember back to Object Oriented Programming 101 where an object
was defined as a bundle of data and operations on that data? You have to
unlearn
that lesson as soon as you build a traditional web application, because web
applications are multi-threaded. An application server could be handling dozens
or hundreds of requests from individual users, each in their own thread, and
each sharing the exact same objects. Suddenly, you can't store data inside an
object (a servlet or a Struts Action) because whatever data you store for one
user will be instantly overwritten by some other user.</p><p>Worse, your
objects each have only one operation: <code>doGet()</code> or
<code>doPost()</code>.</p><p>Meanwhile, most of your day-to-day work involves
deciding how to package up some data already inside a particular Java object
and squeeze that data into a URL's query parameters, so that you can write more
code to convert it back if the user clicks that particular link. And don't
forget editing a bunch of XML files to keep the servlet container, or the
Struts framework, aware of these decisions.</p><p>Just for laughs, remember
that you have
to rebuild, redeploy and restart your application after virtually any change.
Is any of this familiar? Then perhaps you'd appreciate something a little
<em>less</em> familiar: Tapestry.</p><h1
id="TapestryTutorial-TheTapestryWay">The Tapestry Way</h1><p>Tapestry uses a
very different model: a structured, organized world of pages, and components
within pages. Everything has a very specific name (that you provide). Once you
know the name of a page, you know the location of the Java class for that page,
the location of the template for that page, and the total structure of the
page. Tapestry knows all this as well, and can make things <strong>just
work</strong>.</p><p>As we'll see in the following pages, Tapestry lets you
code in terms of your objects. You'll barely see any Tapestry classes, outside
of a few Java annotations. If you have information to store, store it as fields
of your classes, not inside the HttpServletRequest or HttpSession. If you need
some code to execute, it's ju
st a simple annotation or method naming convention to get Tapestry to invoke
that method, at the right time, with the right data. The methods don't even
have to be public!</p><p>Tapestry also shields you from most of the
multi-threaded aspects of web application development. Tapestry manages the
life cycle of your page and components objects, and the fields of the pages and
components, in a thread-safe way. Your page and component classes always look
like simple, standard <a shape="rect" class="external-link"
href="http://en.wikipedia.org/wiki/Plain_Old_Java_Object"
>POJOs</a>.</p><p>Tapestry began in January 2000, and it now reflects over ten
years of experience of the entire Tapestry community. Tapestry brings to the
table all that experience about the best ways to build scalable, maintainable,
robust, internationalized (and more recently) Ajax-enabled applications.
Tapestry 5 represents a completely new code base (compared to Tapestry 4)
designed to simplify the Tapestry coding m
odel while at the same time extending the power of Tapestry and improving
performance.</p><h1 id="TapestryTutorial-GettingTheTutorialSource">Getting The
Tutorial Source</h1><p>The source code for the Tapestry tutorial is available
on <a shape="rect" class="external-link"
href="https://github.com/hlship/tapestry5-tutorial" >GitHub</a> (although you
won't need it to complete the tutorial).</p><h1
id="TapestryTutorial-TimetoBegin">Time to Begin</h1><p>Okay, enough background.
Now let's get started on the tutorial: <a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a></p></div>
+</div><h1 id="TapestryTutorial-TableofContents">Table of
Contents</h1><p></p><ul class="childpages-macro"><li><a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a></li><li><a shape="rect"
href="creating-the-skeleton-application.html">Creating The Skeleton
Application</a></li><li><a shape="rect"
href="exploring-the-project.html">Exploring the Project</a></li><li><a
shape="rect" href="implementing-the-hi-lo-guessing-game.html">Implementing the
Hi-Lo Guessing Game</a></li><li><a shape="rect"
href="using-beaneditform-to-create-user-forms.html">Using BeanEditForm To
Create User Forms</a></li><li><a shape="rect"
href="using-tapestry-with-hibernate.html">Using Tapestry With
Hibernate</a></li></ul><h1
id="TapestryTutorial-Introduction">Introduction</h1><p>Welcome to
Tapestry!</p><p>This is a tutorial for people who will be creating Tapestry 5
applications. It doesn't matter whether you have experience with Tapestry 4 (or
Tapestry 3, for that matter)
or whether you are completely new to Tapestry. In fact, in some ways, the less
you know about web development in general, and older Tapestry versions in
particular, the better off you may be ... that much less to unlearn!</p><p>You
do need to have a reasonable understanding of HTML, a smattering of XML, and a
good understanding of basic Java language features, including
Annotations.</p><h1
id="TapestryTutorial-TheChallengesofWebApplicationDevelopment">The Challenges
of Web Application Development</h1><p>If you're used to developing web
applications using servlets and JSPs, or with Struts, you are simply used to a
lot of pain. So much pain, you may not even understand the dire situation you
are in! These are environments with no safety net; Struts and the Servlet API
have no idea how your application is structured, or how the different pieces
fit together. Any URL can be an action and any action can forward to any view
(usually a JSP) to provide an HTML response to the web browser. T
he pain is the unending series of small, yet important, decisions you have to
make as a developer (and communicate to the rest of your team). What are the
naming conventions for actions, for pages, for attributes stored in the
HttpSession or HttpServletRequest? Where do cross-cutting concerns such as
database transactions, caching and security get implemented (and do you have to
cut-and-paste Java or XML to make it work?) How are your packages organized ...
where to the user interface classes go, and where do the data and entity
objects go? How do you share code from one part of your application to
another?</p><p>On top of all that, the traditional approaches thrust something
most unwanted in your face: <em>multi-threaded coding</em>. Remember back to
Object Oriented Programming 101 where an object was defined as a bundle of data
and operations on that data? You have to unlearn that lesson as soon as you
build a traditional web application, because web applications are multi-threade
d. An application server could be handling dozens or hundreds of requests from
individual users, each in their own thread, and each sharing the exact same
objects. Suddenly, you can't store data inside an object (a servlet or a Struts
Action) because whatever data you store for one user will be instantly
overwritten by some other user.</p><p>Worse, your objects each have only one
operation: <code>doGet()</code> or <code>doPost()</code>.</p><p>Meanwhile, most
of your day-to-day work involves deciding how to package up some data already
inside a particular Java object and squeeze that data into a URL's query
parameters, so that you can write more code to convert it back if the user
clicks that particular link. And don't forget editing a bunch of XML files to
keep the servlet container, or the Struts framework, aware of these
decisions.</p><p>Just for laughs, remember that you have to rebuild, redeploy
and restart your application after virtually any change. Is any of this
familiar? Th
en perhaps you'd appreciate something a little <em>less</em> familiar:
Tapestry.</p><h1 id="TapestryTutorial-TheTapestryWay">The Tapestry
Way</h1><p>Tapestry uses a very different model: a structured, organized world
of pages, and components within pages. Everything has a very specific name
(that you provide). Once you know the name of a page, you know the location of
the Java class for that page, the location of the template for that page, and
the total structure of the page. Tapestry knows all this as well, and can make
things <strong>just work</strong>.</p><p>As we'll see in the following pages,
Tapestry lets you code in terms of your objects. You'll barely see any Tapestry
classes, outside of a few Java annotations. If you have information to store,
store it as fields of your classes, not inside the HttpServletRequest or
HttpSession. If you need some code to execute, it's just a simple annotation or
method naming convention to get Tapestry to invoke that method, at the right tim
e, with the right data. The methods don't even have to be
public!</p><p>Tapestry also shields you from most of the multi-threaded aspects
of web application development. Tapestry manages the life cycle of your page
and components objects, and the fields of the pages and components, in a
thread-safe way. Your page and component classes always look like simple,
standard <a shape="rect" class="external-link"
href="http://en.wikipedia.org/wiki/Plain_Old_Java_Object"
>POJOs</a>.</p><p>Tapestry began in January 2000, and it now reflects over ten
years of experience of the entire Tapestry community. Tapestry brings to the
table all that experience about the best ways to build scalable, maintainable,
robust, internationalized (and more recently) Ajax-enabled applications.
Tapestry 5 represents a completely new code base (compared to Tapestry 4)
designed to simplify the Tapestry coding model while at the same time extending
the power of Tapestry and improving performance.</p><h1 id="Tapestry
Tutorial-GettingTheTutorialSource">Getting The Tutorial Source</h1><p>The
source code for the Tapestry tutorial is available on <a shape="rect"
class="external-link" href="https://github.com/hlship/tapestry5-tutorial"
>GitHub</a> (although you won't need it to complete the tutorial).</p><h1
id="TapestryTutorial-TimetoBegin">Time to Begin</h1><p>Okay, enough background.
Now let's get started on the tutorial: <a shape="rect"
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a></p><p> </p></div>
</div>
<div class="clearer"></div>