Modified: websites/production/tapestry/content/limitations.html
==============================================================================
--- websites/production/tapestry/content/limitations.html (original)
+++ websites/production/tapestry/content/limitations.html Fri Feb 28 18:18:17
2025
@@ -155,11 +155,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="Limitations-Limitations">Limitations</h1><h2
id="Limitations-Contents">Contents</h2><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1740593670020 {padding: 0px;}
-div.rbtoc1740593670020 ul {margin-left: 0px;}
-div.rbtoc1740593670020 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740766470303 {padding: 0px;}
+div.rbtoc1740766470303 ul {margin-left: 0px;}
+div.rbtoc1740766470303 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1740593670020">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740766470303">
<ul class="toc-indentation"><li><a
href="#Limitations-HowdoIaddnewcomponentstoanexistingpagedynamically?">How do I
add new components to an existing page dynamically?</a></li><li><a
href="#Limitations-Whydoesn'tmyserviceimplementationreloadwhenIchangeit?">Why
doesn't my service implementation reload when I change it?</a></li><li><a
href="#Limitations-HowdoIrunmultipleTapestryapplicationsinthesamewebapplication?">How
do I run multiple Tapestry applications in the same web
application?</a></li></ul>
</div><h2
id="Limitations-HowdoIaddnewcomponentstoanexistingpagedynamically?">How do I
add new components to an existing page dynamically?</h2><p>The short answer
here is: <strong>you don't</strong>. The long answer here is <strong>you don't
have to, to get the behavior you desire</strong>.</p><p>One of Tapestry basic
values is high scalability: this is expressed in a number of ways, reflecting
scalability concerns within a single server, and within a cluster of
servers.</p><p>Although you code Tapestry pages and components as if they were
ordinary POJOs (<span>Plain Old Java Objects -- Tapestry does not require you
to extend any base classes or implement any special interfaces)</span><span>,
as deployed by Tapestry they are closer to a traditional servlet: a single
instance of each page services requests from multiple threads. Behind the
scenes, Tapestry transforms you code, rewriting it on the
fly.</span></p><p>What this means is that <em>any</em> incoming request must be
handled
by a <em>single page instance</em>. Therefore, Tapestry enforces the concept
of <strong>static structure, dynamic behavior</strong>.</p><p>Tapestry provides
quite a number of ways to vary what content is rendered, well beyond simple
conditionals and loops. It is possible to "drag in" components from other pages
when rendering a page (other FAQs will expand on this concept). The point is,
that although a Tapestry page's structure is very rigid, the order in which the
components of the page render does not have to be top to bottom.</p><h2
id="Limitations-Whydoesn'tmyserviceimplementationreloadwhenIchangeit?">Why
doesn't my service implementation reload when I change it?</h2><p>Main article:
<a href="service-implementation-reloading.html">Service Implementation
Reloading</a></p><p>Live service reloading has some limitations:</p><ul><li>The
service must define a service interface.</li><li>The service implementation
must be on the file system (not inside a JAR).</li><li>The implementatio
n must be instantiated by Tapestry, not inside code (even code inside a module
class).</li><li>The service must use the default <a
href="limitations.html">scope</a> (reloading of perthread scopes is not
supported).</li></ul><p>Consider the following example module:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
<pre><code class="language-java">public static void bind(ServiceBinder binder)
Modified: websites/production/tapestry/content/link-components-faq.html
==============================================================================
--- websites/production/tapestry/content/link-components-faq.html (original)
+++ websites/production/tapestry/content/link-components-faq.html Fri Feb 28
18:18:17 2025
@@ -155,11 +155,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="LinkComponentsFAQ-LinkComponents">Link Components</h1><p>Main Articles: <a
href="page-navigation.html">Page Navigation</a>, <a
href="component-parameters.html">Component Parameters</a></p><h2
id="LinkComponentsFAQ-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1740593633994 {padding: 0px;}
-div.rbtoc1740593633994 ul {margin-left: 0px;}
-div.rbtoc1740593633994 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740766434471 {padding: 0px;}
+div.rbtoc1740766434471 ul {margin-left: 0px;}
+div.rbtoc1740766434471 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1740593633994">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740766434471">
<ul class="toc-indentation"><li><a
href="#LinkComponentsFAQ-HowdoIaddqueryparameterstoaPageLinkorActionLink?">How
do I add query parameters to a PageLink or ActionLink?</a></li><li><a
href="#LinkComponentsFAQ-HowdoIcreateaLinkbacktothecurrentpagefromacomponent?">How
do I create a Link back to the current page from a component?</a></li></ul>
</div><h2
id="LinkComponentsFAQ-HowdoIaddqueryparameterstoaPageLinkorActionLink?">How do
I add query parameters to a PageLink or ActionLink?</h2><p>These components do
not have parameters to allow you to specify query parameters for the link; they
both allow you to specify a <em>context</em> (one or more values to encode into
the request path).</p><p>However, you can accomplish the same thing with a
little code and markup. For example, to create a link to another page and pass
a query parameter, you can replace your PageLink component with a standard
<code><a></code> tag:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
<pre><code class="language-xml"><a href="${profilePageLink}">Display
Profile (w/ full details)</a>
Modified: websites/production/tapestry/content/localization.html
==============================================================================
--- websites/production/tapestry/content/localization.html (original)
+++ websites/production/tapestry/content/localization.html Fri Feb 28 18:18:17
2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div
id="ConfluenceContent"><p></p><p><strong>Localization</strong> (aka L10n) is
all about getting the right text to the user, in the right language.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div
id="ConfluenceContent"><p></p><p><strong>Localization</strong> (aka L10n) is
all about getting the right text to the user, in the right language.</p><div
class="aui-label" style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/logging-in-tapestry.html
==============================================================================
--- websites/production/tapestry/content/logging-in-tapestry.html (original)
+++ websites/production/tapestry/content/logging-in-tapestry.html Fri Feb 28
18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p><strong>Logging in
Tapestry</strong> is based on the <a class="external-link"
href="http://www.slf4j.org/" rel="nofollow">Simple Logging Facade for Java
(SLF4J)</a>. You can think of SLF4J as a leaner, meaner replacement for <a
class="external-link"
href="http://commons.apache.org/logging/">commons-logging</a>.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p><strong>Logging in
Tapestry</strong> is based on the <a class="external-link"
href="http://www.slf4j.org/" rel="nofollow">Simple Logging Facade for Java
(SLF4J)</a>. You can think of SLF4J as a leaner, meaner replacement for <a
class="external-link"
href="http://commons.apache.org/logging/">commons-logging</a>.</p><div
class="aui-label" style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/logging.html
==============================================================================
--- websites/production/tapestry/content/logging.html (original)
+++ websites/production/tapestry/content/logging.html Fri Feb 28 18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div
id="ConfluenceContent"><p><strong>Logging</strong> involves the automatic
recording of progress as an application runs. Tapestry makes extensive use of
<a class="external-link" href="http://www.slf4j.org/" rel="nofollow">SLF4J</a>
to log details about the creation and operation of your page and component
classes.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div
id="ConfluenceContent"><p><strong>Logging</strong> involves the automatic
recording of progress as an application runs. Tapestry makes extensive use of
<a class="external-link" href="http://www.slf4j.org/" rel="nofollow">SLF4J</a>
to log details about the creation and operation of your page and component
classes.</p><div class="aui-label" style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/maven-support-faq.html
==============================================================================
--- websites/production/tapestry/content/maven-support-faq.html (original)
+++ websites/production/tapestry/content/maven-support-faq.html Fri Feb 28
18:18:17 2025
@@ -155,11 +155,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="MavenSupportFAQ-MavenSupport">Maven Support</h1><h2
id="MavenSupportFAQ-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1740593782996 {padding: 0px;}
-div.rbtoc1740593782996 ul {margin-left: 0px;}
-div.rbtoc1740593782996 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740766583873 {padding: 0px;}
+div.rbtoc1740766583873 ul {margin-left: 0px;}
+div.rbtoc1740766583873 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1740593782996">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740766583873">
<ul class="toc-indentation"><li><a
href="#MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why
do Maven project names and other details show up in my pages?</a></li></ul>
</div><h2
id="MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why
do Maven project names and other details show up in my pages?</h2><p>Tapestry
and maven both use the same syntax for dynamic portions of files: the
<code>${...</code>} syntax. When Maven is copying resources from
<code>src/main/resources</code>, and when filtering is <em>enabled</em> (which
is not the default), then any expansions in <em>Tapestry templates</em> that
match against Maven project properties are substituted. If you look at the
deployed application you'll see that <code>${name</code>} is gone, replaced
with your project's name!</p><p>The solution is to update your
<code>pom.xml</code> and ignore any .tml files when copying and
filtering:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>pom.xml
(partial)</b></div><div class="codeContent panelContent pdl">
<pre><code class="language-xml"> <resource>
Modified: websites/production/tapestry/content/news.html
==============================================================================
--- websites/production/tapestry/content/news.html (original)
+++ websites/production/tapestry/content/news.html Fri Feb 28 18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent">
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div id="bar"><p> <strong>We think you will love Tapestry!</strong> Give us 20
minutes and <strong><a href="tapestry-tutorial.html">follow our
tutorial</a></strong>.</p></div><div><h2 id="News-News">News <a
href="https://cwiki.apache.org/confluence/createrssfeed.action?types=blogpost&spaces=TAPESTRY&title=Apache+Tapestry+News+RSS+Feed&labelString%3D&sort=created&maxResults=10&timeSpan=12&confirm=Create&showContent=true&showDiff=false"><span
class="confluence-embedded-file-wrapper"><img
class="confluence-embedded-image" draggable="false"
src="news.data/Feed-icon.gif"></span></a></h2><p>
+ <div id="ConfluenceContent"><div id="bar"><p>
<strong>We think you will love Tapestry!</strong> Give us 20 minutes and
<strong><a href="tapestry-tutorial.html">follow our
tutorial</a></strong>.</p></div><div><h2 id="News-News">News <a
href="https://cwiki.apache.org/confluence/createrssfeed.action?types=blogpost&spaces=TAPESTRY&title=Apache+Tapestry+News+RSS+Feed&labelString%3D&sort=created&maxResults=10&timeSpan=12&confirm=Create&showContent=true&showDiff=false"><span
class="confluence-embedded-file-wrapper"><img
class="confluence-embedded-image" draggable="false"
src="news.data/Feed-icon.gif"></span></a></h2><p>
Modified: websites/production/tapestry/content/operation-tracker.html
==============================================================================
--- websites/production/tapestry/content/operation-tracker.html (original)
+++ websites/production/tapestry/content/operation-tracker.html Fri Feb 28
18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>Have you ever hit
an error in some code and been faced with a giant stack trace, and no clue what
that means?  Us too. We wished there was a way for the exception to
describe the path to the error not (just) in terms of which methods called
which methods, but what <em>operations</em> triggered what other
operations. That's the OperationTracker.</p><p>The operation tracker is another
aspect of Tapestry's commitment to feedback.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>Have you ever hit
an error in some code and been faced with a giant stack trace, and no clue what
that means?  Us too. We wished there was a way for the exception to
describe the path to the error not (just) in terms of which methods called
which methods, but what <em>operations</em> triggered what other
operations. That's the OperationTracker.</p><p>The operation tracker is another
aspect of Tapestry's commitment to feedback.</p><div class="aui-label"
style="float:right" title="Related Articles">
Modified:
websites/production/tapestry/content/overriding-exception-reporting.html
==============================================================================
--- websites/production/tapestry/content/overriding-exception-reporting.html
(original)
+++ websites/production/tapestry/content/overriding-exception-reporting.html
Fri Feb 28 18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>One of Tapestry's
best features is its comprehensive exception reporting. The level of detail is
impressive and useful.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>One of Tapestry's
best features is its comprehensive exception reporting. The level of detail is
impressive and useful.</p><div class="aui-label" style="float:right"
title="Related Articles">
Modified:
websites/production/tapestry/content/page-and-component-classes-faq.html
==============================================================================
--- websites/production/tapestry/content/page-and-component-classes-faq.html
(original)
+++ websites/production/tapestry/content/page-and-component-classes-faq.html
Fri Feb 28 18:18:17 2025
@@ -155,11 +155,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="PageAndComponentClassesFAQ-PageAndComponentClasses">Page And Component
Classes</h1><p>Main article: <a href="component-classes.html">Component
Classes</a></p><h2
id="PageAndComponentClassesFAQ-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1740593565728 {padding: 0px;}
-div.rbtoc1740593565728 ul {margin-left: 0px;}
-div.rbtoc1740593565728 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740766366188 {padding: 0px;}
+div.rbtoc1740766366188 ul {margin-left: 0px;}
+div.rbtoc1740766366188 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1740593565728">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740766366188">
<ul class="toc-indentation"><li><a
href="#PageAndComponentClassesFAQ-What'sthedifferencebetweenapageandacomponent?">What's
the difference between a page and a component?</a></li><li><a
href="#PageAndComponentClassesFAQ-HowdoIstoremypageclassesinadifferentpackage?">How
do I store my page classes in a different package?</a></li><li><a
href="#PageAndComponentClassesFAQ-Whydomyinstancevariableshavetobeprivate?">Why
do my instance variables have to be private?</a></li><li><a
href="#PageAndComponentClassesFAQ-Whydon'tmyinformalparametersshowupintherenderedmarkup?">Why
don't my informal parameters show up in the rendered markup?</a></li><li><a
href="#PageAndComponentClassesFAQ-WhydoIgetjava.lang.LinkageErrorwhenIinvokepublicmethodsofmypageclasses?">Why
do I get java.lang.LinkageError when I invoke public methods of my page
classes?</a></li><li><a
href="#PageAndComponentClassesFAQ-Whichisbetter,usingmagicmethodnames(i.e.,beginRender())orannotations(i.e.BeginRender)?">Which
is better, using
magic method names (i.e., beginRender()) or annotations (i.e.
BeginRender)?</a></li><li><a
href="#PageAndComponentClassesFAQ-WhydoIhavetoinjectapage?Whycan'tIjustcreateoneusingnew?">Why
do I have to inject a page? Why can't I just create one using
new?</a></li></ul>
</div><h2
id="PageAndComponentClassesFAQ-What'sthedifferencebetweenapageandacomponent?">What's
the difference between a page and a component?</h2><p>There's very little
difference between the two. Pages classes must be in the
<em>root-package</em>.<code>pages</code> package; components must be in the
<em>root-package</em>.<code>components</code>. Pages may provide event handlers
for certain page-specific events (such as activate and passivate). Components
may have parameters.</p><p>Other than that, they are more equal than they are
different. They may have templates or may render themselves in code (pages
usually have a template, components are more likely to render only in
code).</p><p>The major difference is that Tapestry page templates may be stored
in the web context directory, as if they were static files (they can't be
accessed from the client however; a specific rule prevents access to files with
the <code>.tml</code> extension).</p><div class="confluence-information-macro co
nfluence-information-macro-warning"><span class="aui-icon aui-icon-small
aui-iconfont-error confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>It is possible that this feature
may be removed in a later release. It is preferred that page templates be
stored on the classpath, like component templates.</p></div></div><h2
id="PageAndComponentClassesFAQ-HowdoIstoremypageclassesinadifferentpackage?">How
do I store my page classes in a different package?</h2><p>Tapestry is very
rigid here; you can't. Page classes must go in
<em>root-package</em>.<code>pages</code>, component classes in
<em>root-package</em>.<code>components</code>, etc.</p><p>You are allowed to
create sub-packages, to help organize your code better and more logically. For
example, you might have
<em>root-package</em>.<code>pages.account.ViewAccount</code>, which would have
the page name "account/viewaccount". (<span>Tapestry would also create an alias
"account/view", by stripping of
f the redundant "account" suffix. Either name is equally valid in your code,
and Tapestry will use the shorter name, "account/view" in
URLs.)</span></p><p>In addition, it is possible to define additional root
packages for the application:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre><code class="language-java">public static void
contributeComponentClassResolver(Configuration<LibraryMapping>
configuration) {
@@ -194,17 +194,16 @@ public class DBImage
-<span class="gliffy-container" id="gliffy-container-23527573-1636"
data-fullwidth="750" data-size="L" data-ceoid="23335008"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Class Loaders">
+<span class="gliffy-container" id="gliffy-container-23527573-6843"
data-fullwidth="750" data-size="L" data-ceoid="23335008"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Class Loaders">
- <map id="gliffy-map-23527573-2306" name="gliffy-map-23527573-2306"></map>
+ <map id="gliffy-map-23527573-2512" name="gliffy-map-23527573-2512"></map>
- <img class="gliffy-image" id="gliffy-image-23527573-1636" width="750"
height="425" data-full-width="750" data-full-height="425"
src="https://cwiki.apache.org/confluence/download/attachments/23335008/Class%20Loaders.png?version=4&modificationDate=1283534469000&api=v2"
alt="Class Loaders" usemap="#gliffy-map-23527573-2306">
+ <img class="gliffy-image" id="gliffy-image-23527573-6843" width="750"
height="425" data-full-width="750" data-full-height="425"
src="https://cwiki.apache.org/confluence/download/attachments/23335008/Class%20Loaders.png?version=4&modificationDate=1283534469000&api=v2"
alt="Class Loaders" usemap="#gliffy-map-23527573-2512">
- <map class="gliffy-dynamic" id="gliffy-dynamic-map-23527573-1636"
name="gliffy-dynamic-map-23527573-1636"></map>
+ <map class="gliffy-dynamic" id="gliffy-dynamic-map-23527573-6843"
name="gliffy-dynamic-map-23527573-6843"></map>
</span>
- </p><div class="aui-message shadowed closeable"><p class="title"><span
class="gliffy-aui-icon"></span>ERROR</p><p>Gliffy is unlicensed. Please
<strong><a
href="https://cwiki.apache.org/confluence/plugins/servlet/upm#manage/com.gliffy.integration.confluence">install
a license</a></strong> to draw diagrams in your wiki.</p></div>
-<p>In a Tapestry application, most application classes are loaded from the
middle class loader. Additional class loaders are used to support live service
reloading, and live component reloading (along with component class
transformation).</p><p>When a page or component is passed as a parameter to a
service, a failure occurs (how it is reported varies in different JDK releases)
because of the class mismatch.</p><p>The solution is to define an interface
with the methods that the service will invoke on the page or component
instance. The service will expect an object implementing the interface (and
doesn't care what class loader loaded the implementing class).</p><p>Just be
sure to put the interface class in a non-controlled package, such as your
application's <em>root-package</em> (and <strong>not</strong>
<em>root-package</em>.<code>pages</code>).</p><h2
id="PageAndComponentClassesFAQ-Whichisbetter,usingmagicmethodnames(i.e.,beginRender())orannotations(i.e.BeginRender)?">Which
is bet
ter, using magic method names (i.e., <code>beginRender()</code>) or
annotations (i.e. <code>BeginRender</code>)?</h2><p>There is no single best
way; this is where your taste may vary. Historically, the annotations came
first, and the method naming conventions came later.</p><p>The advantage of
using the method naming conventions is that the method names are more concise,
which fewer characters to type, and fewer classes to import.</p><p>The main
disadvantage of the method naming conventions is that the method names are not
meaningful. <code>onSuccessFromLoginForm()</code> is a less meaningful name
than <code>storeUserCredentialsAndReturnToProductsPage()</code>, for
example.</p><p>The second disadvantage is you are more susceptible to
off-by-a-character errors. For example, <code>onSucessFromLoginForm()</code>
will <em>never</em> be called because the event name is misspelled; this would
not happen using the annotation approach:</p><div class="code panel pdl"
style="border-width: 1px
;"><div class="codeContent panelContent pdl">
+</p><p>In a Tapestry application, most application classes are loaded from the
middle class loader. Additional class loaders are used to support live service
reloading, and live component reloading (along with component class
transformation).</p><p>When a page or component is passed as a parameter to a
service, a failure occurs (how it is reported varies in different JDK releases)
because of the class mismatch.</p><p>The solution is to define an interface
with the methods that the service will invoke on the page or component
instance. The service will expect an object implementing the interface (and
doesn't care what class loader loaded the implementing class).</p><p>Just be
sure to put the interface class in a non-controlled package, such as your
application's <em>root-package</em> (and <strong>not</strong>
<em>root-package</em>.<code>pages</code>).</p><h2
id="PageAndComponentClassesFAQ-Whichisbetter,usingmagicmethodnames(i.e.,beginRender())orannotations(i.e.BeginRender)?">Which
is
better, using magic method names (i.e., <code>beginRender()</code>) or
annotations (i.e. <code>BeginRender</code>)?</h2><p>There is no single best
way; this is where your taste may vary. Historically, the annotations came
first, and the method naming conventions came later.</p><p>The advantage of
using the method naming conventions is that the method names are more concise,
which fewer characters to type, and fewer classes to import.</p><p>The main
disadvantage of the method naming conventions is that the method names are not
meaningful. <code>onSuccessFromLoginForm()</code> is a less meaningful name
than <code>storeUserCredentialsAndReturnToProductsPage()</code>, for
example.</p><p>The second disadvantage is you are more susceptible to
off-by-a-character errors. For example, <code>onSucessFromLoginForm()</code>
will <em>never</em> be called because the event name is misspelled; this would
not happen using the annotation approach:</p><div class="code panel pdl"
style="border-width:
1px;"><div class="codeContent panelContent pdl">
<pre><code class="language-java"> @OnEvent(value=EventConstants.SUCCESS,
component="loginForm")
Object storeUserCredentialsAndReturnToProductsPage()
{
Modified: websites/production/tapestry/content/page-life-cycle.html
==============================================================================
--- websites/production/tapestry/content/page-life-cycle.html (original)
+++ websites/production/tapestry/content/page-life-cycle.html Fri Feb 28
18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><div
class="confluence-information-macro confluence-information-macro-note"><span
class="aui-icon aui-icon-small aui-iconfont-warning
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This is an advanced topic. Most
users won't ever need to know anything about the page life
cycle.</p></div></div><p>In Tapestry, you are free to develop your presentation
objects, page and components classes, as ordinary objects, complete with
instance variables and so forth.</p><p>This is somewhat revolutionary in terms
of web development in Java. By comparison, using traditional servlets, or
Struts, your presentation objects (Servlets, or Struts Actions, or the
equivalent in other frameworks) are <em>stateless singletons</em>. That is, a
<em>single</em> instance is created, and all incoming requests are threaded
through that single instance. Because multiple requests are handled by many
different threads
, this means that the singleton's instance variables are useless ... any value
written into an instance variable would immediately be overwritten by a
different thread. Thus, it is necessary to use the Servlet API's
HttpServletRequest object to store per-request data, and the HttpSession object
to store data between requests.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><div
class="confluence-information-macro confluence-information-macro-note"><span
class="aui-icon aui-icon-small aui-iconfont-warning
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This is an advanced topic. Most
users won't ever need to know anything about the page life
cycle.</p></div></div><p>In Tapestry, you are free to develop your presentation
objects, page and components classes, as ordinary objects, complete with
instance variables and so forth.</p><p>This is somewhat revolutionary in terms
of web development in Java. By comparison, using traditional servlets, or
Struts, your presentation objects (Servlets, or Struts Actions, or the
equivalent in other frameworks) are <em>stateless singletons</em>. That is, a
<em>single</em> instance is created, and all incoming requests are threaded
through that single instance. Because multiple requests are handled by many
different threads
, this means that the singleton's instance variables are useless ... any value
written into an instance variable would immediately be overwritten by a
different thread. Thus, it is necessary to use the Servlet API's
HttpServletRequest object to store per-request data, and the HttpSession object
to store data between requests.</p><div class="aui-label" style="float:right"
title="Related Articles">
Modified: websites/production/tapestry/content/page-navigation.html
==============================================================================
--- websites/production/tapestry/content/page-navigation.html (original)
+++ websites/production/tapestry/content/page-navigation.html Fri Feb 28
18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent">
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><div class="aui-label"
style="float:right" title="Related Articles">
@@ -252,11 +244,11 @@
<p>In essence, a Tapestry application is a number of related pages, working
together. To some degree, each page is like an application unto
itself.</p><p>Any individual request will be targeted at a single page.
Requests come in two forms: </p><ul><li><em>component event</em> requests
target a specific component on a specific page, triggering an event within that
component</li><li><em>render</em> requests target a specific page, and stream
the HTML markup for that page back to the client</li></ul><p>This dichotomy
between component event requests and render requests alleviates a number of
problems in traditional web applications related to the browser back button, or
to the user hitting the refresh button in their browser.</p><h3
id="PageNavigation-Contents">Contents</h3><h2
id="PageNavigation-Contents|RelatedArticlesLogicalPageNameShortening"><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1740593852198 {padding: 0px;}
-div.rbtoc1740593852198 ul {margin-left: 0px;}
-div.rbtoc1740593852198 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740766652566 {padding: 0px;}
+div.rbtoc1740766652566 ul {margin-left: 0px;}
+div.rbtoc1740766652566 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></h2><div class="toc-macro rbtoc1740593852198">
+/*]]>*/</style></h2><div class="toc-macro rbtoc1740766652566">
<ul class="toc-indentation"><li><a
href="#PageNavigation-Contents|RelatedArticlesLogicalPageNameShortening">Logical
Page Name Shortening</a></li><li><a
href="#PageNavigation-ComponentEventRequests&Responses">Component Event
Requests & Responses</a>
<ul class="toc-indentation"><li><a href="#PageNavigation-1.Nullresponse">1.
Null response</a></li><li><a href="#PageNavigation-2.Stringresponse">2. String
response</a></li><li><a href="#PageNavigation-3.Classresponse">3. Class
response</a></li><li><a href="#PageNavigation-4.Pageresponse">4. Page
response</a></li><li><a href="#PageNavigation-5.HttpError">5.
HttpError</a></li><li><a href="#PageNavigation-6.Linkresponse">6. Link
response</a></li><li><a href="#PageNavigation-7.Streamresponse">7. Stream
response</a></li><li><a href="#PageNavigation-8.URLresponse">8. URL
response</a></li><li><a href="#PageNavigation-9.Objectresponse">9. Object
response</a></li></ul>
</li><li><a href="#PageNavigation-PageRenderRequests">Page Render
Requests</a></li><li><a href="#PageNavigation-PageActivation">Page
Activation</a></li><li><a href="#PageNavigation-PageNavigationPatterns">Page
Navigation Patterns</a>
Modified: websites/production/tapestry/content/parameter-type-coercion.html
==============================================================================
--- websites/production/tapestry/content/parameter-type-coercion.html (original)
+++ websites/production/tapestry/content/parameter-type-coercion.html Fri Feb
28 18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p><strong
style="text-align: justify;">Type Coercion</strong><span style="color:
rgb(0,0,0);"> is the conversion of one type of object to a new object of a
different type with similar content. Tapestry frequently must coerce objects
from one type to another. A common example is the coercion of a string into an
integer or a double.</span></p><p>See <a href="type-coercion.html">Type
Coercer Service</a> for the list of build-in coercions.</p><h2
id="ParameterTypeCoercion-ParameterTypeCoercions">Parameter Type Coercions</h2>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p><strong
style="text-align: justify;">Type Coercion</strong><span style="color:
rgb(0,0,0);"> is the conversion of one type of object to a new object of a
different type with similar content. Tapestry frequently must coerce objects
from one type to another. A common example is the coercion of a string into an
integer or a double.</span></p><p>See <a href="type-coercion.html">Type
Coercer Service</a> for the list of build-in coercions.</p><h2
id="ParameterTypeCoercion-ParameterTypeCoercions">Parameter Type
Coercions</h2><div class="aui-label" style="float:right" title="Related
Articles">
Modified: websites/production/tapestry/content/performance-and-clustering.html
==============================================================================
--- websites/production/tapestry/content/performance-and-clustering.html
(original)
+++ websites/production/tapestry/content/performance-and-clustering.html Fri
Feb 28 18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>Tapestry has a
great <strong>performance</strong> story to tell. It's designed to take
advantage of the speed of the modern JVM: no reflection, built to support a
high level of concurrency without contention, and clean, lightweight code
paths. In addition, there is built-in integrated GZIP content compression,
far-future expires headers on static resources, JavaScript aggregation and
minification, and an intentionally lightweight use of the HTTPSession. The
result is a blistering fast framework. See <a class="external-link"
href="http://tapestry.apache.org/2011/06/13/tapestrys-performance-tested.html">Tapestry's
Performance Tested</a> for some objective numbers.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>Tapestry has a
great <strong>performance</strong> story to tell. It's designed to take
advantage of the speed of the modern JVM: no reflection, built to support a
high level of concurrency without contention, and clean, lightweight code
paths. In addition, there is built-in integrated GZIP content compression,
far-future expires headers on static resources, JavaScript aggregation and
minification, and an intentionally lightweight use of the HTTPSession. The
result is a blistering fast framework. See <a class="external-link"
href="http://tapestry.apache.org/2011/06/13/tapestrys-performance-tested.html">Tapestry's
Performance Tested</a> for some objective numbers.</p><div class="aui-label"
style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/persistent-page-data.html
==============================================================================
--- websites/production/tapestry/content/persistent-page-data.html (original)
+++ websites/production/tapestry/content/persistent-page-data.html Fri Feb 28
18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><div
class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>The use of the term "persistence"
here refers to <em>page-level</em> persistence, NOT database
persistence.</p></div></div><p>Most instance variables in Tapestry are
automatically cleared at the end of each request. This is important, as it
pertains to how Tapestry pages are shared, over time, by many users.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><div
class="confluence-information-macro
confluence-information-macro-information"><span class="aui-icon aui-icon-small
aui-iconfont-info confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>The use of the term "persistence"
here refers to <em>page-level</em> persistence, NOT database
persistence.</p></div></div><p>Most instance variables in Tapestry are
automatically cleared at the end of each request. This is important, as it
pertains to how Tapestry pages are shared, over time, by many users.</p><div
class="aui-label" style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/pipelinebuilder-service.html
==============================================================================
--- websites/production/tapestry/content/pipelinebuilder-service.html (original)
+++ websites/production/tapestry/content/pipelinebuilder-service.html Fri Feb
28 18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>The
<strong>PipelineBuilder Service</strong> is a service used to create pipelines,
also known as <em>filter chains</em>. An example of this is the Filter and
FilterChain interfaces inside the Servlet API.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>The
<strong>PipelineBuilder Service</strong> is a service used to create pipelines,
also known as <em>filter chains</em>. An example of this is the Filter and
FilterChain interfaces inside the Servlet API.</p><div class="aui-label"
style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/principles.html
==============================================================================
--- websites/production/tapestry/content/principles.html (original)
+++ websites/production/tapestry/content/principles.html Fri Feb 28 18:18:17
2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent">
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><div class="aui-label"
style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/property-expressions.html
==============================================================================
--- websites/production/tapestry/content/property-expressions.html (original)
+++ websites/production/tapestry/content/property-expressions.html Fri Feb 28
18:18:17 2025
@@ -154,15 +154,7 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>Tapestry uses
<strong>property expressions</strong> to move data between components. Property
expressions are the basis of the <a href="component-parameters.html">component
parameters</a> and <a href="component-templates.html">template
expansions</a>.</p>
-
-<div class="adaptavist-psl-unlicensed-banner adaptavist-psl-warning
adaptavist-psl-js">
- <b>This page contains macros or features from a plugin which requires a
valid license.</b>
-
- <p>You will need to contact your administrator.</p>
-
-</div>
-<div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>Tapestry uses
<strong>property expressions</strong> to move data between components. Property
expressions are the basis of the <a href="component-parameters.html">component
parameters</a> and <a href="component-templates.html">template
expansions</a>.</p><div class="aui-label" style="float:right" title="Related
Articles">
Modified: websites/production/tapestry/content/release-notes-50.html
==============================================================================
--- websites/production/tapestry/content/release-notes-50.html (original)
+++ websites/production/tapestry/content/release-notes-50.html Fri Feb 28
18:18:17 2025
@@ -155,11 +155,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><p>This is the
consolidated list of changes between Tapestry versions 5.0.3 and 5.0.19. Before
upgrading, be sure to review the <a href="how-to-upgrade.html">How to
Upgrade</a> instructions.</p><p><strong>Contents</strong></p><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1740593605748 {padding: 0px;}
-div.rbtoc1740593605748 ul {margin-left: 0px;padding-left: 5px;}
-div.rbtoc1740593605748 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740766406444 {padding: 0px;}
+div.rbtoc1740766406444 ul {margin-left: 0px;padding-left: 5px;}
+div.rbtoc1740766406444 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1740593605748">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740766406444">
<ul class="toc-indentation"><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.19">Tapestry Version
5.0.19</a></li><li><a href="#ReleaseNotes5.0-TapestryVersion5.0.18">Tapestry
Version 5.0.18</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.17">Tapestry Version
5.0.17</a></li><li><a href="#ReleaseNotes5.0-TapestryVersion5.0.16">Tapestry
Version 5.0.16</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.15">Tapestry Version
5.0.15</a></li><li><a href="#ReleaseNotes5.0-TapestryVersion5.0.14">Tapestry
Version 5.0.14</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.13">Tapestry Version
5.0.13</a></li><li><a href="#ReleaseNotes5.0-TapestryVersion5.0.12">Tapestry
Version 5.0.12</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.11">Tapestry Version
5.0.11</a></li><li><a href="#ReleaseNotes5.0-TapestryVersion5.0.10">Tapestry
Version 5.0.10</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.9">Tapestry Version
5.0.9</a></li><li><a href="#ReleaseNotes5.0-Tapest
ryVersion5.0.8">Tapestry Version 5.0.8</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.7">Tapestry Version
5.0.7</a></li><li><a href="#ReleaseNotes5.0-TapestryVersion5.0.6">Tapestry
Version 5.0.6</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.5">Tapestry Version
5.0.5</a></li><li><a href="#ReleaseNotes5.0-TapestryVersion5.0.4">Tapestry
Version 5.0.4</a></li><li><a
href="#ReleaseNotes5.0-TapestryVersion5.0.3">Tapestry Version
5.0.3</a></li></ul>
[... 3 lines stripped ...]