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
Sun Apr 26 21:22:55 2020
@@ -85,20 +85,22 @@
+
+
<h3>Related Articles</h3>
<ul class="content-by-label"><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="error-page-recipe.html">Error Page Recipe</a>
+ <a
href="overriding-exception-reporting.html">Overriding Exception Reporting</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="specific-errors-faq.html">Specific Errors
FAQ</a>
@@ -107,10 +109,19 @@
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a
href="overriding-exception-reporting.html">Overriding Exception Reporting</a>
+ <a href="error-page-recipe.html">Error Page Recipe</a>
+
+
+ </div>
+ </li><li>
+ <div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
+
+ <div class="details">
+ <a href="runtime-exceptions.html">Runtime
Exceptions</a>
</div>
@@ -119,13 +130,13 @@
<p>Of course, one of the first questions anyone asks is "How do I turn it
off?" This exception reporting is very helpful for developers but its easy to
see it as terrifying for potential users. Catching runtime exceptions can be a
very useful way of handling rarely occurring exceptions even in production, and
there's no reason to throw away Tapestry's default error reporting just to
handle a few specific exceptions. From version 5.4 (for previous versions, the
same functionality is available as a <a class="external-link"
href="http://www.tynamo.org/tapestry-exceptionpage+guide/"
rel="nofollow">third-party module tapestry-exceptionpage</a>), you can
contribute exception handles and/or exception pages for specific exception
types. Refer back to <a href="runtime-exceptions.html">Runtime
Exceptions</a> page for more information. Read on if you want to completely
replace Tapestry's default exception handling.</p><h2
id="OverridingExceptionReporting-Version1:ReplacingtheExceptionRe
portPage">Version 1: Replacing the Exception Report Page</h2><p>Let's start
with a page that fires an exception from an event handler method.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width:
1px;"><b>ActionFail.tml</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"> <html
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd" t:type="layout"
title="Action Fail">
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"> <html
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd" t:type="layout"
title="Action Fail">
<p>
<t:actionlink t:id="fail" class="btn btn-large
btn-warning">Click for Exception</t:actionlink>
</p>
</html></pre>
</div></div><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Index.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">package com.example.newapp.pages;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">package
com.example.newapp.pages;
public class ActionFail {
void onActionFromFail() {
@@ -134,7 +145,7 @@ public class ActionFail {
}
</pre>
</div></div><p>With production mode disabled, clicking the link displays the
default exception report page:</p><p> </p><p><span
class="confluence-embedded-file-wrapper image-center-wrapper
confluence-embedded-manual-size"><img class="confluence-embedded-image
confluence-content-image-border image-center" width="500"
src="overriding-exception-reporting.data/actionfail_-_top.png"></span></p><p><span
class="confluence-embedded-file-wrapper image-center-wrapper
confluence-embedded-manual-size"><img class="confluence-embedded-image
confluence-content-image-border image-center" width="500"
src="overriding-exception-reporting.data/Application_Exception.png"></span></p><p> </p><p>The
easy way to override the exception report is to provide an ExceptionReport
page that overrides the one provided with the framework.</p><p>This is as easy
as providing a page named "ExceptionReport". It must implement the <a
class="external-link" href="http://tapestry.apache.org/tapestry5/apidocs/org/
apache/tapestry5/services/ExceptionReporter.html">ExceptionReporter</a>
interface.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>ExceptionReport.tml</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><html t:type="layout" title="Exception"
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"><html t:type="layout"
title="Exception"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
@@ -153,7 +164,7 @@ public class ActionFail {
</html>
</pre>
</div></div><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>ExceptionReport.java</b></div><div class="codeContent panelContent
pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">package com.example.newapp.pages;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">package
com.example.newapp.pages;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.services.ExceptionReporter;
@@ -173,7 +184,7 @@ public class ExceptionReport implements
}
</pre>
</div></div><p>The end result is a customized exception report
page.</p><p> </p><p><span class="confluence-embedded-file-wrapper
image-center-wrapper confluence-embedded-manual-size"><img
class="confluence-embedded-image confluence-content-image-border image-center"
width="500"
src="overriding-exception-reporting.data/customer_exception_report_-_open_1.png"></span></p><h2
id="OverridingExceptionReporting-Version2:OverridingtheRequestExceptionHandler">Version
2: Overriding the RequestExceptionHandler</h2><p>The previous example will
display a link back to the Index page of the application. Another alternative
is to display the error <on> the Index page. This requires a different
approach: overriding the service responsible for reporting request
exceptions.</p><p>The service <a class="external-link"
href="http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/services/RequestExceptionHandler.html">RequestExceptionHandler</a>
is responsible for this.</p><p>By rep
lacing the default implementation of this service with our own implementation,
we can take control over exactly what happens when a request exception
occurs.</p><p>We'll do this in two steps. First, we'll extend the Index page to
serve as an ExceptionReporter. Second, we'll override the default
RequestExceptionHandler to use the Index page instead of the ExceptionReport
page. Of course, this is just one approach.</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Index.tml (partial)</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"> <t:if test="message">
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"> <t:if test="message">
<div class="panel panel-danger">
<div class="panel-heading">An exception has occurred.</div>
<div class="panel-body">
@@ -182,7 +193,7 @@ public class ExceptionReport implements
</div>
</t:if></pre>
</div></div><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Index.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class Index implements ExceptionReporter
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public class Index
implements ExceptionReporter
{
@Property
private String message;
@@ -199,7 +210,7 @@ public class ExceptionReport implements
...
}</pre>
</div></div><p>The above defines a new property, message, on the Index page.
The @Persist annotation indicates that values assigned to the field will
persist from one request to another. The use of FLASH for the persistence
strategy indicates that the value will be used until the next time the page
renders, then the value will be discarded.</p><p>The message property is set
from the thrown runtime exception.</p><p>The remaining changes take place
inside AppModule.</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>AppModule.java (partial)</b></div><div class="codeContent panelContent
pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public RequestExceptionHandler
buildAppRequestExceptionHandler(
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default"> public
RequestExceptionHandler buildAppRequestExceptionHandler(
final Logger logger,
final ResponseRenderer renderer,
final ComponentSource componentSource)
@@ -229,7 +240,7 @@ public class ExceptionReport implements
}
</pre>
</div></div><p>First we define the new service using a service builder method.
This is an alternative to the <code>bind()</code> method; we define the
service, its interface type (the return type of the method) and the service id
(the part that follows "build" is the method name) and provide the
implementation inline. A service builder method must return the service
implementation, here implemented as an inner class.</p><p>The Logger resource
that is passed into the builder method is the Logger appropriate for the
service. ResponseRenderer and ComponentSource are two services defined by
Tapestry.</p><p>With this in place, there are now two different services that
implement the RequestExceptionHandler interface: the default one built into
Tapestry (whose service id is "RequestExceptionHandler") and the new one
defined in this module, "AppRequestExceptionHandler"). Without a little more
work, Tapestry will be unable to determine which one to use when an exception
does occur.</p><p>Tap
estry has a pipeline for resolving injected dependencies; the ServiceOverride
service is one part of that pipeline. Contributions to it are used to override
an existing service, when the injection is exclusively by type.</p><p>Here we
inject the AppRequestExceptionHandler service and contribute it as the override
for type RequestExceptionHandler. The @Local annotation is used to select the
RequestHandler service defined by this module, AppModule. Once contributed into
ServiceOverride, it becomes the default service injected throughout the
Registry.</p><p>This finally brings us to the point where we can see the
result:</p><p> </p><p><span class="confluence-embedded-file-wrapper
image-center-wrapper confluence-embedded-manual-size"><img
class="confluence-embedded-image confluence-content-image-border image-center"
height="375" width="500"
src="overriding-exception-reporting.data/index_as_excepton_report.png"></span></p><h2
id="OverridingExceptionReporting-Version3:DecoratingtheRe
questExceptionHandler">Version 3: Decorating the
RequestExceptionHandler</h2><p>A third option is available: we don't define a
<em>new</em> service, but instead <em>decorate</em> the existing
RequestExceptionHandler service. This approach means we don't have to make a
contribution to the ServiceOverride service.</p><p>Service decoration is a
powerful facility of Tapestry that is generally used to "wrap" an existing
service with an interceptor that provides new functionality such as logging,
security, transaction management or other cross-cutting concerns. The
interceptor is an object that implements the same interface as the service
being decorated, and usually delegates method invocations to it.</p><p>However,
there's no requirement that an interceptor for a service actually invoke
methods on the service; here we contribute a new implementation that
<em>replaces</em> the original:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" styl
e="border-bottom-width: 1px;"><b>AppModule.java (partial)</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public RequestExceptionHandler
decorateRequestExceptionHandler(
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default"> public
RequestExceptionHandler decorateRequestExceptionHandler(
final Logger logger,
final ResponseRenderer renderer,
final ComponentSource componentSource,
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
Sun Apr 26 21:22:55 2020
@@ -78,11 +78,11 @@
<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.rbtoc1587536392631 {padding: 0px;}
-div.rbtoc1587536392631 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536392631 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587936040458 {padding: 0px;}
+div.rbtoc1587936040458 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587936040458 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536392631">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587936040458">
<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 class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: true; theme: Default" data-theme="Default">public static void
contributeComponentClassResolver(Configuration<LibraryMapping>
configuration) {
@@ -117,13 +117,13 @@ public class DBImage
-<span class="gliffy-container" id="gliffy-container-23527573-1569"
data-fullwidth="750" data-ceoid="23335008"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Class Loaders">
+<span class="gliffy-container" id="gliffy-container-23527573-791"
data-fullwidth="750" data-ceoid="23335008"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Class Loaders">
- <map id="gliffy-map-23527573-3291" name="gliffy-map-23527573-3291"></map>
+ <map id="gliffy-map-23527573-8383" name="gliffy-map-23527573-8383"></map>
- <img class="gliffy-image" id="gliffy-image-23527573-1569" 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-3291">
+ <img class="gliffy-image" id="gliffy-image-23527573-791" 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-8383">
- <map class="gliffy-dynamic" id="gliffy-dynamic-map-23527573-1569"
name="gliffy-dynamic-map-23527573-1569"></map>
+ <map class="gliffy-dynamic" id="gliffy-dynamic-map-23527573-791"
name="gliffy-dynamic-map-23527573-791"></map>
</span>
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 Sun Apr 26
21:22:55 2020
@@ -76,20 +76,22 @@
+
+
<h3>Related Articles</h3>
<ul class="content-by-label"><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="page-navigation.html">Page Navigation</a>
+ <a href="component-rendering.html">Component
Rendering</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="page-life-cycle.html">Page Life Cycle</a>
@@ -98,37 +100,37 @@
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="component-rendering.html">Component
Rendering</a>
+ <a href="component-events.html">Component Events</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="component-events.html">Component Events</a>
+ <a href="page-navigation.html">Page Navigation</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="component-events-faq.html">Component Events
FAQ</a>
+ <a href="request-processing.html">Request
Processing</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="request-processing.html">Request
Processing</a>
+ <a href="component-events-faq.html">Component Events
FAQ</a>
</div>
Modified: websites/production/tapestry/content/page-navigation.html
==============================================================================
--- websites/production/tapestry/content/page-navigation.html (original)
+++ websites/production/tapestry/content/page-navigation.html Sun Apr 26
21:22:55 2020
@@ -158,11 +158,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.rbtoc1587536387615 {padding: 0px;}
-div.rbtoc1587536387615 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536387615 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587936010836 {padding: 0px;}
+div.rbtoc1587936010836 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587936010836 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></h2><div class="toc-macro rbtoc1587536387615">
+/*]]>*/</style></h2><div class="toc-macro rbtoc1587936010836">
<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/parallel-execution.html
==============================================================================
--- websites/production/tapestry/content/parallel-execution.html (original)
+++ websites/production/tapestry/content/parallel-execution.html Sun Apr 26
21:22:55 2020
@@ -76,9 +76,9 @@
<div id="content">
<div id="ConfluenceContent"><p>The <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/ParallelExecutor.html">ParallelExecutor</a>
service allows a computation to occur in parallel.</p><p>It can be used in two
ways. First, with an explicit <a class="external-link"
href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html"
rel="nofollow">Future</a>:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> Future<String> future = executor.invoke(new
Invokable<String>() { ... });</pre>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default"> Future<String>
future = executor.invoke(new Invokable<String>() { ... });</pre>
</div></div><p>The executor will submit the Invokable to a thread pool for
execution in the background.</p><p>The ultimate value of the Invokable is
available by invoking <code>get()</code> on the Future; this will block until
the value is ready.</p><p>Other methods on Future can cancel the execution, or
get the value only if it is ready within a timeout.</p><p>The thread pool is
started automatically as needed, and will shutdown when the Registry itself is
shutdown.</p><p>Another alternative will return an object proxy, not a
Future:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> RSSFeed feed = executor.invoke(RSSFeed.class, new
Invokable<RSSFeed>() { ... });</pre>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default"> RSSFeed feed =
executor.invoke(RSSFeed.class, new Invokable<RSSFeed>() { ... });</pre>
</div></div><p>This only works if the type is an interface. A proxy for the
interface is created around the Future object; any invocation on the proxy will
invoke get() on the Future (that is, will block until the value is
computed).</p><h1 id="ParallelExecution-Configuration">Configuration</h1><p>The
behavior of the ParallelExecutor can be tuned with global configuration
symbols.</p><p>Java constants for the configuration symbols are defined in <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/IOCSymbols.html">IOCSymbols</a>.</p><h3
id="ParallelExecution-tapestry.thread-pool-enabled">tapestry.thread-pool-enabled</h3><p>If
true, the default, then the thread pool will operate. If false, then
ParallelExecutor's implementation changes to invoke the Invokable immediately,
not in a pooled thread. This is useful in environments, such as <a
class="external-link" href="http://code.google.com/appengine/"
rel="nofollow">Google App Engine</a>,
that do not support the creation of threads and thread pools.</p><h3
id="ParallelExecution-tapestry.thread-pool.core-pool-size">tapestry.thread-pool.core-pool-size</h3><p>Minimum
size of the thread pool. Defaults to 3.</p><h3
id="ParallelExecution-tapestry.thread-pool.max-pool-size">tapestry.thread-pool.max-pool-size</h3><p>Maximum
number of threads (active or inactive) in the thread pool. Defaults to
20.</p><h3
id="ParallelExecution-tapestry.thread-pool.keep-alive">tapestry.thread-pool.keep-alive</h3><p>Time
to keep waiting threads alive. Defaults to "1 m" (one minute).</p><h3
id="ParallelExecution-tapestry.thread-pool.queue-size">tapestry.thread-pool.queue-size</h3><p>
</p><div class="aui-message aui-message-info macro-since"><b
class="param-since">Added in 5.3</b>
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 Sun Apr
26 21:22:55 2020
@@ -84,56 +84,58 @@
+
+
<h3>Related Articles</h3>
<ul class="content-by-label"><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="type-coercion.html">Type Coercion</a>
+ <a href="parameter-type-coercion.html">Parameter Type
Coercion</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="parameter-type-coercion.html">Parameter Type
Coercion</a>
+ <a href="type-coercion.html">Type Coercion</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="enum-parameter-recipe.html">Enum Parameter
Recipe</a>
+ <a
href="supporting-informal-parameters.html">Supporting Informal Parameters</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a
href="supporting-informal-parameters.html">Supporting Informal Parameters</a>
+ <a href="default-parameter.html">Default Parameter</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="default-parameter.html">Default Parameter</a>
+ <a href="enum-parameter-recipe.html">Enum Parameter
Recipe</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="component-parameters.html">Component
Parameters</a>
@@ -145,7 +147,7 @@
<p>Tapestry automatically handles type coercions for <a
href="component-parameters.html">component parameters</a>.</p><p>Type coercions
occur when a value passed into a parameter (as bound in a template or in an
annotation) does not match the type of the parameter.</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class Count
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public class Count
{
@Parameter
private int start = 1;
@@ -159,7 +161,7 @@
. . .
</pre>
</div></div><p> </p><p>Here, the type of all three parameters is
<code>int</code>.</p><p>However, it is likely that the component will be used
as so:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> Merry Christmas: <t:count end="3"> Ho!
</t:count>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default"> Merry Christmas:
<t:count end="3"> Ho! </t:count>
</pre>
</div></div><p>A bare whole number is interpreted by the prop binding prefix
as a <code>long</code>. So this is the <em>long</em> value 3.</p><p>Tapestry
will automatically coerce the bound value, a <code>long</code>, to the
parameter's type, <code>int</code>. This may be a lossy coercion (if the
<code>long</code> represents a number larger than can be stored in an
<code>int</code>).</p><h2
id="ParameterTypeCoercion-TypeCoercerService">TypeCoercer Service</h2><p>Main
Article: <a href="type-coercion.html">Type Coercion</a></p><p>The TypeCoercer
service is responsible for this type coercion. This service is part of the <a
href="ioc.html">tapestry-ioc</a> module. The service is quite extensible,
allowing for new types and coercions to be added easily. The TapestryModule
contributes a few additional coercions into the TypeCoercer
service.</p><p></p></div>
</div>
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 Sun
Apr 26 21:22:55 2020
@@ -76,11 +76,13 @@
+
+
<h3>Related Articles</h3>
<ul class="content-by-label"><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="performance-and-clustering.html">Performance
and Clustering</a>
@@ -89,7 +91,7 @@
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="session-storage.html">Session Storage</a>
@@ -98,7 +100,7 @@
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="persistent-page-data.html">Persistent Page
Data</a>
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 Sun Apr 26
21:22:55 2020
@@ -104,7 +104,7 @@
<span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="persistent-page-data.html">Persistent Page
Data</a>
+ <a href="session-storage.html">Session Storage</a>
</div>
@@ -113,7 +113,7 @@
<span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="session-storage.html">Session Storage</a>
+ <a href="persistent-page-data.html">Persistent Page
Data</a>
</div>
Modified: websites/production/tapestry/content/pipelinebuilder-service.html
==============================================================================
--- websites/production/tapestry/content/pipelinebuilder-service.html (original)
+++ websites/production/tapestry/content/pipelinebuilder-service.html Sun Apr
26 21:22:55 2020
@@ -84,11 +84,13 @@
+
+
<h3>Related Articles</h3>
<ul class="content-by-label"><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="shadowbuilder-service.html">ShadowBuilder
Service</a>
@@ -97,25 +99,25 @@
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a
href="strategybuilder-service.html">StrategyBuilder Service</a>
+ <a
href="pipelinebuilder-service.html">PipelineBuilder Service</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a
href="pipelinebuilder-service.html">PipelineBuilder Service</a>
+ <a
href="strategybuilder-service.html">StrategyBuilder Service</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="chainbuilder-service.html">ChainBuilder
Service</a>
@@ -127,7 +129,7 @@
<p>In this pattern, an existing service is decorated with a filter. The filter
will delegate to the service, but has the chance to alter or replace parameters
before invoking the method, and can perform operations before returning. This
is similar to <a href="chainbuilder-service.html">chain of responsibility</a>,
but differs in that there are two interfaces (the service interface and the
filter interface) and that each filter invokes the next filter via the service
interface. In contrast, in the chain of responsibility, the chain invokes each
method, which must return before the next command in the chain is
invoked.</p><p>The service interface and the filter interface are closely
related: the filter interface must match the service interface method for
method, but each method of the filter interface must have an additional
parameter whose type is the service interface. For example, a pipeline that
performed string transformations might use the following interfaces:</p><div
class="
code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public interface StringTransformService
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public interface
StringTransformService
{
String transform(String input);
}
@@ -137,7 +139,7 @@ public interface StringTransformFilter
String transform(String input, StringTransformService delegate);
}</pre>
</div></div><p>An implementation of the filter might look like:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class UpcasePreFilter implements
StringTransformFilter
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public class
UpcasePreFilter implements StringTransformFilter
{
public String transform(String input, StringTransformService delegate)
{
@@ -145,7 +147,7 @@ public interface StringTransformFilter
}
}</pre>
</div></div><p>Alternately, the filter could pass input to delegate unchanged,
but invoke toUpperCase() on the result:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class UpcasePostFilter implements
StringTransformFilter
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public class
UpcasePostFilter implements StringTransformFilter
{
public String transform(String input, StringTransformService delegate)
{
@@ -153,7 +155,7 @@ public interface StringTransformFilter
}
}</pre>
</div></div><p>The PipelineBuilder Service (<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/PipelineBuilder.html">API</a>)
is useful for constructing pipelines. The service is often injected into a
service builder method, along with an ordered configuration of
services.</p><p>What the builder accomplishes is to represent each
<em>filter</em> in the pipeline as an instance of the <em>service</em>
interface.</p><p> </p><p><span
class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image"
src="pipelinebuilder-service.data/PipelineCallingSequence.png"></span><br
clear="none"> Pipeline Calling Sequence</p><p>The bridges are created by the
PipelineBuilder service. The terminator must be provided. The bridges and the
terminator implement the service interface.</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public static StringTransformService build(
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default"> public static
StringTransformService build(
@InjectService("PipelineBuilder")
PipelineBuilder builder,
List<StringTransformFilter> configuration,
Modified: websites/production/tapestry/content/principles.html
==============================================================================
--- websites/production/tapestry/content/principles.html (original)
+++ websites/production/tapestry/content/principles.html Sun Apr 26 21:22:55
2020
@@ -84,20 +84,22 @@
+
+
<h3>Related Articles</h3>
<ul class="content-by-label"><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="tapestry-for-jsf-users.html">Tapestry for
JSF Users</a>
+ <a href="getting-started.html">Getting Started</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="tapestry-tutorial.html">Tapestry Tutorial</a>
@@ -106,28 +108,28 @@
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="principles.html">Principles</a>
+ <a href="introduction.html">Introduction</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="getting-started.html">Getting Started</a>
+ <a href="tapestry-for-jsf-users.html">Tapestry for
JSF Users</a>
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
- <a href="introduction.html">Introduction</a>
+ <a href="principles.html">Principles</a>
</div>
@@ -136,7 +138,7 @@
<h1 id="Principles-Principle1–StaticStructure,DynamicBehavior">Principle
1 – Static Structure, Dynamic Behavior</h1><p>The concept of "Dynamic
Behavior" should be pretty obvious when you are building a web application;
things should look different for different users/situations. But what does it
mean that Tapestry has "Static Structure?" Static structure implies that when
you build a page in Tapestry you are going to define all of the types of
components that are used within that page. Under no circumstance during the
rendering or event processing of the page will you be able to dynamically
create a new type of component and place that into the component tree.</p><p>At
first glance, this seems quite limiting ... other frameworks allow new elements
to be created on the fly; it's also a common feature of desktop GUIs such as
Swing. But static structure turns out to be not so limiting after all. You
<em>can</em> create new elements (you're actually re-rendering existing com
ponents with different properties). And you have plenty of options for getting
dynamic behavior out of your static structure; from the simple conditional and
looping components to the more advanced implementations of Tapestry's
BeanEditor or Grid components, Tapestry gives you control over what renders and
when, and even where it appears on the page. And starting in Tapestry 5.3 you
can even use the <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Dynamic.html">Dynamic
component</a>, which renders whatever is in an external template
file.</p><p>Why did Tapestry choose static structure as a core principle? It's
really a matter of meeting the requirements of agility and scalability.</p><h2
id="Principles-Agility">Agility</h2><p>Tapestry is designed to be an agile
working environment; "code less, deliver more". To support you writing less
code Tapestry does a lot of work on your POJO pages and components when first
loadi
ng them. It also uses shared instances of page and component classes (shared
across multiple threads and requests). Having dynamically modifiable structure
would imply that each request has its own instance and, further, that the
entire structure would need to be serialized between requests so that it can be
restored to handle later requests.</p><p>Tapestry also makes you more agile by
speeding up the development cycle with <a href="principles.html">Live Class
Reloading</a>. Tapestry monitors the file system for changes to Java page
classes, component classes, service implementation classes, HTML templates and
component property files, and it hot-swaps the changes into the running
application without requiring a restart <em>or losing session data</em>. This
provides a very short code-save-view cycle that no other framework can
touch.</p><h2 id="Principles-Scalability">Scalability</h2><p>When building
large scale systems it is important to consider how your resources are going to
be
used on each deployed server, and how that information is going to be shared
between servers. Static structure means that page instances do not need to be
stored inside the HttpSession and simple browsing users do not require extra
system resources. This lean use of the HttpSession is key to Tapestry's very
high scalability, especially in a clustered configuration. Again, linking an
instance of a page to a particular client would require vastly more server-side
resources than having a single shared page instance.</p><h1
id="Principles-Principle2–AdaptiveAPI">Principle 2 – Adaptive
API</h1><p>A key feature of Tapestry 5 is its adaptive API.</p><p>In
traditional Java frameworks (including Struts, <a
href="principles.html">JSF</a> and even the now-ancient Tapestry 4) user code
is expected to conform to the framework. You create classes that extend from
framework-provided base classes, or implement framework-provided
interfaces.</p><p>This works well until you upgrade to t
he next release of the framework: with the new features of the upgrade, you
will more often than not experience breaks in backwards compatibility.
Interfaces or base classes will have changed and your existing code will need
to be changed to match.</p><p>In Tapestry 5, the framework adapts to your code.
You have control over the names of the methods, the parameters they take, and
the value that is returned. This is driven by annotations, which tell Tapestry
under what circumstances your methods are to be invoked.</p><p>For example, you
may have a login form and have a method that gets invoked when the form is
submitted:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class Login
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public class Login
{
@Persist
@Property
Modified: websites/production/tapestry/content/property-expressions.html
==============================================================================
--- websites/production/tapestry/content/property-expressions.html (original)
+++ websites/production/tapestry/content/property-expressions.html Sun Apr 26
21:22:55 2020
@@ -76,11 +76,13 @@
+
+
<h3>Related Articles</h3>
<ul class="content-by-label"><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="component-templates.html">Component
Templates</a>
@@ -89,7 +91,7 @@
</div>
</li><li>
<div>
- <span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
+ <span class="icon aui-icon content-type-page"
title="Page">Page:</span> </div>
<div class="details">
<a href="component-parameters.html">Component
Parameters</a>
Modified: websites/production/tapestry/content/registry-startup.html
==============================================================================
--- websites/production/tapestry/content/registry-startup.html (original)
+++ websites/production/tapestry/content/registry-startup.html Sun Apr 26
21:22:55 2020
@@ -76,7 +76,7 @@
<div id="content">
<div id="ConfluenceContent"><p>It is possible to provide extra
logic to be executed at Registry startup, by making contributions to the
RegistryStartup service configuration.</p><p>The values contributed are
Runnable objects. The configuration is ordered, so it is possible to control in
what order the objects are executed.</p><p>RegistryStartup occurs after eager
loaded services are instantiated.</p><p>Here's an example of a module that
makes a contribution:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class MyModule
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public class MyModule
{
public static void
contributeRegistryStartup(OrderedConfiguration<Runnable> configuration)
{
@@ -90,7 +90,7 @@
</div>Instead of making contributions to the RegistryStartup service
configuration you can provide startup methods inside your modules. A startup
method is a static or instance method of a module annotated with @<a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Startup.html">Startup</a>
annotation. Each module is allowed to contain several startup methods.<div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class MyModule
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">public class MyModule
{
@Startup
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 Sun Apr 26
21:22:55 2020
@@ -78,11 +78,11 @@
<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.rbtoc1587536406282 {padding: 0px;}
-div.rbtoc1587536406282 ul {list-style: disc;margin-left: 0px;padding-left:
5px;}
-div.rbtoc1587536406282 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587936089288 {padding: 0px;}
+div.rbtoc1587936089288 ul {list-style: disc;margin-left: 0px;padding-left:
5px;}
+div.rbtoc1587936089288 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536406282">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587936089288">
<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="#ReleaseNot
es5.0-TapestryVersion5.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 ...]