Modified: websites/production/tapestry/content/security-faq.html
==============================================================================
--- websites/production/tapestry/content/security-faq.html (original)
+++ websites/production/tapestry/content/security-faq.html Thu Feb 20 18:18:15
2025
@@ -91,11 +91,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="SecurityFAQ-Security">Security</h1><p>Main Article: <a
href="security.html">Security</a></p><h2
id="SecurityFAQ-Contents">Contents</h2><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1739988975577 {padding: 0px;}
-div.rbtoc1739988975577 ul {margin-left: 0px;}
-div.rbtoc1739988975577 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740075375942 {padding: 0px;}
+div.rbtoc1740075375942 ul {margin-left: 0px;}
+div.rbtoc1740075375942 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1739988975577">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740075375942">
<ul class="toc-indentation"><li><a
href="#SecurityFAQ-Thebuilt-inDashboardpagearevisibleinmyproductionapplicationandIdon'twantthemtobe,whatcanIdo?">The
built-in Dashboard page are visible in my production application and I don't
want them to be, what can I do?</a></li></ul>
</div><div class="aui-label" style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/security.html
==============================================================================
--- websites/production/tapestry/content/security.html (original)
+++ websites/production/tapestry/content/security.html Thu Feb 20 18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>Tapestry has a
number of <strong>security</strong> features designed to harden your
application against unwanted intrusion and denial of service.</p><p></p><div
class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>Tapestry has a
number of <strong>security</strong> features designed to harden your
application against unwanted intrusion and denial of service.</p><p></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">
Modified:
websites/production/tapestry/content/service-implementation-reloading.html
==============================================================================
--- websites/production/tapestry/content/service-implementation-reloading.html
(original)
+++ websites/production/tapestry/content/service-implementation-reloading.html
Thu Feb 20 18:18:15 2025
@@ -96,7 +96,15 @@
-</div><strong>Service implementation reloading</strong> is the live reloading
of Tapestry-IOC service implementation classes without having to stop &
restart the servlet container. Available for Tapestry 5.2 and later, it extends
the developer productivity gains of Tapestry's <a
href="class-reloading.html">Live Class Reloading</a> to your Tapestry-IOC
service modules.<div class="aui-label" style="float:right" title="Related
Articles">
+</div><strong>Service implementation reloading</strong> is the live reloading
of Tapestry-IOC service implementation classes without having to stop &
restart the servlet container. Available for Tapestry 5.2 and later, it extends
the developer productivity gains of Tapestry's <a
href="class-reloading.html">Live Class Reloading</a> to your Tapestry-IOC
service modules.
+
+<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">
Modified: websites/production/tapestry/content/session-storage.html
==============================================================================
--- websites/production/tapestry/content/session-storage.html (original)
+++ websites/production/tapestry/content/session-storage.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p></p><p>Most web
applications will need to have some data that is shared across multiple pages.
Perhaps you are creating a multi-page wizard, or you have an object that tracks
the user's identify once logged in, or maybe you need to manage a shopping
cart.</p><div class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p></p><p>Most web
applications will need to have some data that is shared across multiple pages.
Perhaps you are creating a multi-page wizard, or you have an object that tracks
the user's identify once logged in, or maybe you need to manage a shopping
cart.</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">
@@ -137,11 +145,11 @@
<p>Ordinary <a href="persistent-page-data.html">page-persistent
fields</a></p><p>won't work for this, since persistent fields are available
only to a specific page, not shared across multiple pages.</p><p>Tapestry
provides two mechanisms for storing such data: Session State Objects and
Session Attributes. When deciding between the two, it's best to use Session
State Objects for complex objects, and Session Attributes for simple
types.</p><h2 id="SessionStorage-SessionStateObjects">Session State
Objects</h2><p>With a Session State Object (SSO), the value is automatically
stored outside the page; with the default storage strategy, it is stored in the
session. Such a value is global to all pages <em>for the same user</em>, but is
stored separately for different users.</p><p>A field holding an SSO is marked
with the @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/SessionState.html">SessionState</a>
annotation.</p><div class="na
vmenu" style="float:right; background:white; margin:3px; padding:3px">
<div class="panel" style="border-width: 1px;"><div class="panelHeader"
style="border-bottom-width: 1px;"><b>Contents</b></div><div
class="panelContent">
<style type="text/css">/*<![CDATA[*/
-div.rbtoc1739988951807 {padding: 0px;}
-div.rbtoc1739988951807 ul {margin-left: 0px;}
-div.rbtoc1739988951807 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740075352092 {padding: 0px;}
+div.rbtoc1740075352092 ul {margin-left: 0px;}
+div.rbtoc1740075352092 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style><div class="toc-macro rbtoc1739988951807">
+/*]]>*/</style><div class="toc-macro rbtoc1740075352092">
<ul class="toc-indentation"><li>Related Articles</li></ul>
<ul><li><a href="#SessionStorage-SessionStateObjects">Session State Objects</a>
<ul class="toc-indentation"><li><a
href="#SessionStorage-Pitfalls">Pitfalls</a></li><li><a
href="#SessionStorage-CheckforCreation">Check for Creation</a></li><li><a
href="#SessionStorage-PersistenceStrategies">Persistence
Strategies</a></li><li><a href="#SessionStorage-ConfiguringSSOs">Configuring
SSOs</a></li></ul>
Modified: websites/production/tapestry/content/shadowbuilder-service.html
==============================================================================
--- websites/production/tapestry/content/shadowbuilder-service.html (original)
+++ websites/production/tapestry/content/shadowbuilder-service.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>The
<strong>ShadowBuilder service</strong> (see the <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/PropertyShadowBuilder.html">PropertyShadowBuilder</a>
API) is used to build a special, delegating kind of service implementation
that, essentially, allows a property of another service to be exposed as its
own service.</p><div class="aui-label" style="float:right" title="Related
Articles">
+ <div id="ConfluenceContent"><p>The
<strong>ShadowBuilder service</strong> (see the <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/PropertyShadowBuilder.html">PropertyShadowBuilder</a>
API) is used to build a special, delegating kind of service implementation
that, essentially, allows a property of another service to be exposed as its
own service.</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">
Modified: websites/production/tapestry/content/specific-errors-faq.html
==============================================================================
--- websites/production/tapestry/content/specific-errors-faq.html (original)
+++ websites/production/tapestry/content/specific-errors-faq.html Thu Feb 20
18:18:15 2025
@@ -91,11 +91,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="SpecificErrorsFAQ-SpecificErrors">Specific Errors</h1><h2
id="SpecificErrorsFAQ-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1739988796290 {padding: 0px;}
-div.rbtoc1739988796290 ul {margin-left: 0px;}
-div.rbtoc1739988796290 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740075196268 {padding: 0px;}
+div.rbtoc1740075196268 ul {margin-left: 0px;}
+div.rbtoc1740075196268 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1739988796290">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740075196268">
<ul class="toc-indentation"><li><a
href="#SpecificErrorsFAQ-WhydoIgettheexception"Noserviceimplementstheinterfaceorg.apache.tapestry5.internal.InternalComponentResources"whentryingtousetheBeanEditFormcomponent?">Why
do I get the exception "No service implements the interface
org.apache.tapestry5.internal.InternalComponentResources" when trying to use
the BeanEditForm component?</a></li><li><a
href="#SpecificErrorsFAQ-Igetanerrorabout"Pagedidnotgenerateanymarkupwhenrendered."butIhaveatemplate,whathappened?">I
get an error about "Page did not generate any markup when rendered." but I
have a template, what happened?</a></li><li><a
href="#SpecificErrorsFAQ-MyapplicationfailswiththeerrorPermGen,howdoIfixthis?">My
application fails with the error PermGen, how do I fix this?</a></li><li><a
href="#SpecificErrorsFAQ-WhydoIsometimesgetajava.lang.NoSuchMethodErrorexceptionafterreloadingmypage?">Why
do I sometimes get a java.lang.NoSuchMethodError exception after reloading m
y page?</a></li><li><a
href="#SpecificErrorsFAQ-Whydomylogscontain"java.lang.RuntimeException:FormsrequirethattherequestmethodbePOSTandthatthet:formdataqueryparameterhavevalues"?">Why
do my logs contain "java.lang.RuntimeException: Forms require that the request
method be POST and that the t:formdata query parameter have
values"?</a></li></ul>
</div><div class="aui-label" style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/strategybuilder-service.html
==============================================================================
--- websites/production/tapestry/content/strategybuilder-service.html (original)
+++ websites/production/tapestry/content/strategybuilder-service.html Thu Feb
20 18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>The
<strong>StrategyBuilder Service</strong> provides a convenient way to create an
implementation of the <a class="external-link"
href="https://en.wikipedia.org/wiki/Strategy_pattern"
rel="nofollow">Strategy</a> design pattern.</p><div class="aui-label"
style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>The
<strong>StrategyBuilder Service</strong> provides a convenient way to create an
implementation of the <a class="external-link"
href="https://en.wikipedia.org/wiki/Strategy_pattern"
rel="nofollow">Strategy</a> design pattern.</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">
Modified:
websites/production/tapestry/content/supporting-informal-parameters.html
==============================================================================
--- websites/production/tapestry/content/supporting-informal-parameters.html
(original)
+++ websites/production/tapestry/content/supporting-informal-parameters.html
Thu Feb 20 18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div
id="ConfluenceContent"><p> <strong>Informal parameters</strong> are any
additional parameters (aka HTML attributes) beyond the those explicitly defined
for a component using the @<a class="external-link"
href="http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/annotations/Parameter.html">Parameter</a>
annotation.</p><div class="aui-label" style="float:right; margin: 1em"
title="Related Articles">
+ <div
id="ConfluenceContent"><p> <strong>Informal parameters</strong> are any
additional parameters (aka HTML attributes) beyond the those explicitly defined
for a component using the @<a class="external-link"
href="http://tapestry.apache.org/tapestry5/apidocs/org/apache/tapestry5/annotations/Parameter.html">Parameter</a>
annotation.</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; margin: 1em" title="Related
Articles">
Modified: websites/production/tapestry/content/switching-cases.html
==============================================================================
--- websites/production/tapestry/content/switching-cases.html (original)
+++ websites/production/tapestry/content/switching-cases.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><h1
id="SwitchingCases-SwitchingCases">Switching Cases</h1><p>With Tapestry's
<code>If</code> component you can only test one condition at a time. In order
to distinguish multiple cases, you'd have to write complex nested if/else
constructs in your page template and have a checker method for each test inside
your page class.</p><div style="width: 20em; float:right"><div class="panel"
style="border-color: #eee;border-width: 1px;"><div class="panelHeader"
style="border-bottom-width: 1px;border-bottom-color: #eee;background-color:
#eee;"><b>JumpStart Demo</b></div><div class="panelContent">
+ <div id="ConfluenceContent"><h1
id="SwitchingCases-SwitchingCases">Switching Cases</h1><p>With Tapestry's
<code>If</code> component you can only test one condition at a time. In order
to distinguish multiple cases, you'd have to write complex nested if/else
constructs in your page template and have a checker method for each test inside
your page class.</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 style="width: 20em; float:right"><div class="panel" style="border-color:
#eee;border-width: 1px;"><div class="panelHeader" style="border-bottom-width:
1px;border-bottom-color: #eee;background-color: #eee;"><b>JumpStart
Demo</b></div><div class="panelContent">
<p> <a class="external-link"
href="http://jumpstart.doublenegative.com.au/jumpstart/examples/lang/ifnotnegateswitchelseunless"
rel="nofollow">If, Not, Negate, Switch, Else, Unless</a></p>
</div></div></div>
Modified: websites/production/tapestry/content/symbols.html
==============================================================================
--- websites/production/tapestry/content/symbols.html (original)
+++ websites/production/tapestry/content/symbols.html Thu Feb 20 18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div
id="ConfluenceContent"><p><strong>Symbols</strong> are named configuration
settings for Tapestry IOC-based services. Tapestry provides mechanisms for easy
access to symbols from within such services.</p><div class="aui-label"
style="float:right" title="Related Articles">
+ <div
id="ConfluenceContent"><p><strong>Symbols</strong> are named configuration
settings for Tapestry IOC-based services. Tapestry provides mechanisms for easy
access to symbols from within such services.</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">
Modified: websites/production/tapestry/content/tapestry-for-jsf-users.html
==============================================================================
--- websites/production/tapestry/content/tapestry-for-jsf-users.html (original)
+++ websites/production/tapestry/content/tapestry-for-jsf-users.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>This is a
brief guide for learning Tapestry, designed for those who already know
JavaServer Faces (JSF).</p><p>Because both JSF and Tapestry are component
oriented frameworks designed to serve mostly the same kinds of problems in
similar ways, developers who already know JSF will find it very easy to learn
Tapestry. In fact, Facelets, the default view technology in JSF 2.0, was
created specifically to give JSF a Tapestry-like templating capability, so
Facelets users should feel right at home.</p><div class="aui-label"
style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>This is a
brief guide for learning Tapestry, designed for those who already know
JavaServer Faces (JSF).</p><p>Because both JSF and Tapestry are component
oriented frameworks designed to serve mostly the same kinds of problems in
similar ways, developers who already know JSF will find it very easy to learn
Tapestry. In fact, Facelets, the default view technology in JSF 2.0, was
created specifically to give JSF a Tapestry-like templating capability, so
Facelets users should feel right at home.</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">
Modified:
websites/production/tapestry/content/tapestry-inversion-of-control-faq.html
==============================================================================
--- websites/production/tapestry/content/tapestry-inversion-of-control-faq.html
(original)
+++ websites/production/tapestry/content/tapestry-inversion-of-control-faq.html
Thu Feb 20 18:18:15 2025
@@ -91,11 +91,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="TapestryInversionofControlFAQ-TapestryInversionofControlContainer">Tapestry
Inversion of Control Container</h1><p>Main article: <a
href="tapestry-inversion-of-control-faq.html">Tapestry IoC</a></p><h2
id="TapestryInversionofControlFAQ-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1739988766595 {padding: 0px;}
-div.rbtoc1739988766595 ul {margin-left: 0px;}
-div.rbtoc1739988766595 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740075166369 {padding: 0px;}
+div.rbtoc1740075166369 ul {margin-left: 0px;}
+div.rbtoc1740075166369 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1739988766595">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740075166369">
<ul class="toc-indentation"><li><a
href="#TapestryInversionofControlFAQ-WhydoIneedtodefineaninterfaceformyservices?Whycan'tIjustusetheclassitself?">Why
do I need to define an interface for my services? Why can't I just use the
class itself?</a></li><li><a
href="#TapestryInversionofControlFAQ-Myservicestartsathread;howdoIknowwhentheapplicationisshuttingdown,tostopthatthread?">My
service starts a thread; how do I know when the application is shutting down,
to stop that thread?</a></li><li><a
href="#TapestryInversionofControlFAQ-HowdoImakemyservicestartupwiththerestoftheapplication,ratherthanlazily?">How
do I make my service startup with the rest of the application, rather than
lazily?</a></li></ul>
</div><div class="aui-label" style="float:right" title="Related Articles">
Modified: websites/production/tapestry/content/tapestry-ioc-configuration.html
==============================================================================
--- websites/production/tapestry/content/tapestry-ioc-configuration.html
(original)
+++ websites/production/tapestry/content/tapestry-ioc-configuration.html Thu
Feb 20 18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p><strong>Tapestry
IOC Configuration</strong> is the configuration of both the IOC services
provided by Tapestry and those you write yourself. Both are configured in the
same way: using Java, not XML.</p><div class="aui-label" style="float:right"
title="Related Articles">
+ <div id="ConfluenceContent"><p><strong>Tapestry
IOC Configuration</strong> is the configuration of both the IOC services
provided by Tapestry and those you write yourself. Both are configured in the
same way: using Java, not XML.</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">
Modified: websites/production/tapestry/content/tapestry-ioc-overview.html
==============================================================================
--- websites/production/tapestry/content/tapestry-ioc-overview.html (original)
+++ websites/production/tapestry/content/tapestry-ioc-overview.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>Even today, with
the overwhelming success of <a class="external-link"
href="http://www.springframework.org" rel="nofollow">Spring</a> and the rise of
smaller, simpler approaches to building applications (in contrast to the
heavyweight EJB 2.0 approach), many people still have trouble wrapping their
heads around Inversion of Control.</p><p>Really understanding IoC is a new step
for many developers. If you can remember back to when you made the transition
from procedural programming (in C, or BASIC) to object oriented programming,
you might remember the point where you "got it". The point where it made sense
to have methods on objects, and data inside objects.</p><p>Inversion of Control
builds upon those ideas. The goal is to make code more robust (that is, with
fewer errors), more reusable and much easier to test.</p><p>Prior to IoC
approaches, most developers were used to a more <em>monolithic</em> design,
with a few core ob
jects and a <code>main()</code> method somewhere that starts the ball rolling.
<code>main()</code> instantiates the first couple of classes, and those classes
end up instantiating and using all the other classes in the
system.</p><p>That's an <em>unmanaged</em> system. Most desktop applications
are unmanaged, so it's a very familiar pattern, and easy to get your head
around.</p><p>By contrast, web applications are a <em>managed</em> environment.
You don't write a main(), you don't control startup. You <em>configure</em> the
Servlet API to tell it about your servlet classes to be instantiated, and their
life cycle is totally controlled by the servlet container.</p><p>Inversion of
Control is just a more general application of this approach. The container is
ultimately responsible for instantiating and configuring the objects you tell
it about, and running their entire life cycle of those objects.</p><p>Web
applications are more complicated to write than monolithic applications, largel
y because of <em>multithreading</em>. Your code will be servicing many
different users simultaneously across many different threads. This tends to
complicate the code you write, since some fundamental aspects of object
oriented development get called into question: in particular, the use of
<em>internal state</em> (values stored inside instance variables), since in a
multithreaded environment, that's no longer the safe place it is in traditional
development. Shared objects plus internal state plus multiple threads equals an
broken, unpredictable application.</p><p>Frameworks such as Tapestry –
both the IoC container, and the web framework itself – exist to
help.</p><p>When thinking in terms of IoC, <strong>small is beautiful</strong>.
What does that mean? It means small classes and small methods are easier to
code than large ones. At one extreme, we have servlets circa 1997 (and Visual
Basic before that) with methods a thousand lines long, and no distinction
between busi
ness logic and view logic. Everything mixed together into an untestable
jumble.</p><p>At the other extreme is IoC: small objects, each with a specific
purpose, collaborating with other small objects.</p><p>Using unit tests, in
collaboration with tools such as <a class="external-link"
href="http://easymock.org/" rel="nofollow">EasyMock</a>, you can have a code
base that is easy to maintain, easy to extend, and easy to test. And by
factoring out a lot of <em>plumbing</em> code, your code base will not only be
easier to work with, it will be smaller.</p><h2
id="TapestryIoCOverview-LivingontheFrontier">Living on the
Frontier</h2><p>Coding applications the traditional way is like being a
homesteader on the American frontier in the 1800's. You're responsible for
every aspect of your house: every board, every nail, every stick of furniture
is something you personally created. There <em>is</em> a great comfort in total
self reliance. Even if your house is small, the windows are a bit drafty
or the floorboards creak a little, you know exactly <em>why</em> things are
not-quite perfect.</p><p>Flash forward to modern cities or modern suburbia and
it's a whole different story. Houses are built to specification from design
plans, made from common materials, by many specializing tradespeople.
Construction codes dictate how plumbing, wiring and framing should be
performed. A home-owner may not even know how to drive a nail, but can still
take comfort in draft-free windows, solid floors and working plumbing.</p><p>To
extend the metaphor, a house in a town is not alone and self-reliant the way a
frontier house is. The town house is situated on a street, in a neighborhood,
within a town. The town provides services (utilities, police, fire control,
streets and sewers) to houses in a uniform way. Each house just needs to
connect up to those services.</p><h2
id="TapestryIoCOverview-TheWorldoftheContainer">The World of the
Container</h2><p>So the IoC container is the "town" and in t
he world of the IoC container, everything has a name, a place, and a
relationship to everything else in the container. Tapestry calls this world
"The Registry".</p><p><span class="confluence-embedded-file-wrapper"><img
class="confluence-embedded-image confluence-external-resource"
draggable="false" src="tapestry-ioc-overview.data/ioc-overview.png"
data-image-src="https://cwiki.apache.org/confluence/download/attachments/23338486/ioc-overview.png?version=1&modificationDate=1290980234000&api=v2"></span></p><p>Here
we're seeing a few services from the built-in Tapestry IoC module, and a few
of the services from the Tapestry web framework module. In fact, there are over
100 services, all interrelated, in the Registry ... and that's before you add
your own to the mix. The IoC Registry treats all the services uniformly,
regardless of whether they are part of Tapestry, or part of your application,
or part of an add-on library.</p><p>Tapestry IoC's job is to make all of these
service
s available to each other, and to the outside world. The outside world could
be a standalone application, or it could be an application built on top of the
Tapestry web framework.</p><h2
id="TapestryIoCOverview-ServiceLifeCycle">Service Life Cycle</h2><p>Tapestry
services are <em>lazy</em>, which means they are not fully instantiated until
they are absolutely needed. Often, what looks like a service is really a proxy
object ... the first time any method of the proxy is invoked, the actual
service is instantiated and initialized (Tapestry uses the term
<em>realized</em> for this process). Of course, this is all absolutely
thread-safe.</p><p>Initially a service is <em>defined</em>, meaning some module
has defined the service. Later, the service will be <em>virtual</em>, meaning a
proxy has been created. This occurs most often because some other service
<em>depends</em> on it, but hasn't gotten around to invoking methods on it.
Finally, a service that is ready to use is <em>realized</e
m>. What's nice is that your code neither knows nor cares about the life cycle
of the service, because of the magic of the proxy.</p><p>In fact, when a
Tapestry web application starts up, before it services its first request, only
about 20% of the services have been realized; the remainder are defined or
virtual.</p><h2 id="TapestryIoCOverview-Classvs.Service">Class vs.
Service</h2><p>A Tapestry service is more than just a class. First of all, it
is a combination of an <em>interface</em> that defines the operations of the
service, and an <em>implementation class</em> that implements the
interface.</p><p>Why this extra division? Having a service interface is what
lets Tapestry create proxies and perform other operations. It's also a very
good practice to code to an interface, rather than a specific implementation.
You'll often be surprised at the kinds of things you can accomplish by
substituting one implementation for another.</p><p>Tapestry is also very aware
that a service will ha
ve dependencies on other services. It may also have other needs ... for
example, in Tapestry IoC, the container provides services with access to
Loggers.</p><p>Tapestry IoC also has support for other configuration that may
be provided to services when they are realized.</p><h2
id="TapestryIoCOverview-DependencyInjection">Dependency Injection</h2><p>Main
Article: <a href="injection.html">Injection</a></p><div class="aui-label"
style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>Even today, with
the overwhelming success of <a class="external-link"
href="http://www.springframework.org" rel="nofollow">Spring</a> and the rise of
smaller, simpler approaches to building applications (in contrast to the
heavyweight EJB 2.0 approach), many people still have trouble wrapping their
heads around Inversion of Control.</p><p>Really understanding IoC is a new step
for many developers. If you can remember back to when you made the transition
from procedural programming (in C, or BASIC) to object oriented programming,
you might remember the point where you "got it". The point where it made sense
to have methods on objects, and data inside objects.</p><p>Inversion of Control
builds upon those ideas. The goal is to make code more robust (that is, with
fewer errors), more reusable and much easier to test.</p><p>Prior to IoC
approaches, most developers were used to a more <em>monolithic</em> design,
with a few core ob
jects and a <code>main()</code> method somewhere that starts the ball rolling.
<code>main()</code> instantiates the first couple of classes, and those classes
end up instantiating and using all the other classes in the
system.</p><p>That's an <em>unmanaged</em> system. Most desktop applications
are unmanaged, so it's a very familiar pattern, and easy to get your head
around.</p><p>By contrast, web applications are a <em>managed</em> environment.
You don't write a main(), you don't control startup. You <em>configure</em> the
Servlet API to tell it about your servlet classes to be instantiated, and their
life cycle is totally controlled by the servlet container.</p><p>Inversion of
Control is just a more general application of this approach. The container is
ultimately responsible for instantiating and configuring the objects you tell
it about, and running their entire life cycle of those objects.</p><p>Web
applications are more complicated to write than monolithic applications, largel
y because of <em>multithreading</em>. Your code will be servicing many
different users simultaneously across many different threads. This tends to
complicate the code you write, since some fundamental aspects of object
oriented development get called into question: in particular, the use of
<em>internal state</em> (values stored inside instance variables), since in a
multithreaded environment, that's no longer the safe place it is in traditional
development. Shared objects plus internal state plus multiple threads equals an
broken, unpredictable application.</p><p>Frameworks such as Tapestry –
both the IoC container, and the web framework itself – exist to
help.</p><p>When thinking in terms of IoC, <strong>small is beautiful</strong>.
What does that mean? It means small classes and small methods are easier to
code than large ones. At one extreme, we have servlets circa 1997 (and Visual
Basic before that) with methods a thousand lines long, and no distinction
between busi
ness logic and view logic. Everything mixed together into an untestable
jumble.</p><p>At the other extreme is IoC: small objects, each with a specific
purpose, collaborating with other small objects.</p><p>Using unit tests, in
collaboration with tools such as <a class="external-link"
href="http://easymock.org/" rel="nofollow">EasyMock</a>, you can have a code
base that is easy to maintain, easy to extend, and easy to test. And by
factoring out a lot of <em>plumbing</em> code, your code base will not only be
easier to work with, it will be smaller.</p><h2
id="TapestryIoCOverview-LivingontheFrontier">Living on the
Frontier</h2><p>Coding applications the traditional way is like being a
homesteader on the American frontier in the 1800's. You're responsible for
every aspect of your house: every board, every nail, every stick of furniture
is something you personally created. There <em>is</em> a great comfort in total
self reliance. Even if your house is small, the windows are a bit drafty
or the floorboards creak a little, you know exactly <em>why</em> things are
not-quite perfect.</p><p>Flash forward to modern cities or modern suburbia and
it's a whole different story. Houses are built to specification from design
plans, made from common materials, by many specializing tradespeople.
Construction codes dictate how plumbing, wiring and framing should be
performed. A home-owner may not even know how to drive a nail, but can still
take comfort in draft-free windows, solid floors and working plumbing.</p><p>To
extend the metaphor, a house in a town is not alone and self-reliant the way a
frontier house is. The town house is situated on a street, in a neighborhood,
within a town. The town provides services (utilities, police, fire control,
streets and sewers) to houses in a uniform way. Each house just needs to
connect up to those services.</p><h2
id="TapestryIoCOverview-TheWorldoftheContainer">The World of the
Container</h2><p>So the IoC container is the "town" and in t
he world of the IoC container, everything has a name, a place, and a
relationship to everything else in the container. Tapestry calls this world
"The Registry".</p><p><span class="confluence-embedded-file-wrapper"><img
class="confluence-embedded-image confluence-external-resource"
draggable="false" src="tapestry-ioc-overview.data/ioc-overview.png"
data-image-src="https://cwiki.apache.org/confluence/download/attachments/23338486/ioc-overview.png?version=1&modificationDate=1290980234000&api=v2"></span></p><p>Here
we're seeing a few services from the built-in Tapestry IoC module, and a few
of the services from the Tapestry web framework module. In fact, there are over
100 services, all interrelated, in the Registry ... and that's before you add
your own to the mix. The IoC Registry treats all the services uniformly,
regardless of whether they are part of Tapestry, or part of your application,
or part of an add-on library.</p><p>Tapestry IoC's job is to make all of these
service
s available to each other, and to the outside world. The outside world could
be a standalone application, or it could be an application built on top of the
Tapestry web framework.</p><h2
id="TapestryIoCOverview-ServiceLifeCycle">Service Life Cycle</h2><p>Tapestry
services are <em>lazy</em>, which means they are not fully instantiated until
they are absolutely needed. Often, what looks like a service is really a proxy
object ... the first time any method of the proxy is invoked, the actual
service is instantiated and initialized (Tapestry uses the term
<em>realized</em> for this process). Of course, this is all absolutely
thread-safe.</p><p>Initially a service is <em>defined</em>, meaning some module
has defined the service. Later, the service will be <em>virtual</em>, meaning a
proxy has been created. This occurs most often because some other service
<em>depends</em> on it, but hasn't gotten around to invoking methods on it.
Finally, a service that is ready to use is <em>realized</e
m>. What's nice is that your code neither knows nor cares about the life cycle
of the service, because of the magic of the proxy.</p><p>In fact, when a
Tapestry web application starts up, before it services its first request, only
about 20% of the services have been realized; the remainder are defined or
virtual.</p><h2 id="TapestryIoCOverview-Classvs.Service">Class vs.
Service</h2><p>A Tapestry service is more than just a class. First of all, it
is a combination of an <em>interface</em> that defines the operations of the
service, and an <em>implementation class</em> that implements the
interface.</p><p>Why this extra division? Having a service interface is what
lets Tapestry create proxies and perform other operations. It's also a very
good practice to code to an interface, rather than a specific implementation.
You'll often be surprised at the kinds of things you can accomplish by
substituting one implementation for another.</p><p>Tapestry is also very aware
that a service will ha
ve dependencies on other services. It may also have other needs ... for
example, in Tapestry IoC, the container provides services with access to
Loggers.</p><p>Tapestry IoC also has support for other configuration that may
be provided to services when they are realized.</p><h2
id="TapestryIoCOverview-DependencyInjection">Dependency Injection</h2><p>Main
Article: <a href="injection.html">Injection</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">
Modified: websites/production/tapestry/content/tapestry-tutorial.html
==============================================================================
--- websites/production/tapestry/content/tapestry-tutorial.html (original)
+++ websites/production/tapestry/content/tapestry-tutorial.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><div class="aui-label"
style="float:right" title="Related Articles">
+ <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">
Modified: websites/production/tapestry/content/templating-and-markup-faq.html
==============================================================================
--- websites/production/tapestry/content/templating-and-markup-faq.html
(original)
+++ websites/production/tapestry/content/templating-and-markup-faq.html Thu Feb
20 18:18:15 2025
@@ -91,11 +91,11 @@
<!-- /// Content Start -->
<div id="content">
<div id="ConfluenceContent"><h1
id="TemplatingandMarkupFAQ-TemplatingandMarkup">Templating and
Markup</h1><p>Main Article: <a href="component-templates.html">Component
Templates</a></p><h2
id="TemplatingandMarkupFAQ-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1739988775176 {padding: 0px;}
-div.rbtoc1739988775176 ul {margin-left: 0px;}
-div.rbtoc1739988775176 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1740075174952 {padding: 0px;}
+div.rbtoc1740075174952 ul {margin-left: 0px;}
+div.rbtoc1740075174952 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1739988775176">
+/*]]>*/</style></p><div class="toc-macro rbtoc1740075174952">
<ul class="toc-indentation"><li><a
href="#TemplatingandMarkupFAQ-WhydoIgetaSAXParseExceptionwhenIuseanHTMLentity,suchas inmytemplate?">Why
do I get a SAXParseException when I use an HTML entity, such as &nbsp; in
my template?</a></li><li><a
href="#TemplatingandMarkupFAQ-Whydosomeimagesinmypageshowupasbrokenlinks?">Why
do some images in my page show up as broken links?</a></li><li><a
href="#TemplatingandMarkupFAQ-What'sthedifferencebetweenidandt:id?">What's the
difference between id and t:id?</a></li><li><a
href="#TemplatingandMarkupFAQ-WhydomyimagesandstylesheetsendupwithaweirdURLslike/assets/meta/zeea17aee26bc0cae/layout/layout.css?">Why
do my images and stylesheets end up with a weird URLs like
/assets/meta/zeea17aee26bc0cae/layout/layout.css?</a></li><li><a
href="#TemplatingandMarkupFAQ-HowdoIaddaCSSclasstoaTapestrycomponent?">How do I
add a CSS class to a Tapestry component?</a></li></ul>
</div><h2
id="TemplatingandMarkupFAQ-WhydoIgetaSAXParseExceptionwhenIuseanHTMLentity,suchas&nbsp;inmytemplate?">Why
do I get a SAXParseException when I use an HTML entity, such as
<code>&nbsp;</code> in my template?</h2><p>Tapestry uses a standard SAX
parser to read your templates. This means that your templates must be <em>well
formed</em>: open and close tags must balance, attribute values must be quoted,
and entities must be declared. The easiest way to accomplish this is to add a
DOCTYPE to your the top of your template:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre><code class="language-xml"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.0 Strict//EN"
Modified: websites/production/tapestry/content/type-coercion.html
==============================================================================
--- websites/production/tapestry/content/type-coercion.html (original)
+++ websites/production/tapestry/content/type-coercion.html Thu Feb 20 18:18:15
2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p><strong>Type
Coercion</strong> is the conversion of one type of object to a another 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 string
"5" into an integer 5 or a double 5.0.</p><div class="aui-label"
style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p><strong>Type
Coercion</strong> is the conversion of one type of object to a another 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 string
"5" into an integer 5 or a double 5.0.</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">
Modified: websites/production/tapestry/content/typescript.html
==============================================================================
--- websites/production/tapestry/content/typescript.html (original)
+++ websites/production/tapestry/content/typescript.html Thu Feb 20 18:18:15
2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div
id="ConfluenceContent"><p><strong>TypeScript</strong> (<a class="external-link"
href="https://en.wikipedia.org/wiki/TypeScript"
rel="nofollow">https://en.wikipedia.org/wiki/TypeScript</a>) is a language that
compiles down to JavaScript.</p><div class="aui-label" style="float:right"
title="Related Articles">
+ <div
id="ConfluenceContent"><p><strong>TypeScript</strong> (<a class="external-link"
href="https://en.wikipedia.org/wiki/TypeScript"
rel="nofollow">https://en.wikipedia.org/wiki/TypeScript</a>) is a language that
compiles down to JavaScript.</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">
Modified:
websites/production/tapestry/content/unit-testing-pages-or-components.html
==============================================================================
--- websites/production/tapestry/content/unit-testing-pages-or-components.html
(original)
+++ websites/production/tapestry/content/unit-testing-pages-or-components.html
Thu Feb 20 18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><p>Tapestry provides
support for easily <strong>unit testing your pages and components</strong>.
Follow the simple steps below.</p><div class="aui-label" style="float:right"
title="Related Articles">
+ <div id="ConfluenceContent"><p>Tapestry provides
support for easily <strong>unit testing your pages and components</strong>.
Follow the simple steps below.</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">
Modified:
websites/production/tapestry/content/using-jsr-330-standard-annotations.html
==============================================================================
---
websites/production/tapestry/content/using-jsr-330-standard-annotations.html
(original)
+++
websites/production/tapestry/content/using-jsr-330-standard-annotations.html
Thu Feb 20 18:18:15 2025
@@ -96,7 +96,15 @@
-</div><strong>JSR-330 annotations</strong> can be used for injection in
Tapestry 5.3 and later.<div class="aui-label" style="float:right"
title="Related Articles">
+</div><strong>JSR-330 annotations</strong> can be used for injection in
Tapestry 5.3 and later.
+
+<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">
Modified: websites/production/tapestry/content/whatistapestry-v2.html
==============================================================================
--- websites/production/tapestry/content/whatistapestry-v2.html (original)
+++ websites/production/tapestry/content/whatistapestry-v2.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><div
class="error"><span class="error">Error</span> CSS Stylesheet macro - URL
'whatistapestry.data/Chat.png' is not on the allowlist. If you want to include
this content, contact your Confluence administrator to request adding this URL
to the <a
href="https://confluence.atlassian.com/doc/configuring-the-whitelist-381255821.html">Allowlist</a>.</div><div
class="row" id="whatIs"><h3 id="whatIsTapestryv2-WhatisTapestry?">What is
Tapestry?</h3><div class="col-md-6"><div id="is-polyglot"><h4
id="whatIsTapestryv2-PureJavaandPolyglot">Pure Java and Polyglot</h4><p>Written
in pure Java: code your pages and components in Java, Groovy or Scala.</p></div>
+ <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="error"><span class="error">Error</span> CSS Stylesheet macro - URL
'whatistapestry.data/Chat.png' is not on the allowlist. If you want to include
this content, contact your Confluence administrator to request adding this URL
to the <a
href="https://confluence.atlassian.com/doc/configuring-the-whitelist-381255821.html">Allowlist</a>.</div><div
class="row" id="whatIs"><h3 id="whatIsTapestryv2-WhatisTapestry?">What is
Tapestry?</h3><div class="col-md-6"><div id="is-polyglot"><h4
id="whatIsTapestryv2-PureJavaandPolyglot">Pure Java and Polyglot</h4><p>Written
in pure Java: code your pages and components in Java, Groovy or Scala.</p></div>
<div id="is-productive"><h4 id="whatIsTapestryv2-HighlyProductive">Highly
Productive</h4><p>Live class reloading means that the time between seeing an
error and providing the fix is seconds, not minutes.</p></div>
Modified: websites/production/tapestry/content/whatistapestry.html
==============================================================================
--- websites/production/tapestry/content/whatistapestry.html (original)
+++ websites/production/tapestry/content/whatistapestry.html Thu Feb 20
18:18:15 2025
@@ -90,7 +90,15 @@
<!-- /// Content Start -->
<div id="content">
- <div id="ConfluenceContent"><div class="row"
id="whatIs"><h3 id="whatIsTapestry-WhatisTapestry?">What is Tapestry?</h3><div
class="col-md-6"><div id="is-polyglot"><h4
id="whatIsTapestry-PureJavaandPolyglot">Pure Java and Polyglot</h4><p>Written
in pure Java: code your pages and components in Java, Groovy or Scala.</p></div>
+ <div id="ConfluenceContent"><div class="row"
id="whatIs"><h3 id="whatIsTapestry-WhatisTapestry?">What is Tapestry?</h3><div
class="col-md-6">
+
+<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="is-polyglot"><h4 id="whatIsTapestry-PureJavaandPolyglot">Pure Java
and Polyglot</h4><p>Written in pure Java: code your pages and components in
Java, Groovy or Scala.</p></div>
<div id="is-productive"><h4 id="whatIsTapestry-HighlyProductive">Highly
Productive</h4><p>Live class reloading means that the time between seeing an
error and providing the fix is seconds, not minutes.</p></div>