Modified: websites/production/tapestry/content/legacy-javascript.html
==============================================================================
--- websites/production/tapestry/content/legacy-javascript.html (original)
+++ websites/production/tapestry/content/legacy-javascript.html Sun Apr 26 
21:22:55 2020
@@ -86,11 +86,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="ajax-and-zones.html">Ajax and Zones</a>
@@ -99,7 +101,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="legacy-javascript.html">Legacy JavaScript</a>
@@ -108,25 +110,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="typescript.html">TypeScript</a>
+                        <a  href="javascript-modules.html">JavaScript 
Modules</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="coffeescript.html">CoffeeScript</a>
+                        <a  href="typescript.html">TypeScript</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="client-side-javascript.html">Client-Side 
JavaScript</a>
@@ -135,16 +137,16 @@
                     </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="javascript-modules.html">JavaScript 
Modules</a>
+                        <a  href="coffeescript.html">CoffeeScript</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="javascript-faq.html">JavaScript FAQ</a>
@@ -153,7 +155,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="ajax-components-faq.html">Ajax Components 
FAQ</a>
@@ -162,7 +164,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-cheat-sheet.html">Component Cheat 
Sheet</a>
@@ -171,7 +173,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="assets.html">Assets</a>
@@ -188,7 +190,7 @@
 
 
 <h2 id="LegacyJavaScript-Approach1:@Import">Approach 1: @Import</h2><p>Use the 
@<a  class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Import.html";>Import</a>
 annotation (or @<a  class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/IncludeJavaScriptLibrary.html";>IncludeJavaScriptLibrary</a>
 in Tapestry 5.0 and 5.1) to include links to JavaScript (and CSS) files in 
your page or component. Tapestry ensures that each such file is only referenced 
once in your page.</p><div class="sectionColumnWrapper"><div 
class="sectionMacro"><div class="sectionMacroRow"><div class="columnMacro"><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader 
panelHeader pdl" style="border-bottom-width: 1px;"><b>For Tapestry 5.2 and 
later</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">@Import(library={"context:js/jquery.js",
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" 
data-theme="Default">@Import(library={"context:js/jquery.js",
                "context:js/myeffects.js"})
 public class MyComponent
 {
@@ -196,7 +198,7 @@ public class MyComponent
 }
 </pre>
 </div></div></div><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>For Tapestry 5.0 and 5.1</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">@IncludeJavaScriptLibrary(value={"context:js/jquery.js",
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" 
data-theme="Default">@IncludeJavaScriptLibrary(value={"context:js/jquery.js",
                "context:js/myeffects.js"})
 public class MyComponent
 {
@@ -204,7 +206,7 @@ public class MyComponent
 }
 </pre>
 </div></div></div></div></div></div><p>@Import may also be applied to 
individual methods, in which case the import operation only occurs when the 
method is invoked.</p><p>Note: When specifying a file to import, you'll often 
use the <strong>context:</strong> binding prefix to indicate that the file is 
stored in the web application context, and not on the classpath. Relative paths 
will be on the classpath, relative to the Java class. See&#160;<a  
href="component-parameters.html">Component Parameters</a> for other binding 
prefix options.</p><p>Adding the same JavaScript library multiple times does 
<em>not</em> create duplicate links. The subsequent ones are simply ignored. In 
this way, each component can add the libraries it needs, without worrying about 
conflicts with other components.</p><h2 
id="LegacyJavaScript-Approach2:JavaScriptSupport">Approach 2: 
JavaScriptSupport</h2><p>Alternatively, you can use <a  class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/ap
 
ache/tapestry5/services/javascript/JavaScriptSupport.html">JavaScriptSupport</a>
 (for Tapestry 5.2 or later) or RenderSupport (for Tapestry 5.0 and 5.1) to 
include a JavaScript library in your page or component. JavaScriptSupport and 
RenderSupport are <a  href="legacy-javascript.html">environmental services</a> 
that include a number of methods that will be used by components, or by 
services that are called from components. For example:</p><h3 
id="LegacyJavaScript-TheimportJavaScriptLibrarymethod">The 
<code>importJavaScriptLibrary</code> method</h3><p>The 
<code>importJavaScriptLibrary</code> method (or <code>addScriptLink</code> for 
Tapestry 5.0 and 5.1) adds a link to a JavaScript library. A component can 
inject such a script and pass one or more of assets to this method:</p><div 
class="sectionColumnWrapper"><div class="sectionMacro"><div 
class="sectionMacroRow"><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" st
 yle="border-bottom-width: 1px;"><b>Tapestry 5.2 and later</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Inject @Path("context:/js/myeffects.js")
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Inject 
@Path("context:/js/myeffects.js")
   private Asset myEffects;
 
   @Environmental
@@ -216,7 +218,7 @@ public class MyComponent
   }
 </pre>
 </div></div></div><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>Tapestry 5.1 and earlier</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Inject @Path("context:/js/myeffects.js")
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Inject 
@Path("context:/js/myeffects.js")
   private Asset myEffects;
 
   @Environmental
@@ -233,7 +235,7 @@ public class MyComponent
 
 
 <h3 id="LegacyJavaScript-TheaddScriptmethod">The <code>addScript</code> 
method</h3><p>The <code>addScript</code> method is used when you need to add 
some JavaScript code directly to the page. This will be inserted at the 
<em>bottom of the document</em>, and will only be executed when the document 
has finished loading on the client (i.e., from the window.onload event 
handler).</p><div class="sectionColumnWrapper"><div class="sectionMacro"><div 
class="sectionMacroRow"><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>Tapestry 5.2 and later</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: text; gutter: false; theme: Default" 
style="font-size:12px;">void afterRender()
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: text; 
gutter: false; theme: Default" data-theme="Default">void afterRender()
 {
     javaScriptSupport.addScript(
         "$('%s').observe('click', hideMe());",
@@ -241,7 +243,7 @@ public class MyComponent
 }
 </pre>
 </div></div></div><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>Tapestry 5.1 and earlier</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: text; gutter: false; theme: Default" 
style="font-size:12px;">void afterRender()
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: text; 
gutter: false; theme: Default" data-theme="Default">void afterRender()
 {
     javaScriptSupport.addScript(String.format(
         "$('%s').observe('click', hideMe());",
@@ -249,29 +251,29 @@ public class MyComponent
 }
 </pre>
 </div></div></div></div></div></div><p>When calling the method, the format 
string can include standard substitutions (such as '%s') for arguments. This 
saves you the trouble of calling String.format() yourself. (For Tapestry 5.1 
and earlier, you must call String.format() yourself.) In any case, the 
formatted JavaScript is added to the script block in the rendered 
output.</p><h3 id="LegacyJavaScript-InjectingJavaScriptSupport">Injecting 
JavaScriptSupport</h3><p>JavaScriptSupport (like RenderSupport before it) is an 
<em>environmental</em> object, so you will normally inject it via the @<a  
class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Environmental.html";>Environmental</a>
 annotation:</p><div class="sectionColumnWrapper"><div 
class="sectionMacro"><div class="sectionMacroRow"><div class="columnMacro"><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader 
panelHeader pdl" style="border-bottom-width: 1px;"><b
 >For Tapestry 5.2 and later</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Environmental
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Environmental
   private JavaScriptSupport javaScriptSupport;
 </pre>
 </div></div></div><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>For Tapestry 5.0 and 5.1</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Environmental
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Environmental
   private RenderSupport renderSupport;
 </pre>
 </div></div></div></div></div></div><p>The @Environmental annotation only 
works inside components, but occasionally you may want to inject 
JavaScriptSupport (or RenderSupport) into a service. Fortunately, a proxy has 
been set up to allow the use of @Inject instead:</p><div 
class="sectionColumnWrapper"><div class="sectionMacro"><div 
class="sectionMacroRow"><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>For Tapestry 5.2 and later</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Inject
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Inject
   private JavaScriptSupport javaScriptSupport;
 </pre>
 </div></div></div><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>For Tapestry 5.0 and 5.1</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Inject
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Inject
   private RenderSupport renderSupport;
 </pre>
 </div></div></div></div></div></div><p>... or, in a service implementation 
constructor:</p><div class="sectionColumnWrapper"><div 
class="sectionMacro"><div class="sectionMacroRow"><div class="columnMacro"><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader 
panelHeader pdl" style="border-bottom-width: 1px;"><b>For Tapestry 5.2 and 
later</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  public MyServiceImpl(JavaScriptSupport support)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  public 
MyServiceImpl(JavaScriptSupport support)
   {
     . . .
   }
 </pre>
 </div></div></div><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>For Tapestry 5.0 and 5.1</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  public MyServiceImpl(RenderSupport support)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  public 
MyServiceImpl(RenderSupport support)
   {
     . . .
   }
@@ -289,7 +291,7 @@ public class MyComponent
 
 
 </div><p>In production mode, Tapestry can automatically <em>minify</em> 
(intelligently compresses) JavaScript libraries (and CSS) when the application 
starts up. This can significantly decrease the size of static content that the 
browser needs to download.</p><p>Minification is accomplished using the 
ResourceMinimizer service. A YUI Compressor-based implementation is available, 
but this can be overridden.</p><p>IMPORTANT NOTE: The tapestry-core module only 
provides the empty infrastructure for supporting minification; the actual logic 
is supplied in the tapestry-yuicompressor module. To use it, you'll need to 
update your dependencies to include this module.</p><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>Maven pom.xml (partial)</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default" 
style="font-size:12px;">&lt;dependency&gt;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml; 
gutter: false; theme: Default" data-theme="Default">&lt;dependency&gt;
     &lt;groupId&gt;org.apache.tapestry&lt;/groupId&gt;
     &lt;artifactId&gt;tapestry-yuicompressor&lt;/artifactId&gt;
     &lt;version&gt;${tapestry-release-version}&lt;/version&gt;
@@ -302,13 +304,13 @@ public class MyComponent
 
 
 </div><p>In versions prior to 5.3, Tapestry used a modified version of the 
Blackbird JavaScript console. The Tapestry object includes three functions: 
debug, warn and error.</p><p>Each of these functions take a message and an 
optional pattern; if the pattern is provided, the message is interpolated on 
the pattern. The final message is displayed in the Blackbird console, which 
will make itself visible automatically.</p><p>In production mode, debug 
messages will be filtered out (they will not be visible until the user presses 
F2 to display the console, and then clicks the grayed out icon for debug 
messages). In development mode, debug messages are not filtered 
out.</p><p>Example usage:</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;"> Tapestry.debug("Field id is #{id}, value is #{value}", 
field);
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default"> Tapestry.debug("Field id 
is #{id}, value is #{value}", field);
 
  Tapestry.error("Server is not available.");
 
 </pre>
 </div></div><p>With Tapestry 5.3 and later the Blackbird console has been 
removed; just use the standard console logging features (e.g. 
<code>console.log()</code>) built into modern browsers.</p><h1 
id="LegacyJavaScript-HandlingSlowPageLoads">Handling Slow Page Loads</h1><p>If 
your page loads slowly (typically, because of scripts loaded from external 
sites), you may see a race condition where the user can click on a link before 
an event handler for that link has been wired up.</p><p>The client-side 
function <code>Tapestry.waitForPage()</code> can be used in an element's 
onclick handler to force a wait for the page to fully load. In this race 
condition, the screen will dim and a message will appear advising the user to 
wait a moment; once the page is fully loaded, this modal dialog will be 
removed.</p><p>The correct usage is:</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;">  &lt;a href="..." 
onclick="javascript:Tapestry.waitForPage(event);"&gt; ... &lt;/a&gt;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  &lt;a href="..." 
onclick="javascript:Tapestry.waitForPage(event);"&gt; ... &lt;/a&gt;
 </pre>
 </div></div><p>The constant <a  class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/MarkupConstants.html";>MarkupConstants.WAIT_FOR_PAGE</a>
 contains the part of this snippet inside the quotes.</p><h1 
id="LegacyJavaScript-TheStandardTapestryLibrary">The Standard Tapestry 
Library</h1><p>Tapestry's client-side support, the standard Tapestry library, 
consists of <code>tapestry.js</code>, which has dependencies on Prototype and 
on Scriptaculous Effects. tapestry.js, along with its dependencies. The 
tapestry.js library is automatically added to the page when your code adds any 
other JavaScript or JavaScript library.</p><h2 
id="LegacyJavaScript-TapestryNamespace">Tapestry Namespace</h2><p>Tapestry 
defines a number of object and classes inside the Tapestry namespace.</p><p>It 
also adds a handful of methods to the Form class, and to Form elements. These 
are mostly related to input validation and determining element 
visibility.</p><h2 id="LegacyJavaScri
 pt-TheTapestryObject$T()">The Tapestry Object $T()</h2>
 
@@ -317,10 +319,10 @@ public class MyComponent
 
 
 </div><p>The standard library adds a new function, <code>$T()</code>. This 
function is used much like Prototype's <code>$()</code>, except that instead of 
returning a DOM object, it returns a hash (an initially empty JavaScript 
object) that is associated with the DOM object. This hash is known as <em>the 
Tapestry object</em>.</p><p>You may pass in an object id (as a string) or an 
object reference. The Tapestry Object is created on first invocation. Note: 
you'll see it as a property name _tapestry on the DOM object (which may be 
useful when debugging).</p><p>When Tapestry adds information to a DOM object, 
it does so in the Tapestry object. This helps avoid name conflicts, and groups 
all Tapestry-added properties into one place which is much easier to 
debug.</p><p>For example, you might store a value for an element in one 
place:</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;">  $T(myid).fadeDuration = .5;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  $T(myid).fadeDuration = 
.5;
 </pre>
 </div></div><p>Then use it somewhere else:</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;">  new Effect.Fade($(myId), { duration: 
$T(myid).fadeDuration });
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  new Effect.Fade($(myId), 
{ duration: $T(myid).fadeDuration });
 </pre>
 </div></div><h1 id="LegacyJavaScript-AjaxComponentsandMixins">Ajax Components 
and Mixins</h1><p class="confluence-link">Tapestry provides easy-to-use support 
for <em>Ajax</em>, the technique of using JavaScript to dynamically updating 
parts of a web page with content from the server without redrawing the whole 
page. See&#160;<a  href="ajax-and-zones.html">Ajax and Zones</a> for 
details.</p><h1 id="LegacyJavaScript-Built-inLibraries">Built-in 
Libraries</h1><div style="float: right; max-width: 30%"><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>Alternatives to Prototype</b></div><div class="panelContent">
 <p>Tapestry 5.4 includes the ability to switch between Prototype and JQuery. 
For Tapestry 5.3 and earlier, you also have some options::</p><ul><li><a  
class="external-link" href="https://github.com/got5/tapestry5-jquery"; 
rel="nofollow">Tapestry5-Jquery module</a>&#160;&#8211; Using JQuery 
<em>instead of</em> Prototype</li><li><a  class="external-link" 
href="http://wiki.apache.org/tapestry/Tapestry5HowToIntegrateJQuery";>Tapestry5HowToIntegrateJQuery</a>&#160;&#8211;
 Using JQuery <em>in addition to</em> Prototype</li><li><a  
class="external-link" 
href="https://issues.apache.org/jira/browse/TAP5-1364";>TAPS-1364</a>&#160;&#8211;
 lists some starting points for ExtJS integration</li></ul>
@@ -328,7 +330,7 @@ public class MyComponent
 
 
 <p>&#160;</p><p>Tapestry 5.4 and earlier come with the <a  
class="external-link" href="http://www.prototypejs.org/"; 
rel="nofollow">Prototype</a> and <a  class="external-link" 
href="http://script.aculo.us/"; rel="nofollow">Scriptaculous</a> libraries ... 
no extra download is required. Tapestry will automatically link into your pages 
the prototype.js, scriptaculous.js, and effects.js libraries, as well as the 
Tapestry library, tapestry.js (which largely consists of support for form input 
validation). Starting with Tapestry 5.3, <a  class="external-link" 
href="http://documentcloud.github.com/underscore/"; 
rel="nofollow">Underscore</a> is also included.</p><h2 
id="LegacyJavaScript-PrototypeandScriptaculousVersions">Prototype and 
Scriptaculous Versions</h2><p>Tapestry included only Prototype and 
Scriptaculous in versions prior to Tapestry 5.4. See <a  
href="supported-environments-and-versions.html">Supported Environments and 
Versions</a> for a matrix of prototype and scriptaculous versions
  supported by Tapestry.</p><p>In versions before 5.4, Tapestry used a modified 
version of the main Scriptaculous library, scriptaculous.js, with the library's 
default <a  class="external-link" 
href="http://wiki.script.aculo.us/scriptaculous/show/Usage"; 
rel="nofollow">autoloading</a> behavior turned off. This lets Tapestry and 
Tapestry components control which Scriptaculus scripts are loaded, rather than 
having <em>all</em> of them loaded unnecessarily.</p><p>If you need access to 
other Scriptaculous libraries, you can provide them as follows:</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;">  @Inject @Path("${tapestry.scriptaculous}/dragdrop.js")
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Inject 
@Path("${tapestry.scriptaculous}/dragdrop.js")
   private Asset dragDropLibrary;
 
   @Environmental
@@ -347,7 +349,7 @@ public class MyComponent
 
 
 </div><p>Tapestry allows you to define groups of related JavaScript libraries 
and stylesheets as "stacks". The built-in "core" stack is used to define the 
core JavaScript libraries needed by Tapestry (currently, this includes 
Prototype and Scriptaculous, as well as Tapestry-specific libraries). Other 
component libraries may define additional stacks for related sets of resources, 
for example, to bundle together some portion of the ExtJS or YUI 
libraries.</p><p>A <a  class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/javascript/JavaScriptStack.html";>JavaScriptStack</a>
 can be thought of as a generalization of Tapestry 5.1's ClientInfrastructure, 
which exists now to define the "core" JavaScript stack.</p><p>JavaScript assets 
of a stack may (when enabled) be exposed to the client as a single URL 
(identifying the stack by name). The individual assets are combined into a 
single virtual asset, which is then streamed to the client.</p><p>To 
 group several static resources together in a single stack, you must create a 
new implementation of the JavaScriptStack interface . This interface has four 
methods:</p><ul class="alternate"><li><strong>getStylesheets</strong> : This 
method will return a list of stylesheet files (StylesheetLink-type object) 
associated to this stack</li></ul><ul 
class="alternate"><li><strong>getJavaScriptLibraries</strong> : This method 
will return a list of javascript files (Asset-type object) associated to this 
stack</li></ul><ul class="alternate"><li><strong>getStacks</strong> : It is 
also possible to make a stack dependant of other stacks. All the stacks defined 
in this method will be loaded before the current stack.</li></ul><ul 
class="alternate"><li><strong>getInitialization</strong> : this method makes it 
possible to call a JavaScript initialization for the stack. Tapestry will 
automatically add this initialization to the page that imports the 
stacks.</li></ul><div class="code panel pdl" style="
 border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>myStack.java</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">public class myStack implements JavaScriptStack {
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">public class myStack 
implements JavaScriptStack {
 
     private final AssetSource assetSource;
 
@@ -391,19 +393,19 @@ public class MyComponent
 }
 </pre>
 </div></div><p>When your new Stack is created, you have to define it in your 
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;">@Contribute(JavaScriptStackSource.class)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" 
data-theme="Default">@Contribute(JavaScriptStackSource.class)
 public static void addMyStack (MappedConfiguration&lt;String, 
JavaScriptStack&gt; configuration)
 {
         configuration.addInstance("MyNewStack", myStack.class);
 }
 </pre>
 </div></div><p>You can now use it in your pages and components, by using the 
@Import annotation or the JavaScriptSupport service :</p><div 
class="sectionColumnWrapper"><div class="sectionMacro"><div 
class="sectionMacroRow"><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>With @Import</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Import(stack="MyNewStack")
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  
@Import(stack="MyNewStack")
   public class myPage {
   }
 </pre>
 </div></div></div><div class="columnMacro"><div class="code panel pdl" 
style="border-width: 1px;"><div class="codeHeader panelHeader pdl" 
style="border-bottom-width: 1px;"><b>With JavaScriptSupport</b></div><div 
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">@Inject
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">@Inject
 private JavaScriptSupport js;
 
 @SetupRender

Modified: websites/production/tapestry/content/limitations.html
==============================================================================
--- websites/production/tapestry/content/limitations.html (original)
+++ websites/production/tapestry/content/limitations.html Sun Apr 26 21:22:55 
2020
@@ -78,11 +78,11 @@
 
       <div id="content">
                 <div id="ConfluenceContent"><h1 
id="Limitations-Limitations">Limitations</h1><h2 
id="Limitations-Contents">Contents</h2><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1587536390181 {padding: 0px;}
-div.rbtoc1587536390181 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536390181 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587936030417 {padding: 0px;}
+div.rbtoc1587936030417 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587936030417 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536390181">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587936030417">
 <ul class="toc-indentation"><li><a  
href="#Limitations-HowdoIaddnewcomponentstoanexistingpagedynamically?">How do I 
add new components to an existing page dynamically?</a></li><li><a  
href="#Limitations-Whydoesn'tmyserviceimplementationreloadwhenIchangeit?">Why 
doesn't my service implementation reload when I change it?</a></li><li><a  
href="#Limitations-HowdoIrunmultipleTapestryapplicationsinthesamewebapplication?">How
 do I run multiple Tapestry applications in the same web 
application?</a></li></ul>
 </div><h2 
id="Limitations-HowdoIaddnewcomponentstoanexistingpagedynamically?">How do I 
add new components to an existing page dynamically?</h2><p>The short answer 
here is: <strong>you don't</strong>. The long answer here is <strong>you don't 
have to, to get the behavior you desire</strong>.</p><p>One of Tapestry basic 
values is high scalability: this is expressed in a number of ways, reflecting 
scalability concerns within a single server, and within a cluster of 
servers.</p><p>Although you code Tapestry pages and components as if they were 
ordinary POJOs (<span>Plain Old Java Objects -- Tapestry does not require you 
to extend any base classes or implement any special interfaces)</span><span>, 
as deployed by Tapestry they are closer to a traditional servlet: a single 
instance of each page services requests from multiple threads. Behind the 
scenes, Tapestry transforms you code, rewriting it on the 
fly.</span></p><p>What this means is that <em>any</em> incoming request must be 
handled 
 by a <em>single page instance</em>. Therefore, Tapestry enforces the concept 
of <strong>static structure, dynamic behavior</strong>.</p><p>Tapestry provides 
quite a number of ways to vary what content is rendered, well beyond simple 
conditionals and loops. It is possible to "drag in" components from other pages 
when rendering a page (other FAQs will expand on this concept). The point is, 
that although a Tapestry page's structure is very rigid, the order in which the 
components of the page render does not have to be top to bottom.</p><h2 
id="Limitations-Whydoesn'tmyserviceimplementationreloadwhenIchangeit?">Why 
doesn't my service implementation reload when I change it?</h2><p>Main article: 
<a  href="service-implementation-reloading.html">Service Implementation 
Reloading</a></p><p>Live service reloading has some limitations:</p><ul><li>The 
service must define a service interface.</li><li>The service implementation 
must be on the file system (not inside a JAR).</li><li>The implementati
 on must be instantiated by Tapestry, not inside code (even code inside a 
module class).</li><li>The service must use the default <a  
href="limitations.html">scope</a> (reloading of perthread scopes is not 
supported).</li></ul><p>Consider the following example module:</p><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeContent 
panelContent pdl">
 <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: true; theme: Default" data-theme="Default">public static void 
bind(ServiceBinder binder)

Modified: websites/production/tapestry/content/link-components-faq.html
==============================================================================
--- websites/production/tapestry/content/link-components-faq.html (original)
+++ websites/production/tapestry/content/link-components-faq.html Sun Apr 26 
21:22:55 2020
@@ -78,11 +78,11 @@
 
       <div id="content">
                 <div id="ConfluenceContent"><p>&#160;</p><p>&#160;</p><h1 
id="LinkComponentsFAQ-LinkComponents">Link Components</h1><p>Main Articles: <a  
href="page-navigation.html">Page Navigation</a>, <a  
href="component-parameters.html">Component Parameters</a></p><h2 
id="LinkComponentsFAQ-Contents">Contents</h2><p><style 
type="text/css">/*<![CDATA[*/
-div.rbtoc1587536395433 {padding: 0px;}
-div.rbtoc1587536395433 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536395433 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587935968419 {padding: 0px;}
+div.rbtoc1587935968419 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587935968419 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536395433">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587935968419">
 <ul class="toc-indentation"><li><a  
href="#LinkComponentsFAQ-HowdoIaddqueryparameterstoaPageLinkorActionLink?">How 
do I add query parameters to a PageLink or ActionLink?</a></li><li><a  
href="#LinkComponentsFAQ-HowdoIcreateaLinkbacktothecurrentpagefromacomponent?">How
 do I create a Link back to the current page from a component?</a></li></ul>
 </div><h2 
id="LinkComponentsFAQ-HowdoIaddqueryparameterstoaPageLinkorActionLink?">How do 
I add query parameters to a PageLink or ActionLink?</h2><p>These components do 
not have parameters to allow you to specify query parameters for the link; they 
both allow you to specify a <em>context</em> (one or more values to encode into 
the request path).</p><p>However, you can accomplish the same thing with a 
little code and markup. For example, to create a link to another page and pass 
a query parameter, you can replace your PageLink component with a standard 
<code>&lt;a&gt;</code> tag:</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeContent panelContent pdl">
 <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml; 
gutter: false; theme: Default" data-theme="Default">&lt;a 
href="${profilePageLink}"&gt;Display Profile (w/ full details)&lt;/a&gt;

Modified: websites/production/tapestry/content/localization.html
==============================================================================
--- websites/production/tapestry/content/localization.html (original)
+++ websites/production/tapestry/content/localization.html Sun Apr 26 21:22:55 
2020
@@ -84,29 +84,31 @@
 
 
 
+
+
 <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="templating-and-markup-faq.html">Templating 
and Markup FAQ</a>
+                        <a  href="component-classes.html">Component Classes</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-classes.html">Component Classes</a>
+                        <a  href="templating-and-markup-faq.html">Templating 
and Markup FAQ</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="localization.html">Localization</a>
@@ -115,7 +117,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>
@@ -127,7 +129,7 @@
 
 
 <p>Localization support is well integrated into Tapestry. Tapestry allows you 
to easily separate the text you present to your users from the rest of your 
application ... pull it out of your Java code and even out of your component 
templates. You can then translate your messages into other languages and let 
Tapestry put everything together.</p><h2 
id="Localization-ComponentMessageCatalogs">Component Message 
Catalogs</h2><p>Each component class may have a component message catalog. A 
component message catalog is a set of files with the extension ".properties". 
These property files are the same format used by java.util.ResourceBundle, just 
lines of <code>key=value</code>. These files are stored on the classpath, in 
the same package folder as the page or component's compiled Java 
class.</p><p>So for a class named <code>org.example.myapp.pages.MyPage</code>, 
you would have a main properties file as 
<code>org/example/myapp/pages/MyPage.properties</code>.</p><p>If you have a 
translations o
 f these values, you provide additional properties file, adding an <a  
class="external-link" 
href="http://www.loc.gov/standards/iso639-2/englangn.html"; rel="nofollow">ISO 
language code</a> before the extension. Thus, if you have a French translation, 
you could create a file <code>MyPage_fr.properties</code>.</p><p>Any values in 
the more language specific file will <em>override</em> values from the main 
properties file. If you had an even more specific localization for just French 
as spoken in France, you could create <code>MyPage_fr_FR.properties</code> 
(that's a language code plus a country code, and you can even go further and 
add variants ... but its unlikely that you'll ever need to go beyond just 
language codes in practice).</p><p>The messages in the catalog are accessed by 
keys. Tapestry ignores the case of the keys when accessing messages in the 
catalog.</p><h3 id="Localization-ComponentMessageCatalogInheritance">Component 
Message Catalog Inheritance</h3><p>If a component clas
 s is a subclass of another component class, then it inherits that base class' 
message catalog. Its own message catalog extends and overrides the values 
inherited from the base class.</p><p>In this way, you could have a base 
component class that contained common messages, and extend or override those 
messages in subclasses (just as you would extend or override the methods of the 
base component class). This, of course, works for as many levels of inheritance 
as you care to support.</p><h2 
id="Localization-Application-wideMessageCatalog">Application-wide Message 
Catalog</h2><p>If the file 
<code>WEB-INF/</code><em>AppName</em><code>.properties</code> exists in the 
context, it will be used as an application-wide message catalog. The 
<em>AppName</em> is derived from the name of the filter inside the web.xml 
file; this is most often just "app", thus <code>WEB-INF/app.properties</code>. 
The search for the file is case sensitive. The properties files may be 
localized.</p><p>Individual pages 
 and components can override the values defined in the message catalog.</p><div 
class="confluence-information-macro confluence-information-macro-warning"><p 
class="title">Avoid BOMs</p><span class="aui-icon aui-icon-small 
aui-iconfont-error confluence-information-macro-icon"></span><div 
class="confluence-information-macro-body"><p>Make sure that your properties 
files don't contain <a  class="external-link" 
href="http://en.wikipedia.org/wiki/Byte_order_mark"; rel="nofollow">byte order 
marks (BOM)</a>, because Java&#160;&#8211; and thus Tapestry&#160;&#8211; 
doesn't support BOM in properties files (see&#160;<a  class="external-link" 
href="http://bugs.sun.com/view_bug.do?bug_id=4508058"; 
rel="nofollow">http://bugs.sun.com/view_bug.do?bug_id=4508058</a>). Some 
editors write them out when saving a file in UTF-8, so watch 
out.</p></div></div><p>&#160;</p><h2 
id="Localization-PropertiesFileCharset">Properties File Charset</h2><p>Tapestry 
uses the <code>UTF-8</code> character set (charset) whe
 n reading the properties files in a message catalog. This means that you don't 
have to use the Java <code>native2ascii</code> tool.</p><h2 
id="Localization-LocalizedComponentTemplates">Localized Component 
Templates</h2><p>The same lookup mechanism applies to component templates. 
Tapestry will search for a localized version of each component template and use 
the closest match. Thus you could have <code>MyPage_fr.html</code> for French 
users, and <code>MyPage.html</code> for all other users.</p><h2 
id="Localization-AccessingLocalizedMessages">Accessing Localized 
Messages</h2><p>The above discusses what files to create and where to store 
them, but doesn't address how to make use of that information.</p><p>Messages 
can be accessed in one of two ways:</p><ul><li>Using the "message:" <a  
href="component-parameters.html">binding expression</a> in a component 
template</li><li>By injecting the component's Messages object<br clear="none"> 
In the first case, you may use the message: binding pr
 efix with component parameters, or with template expansions:</li></ul><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;">&lt;t:layout title="message:page-title"&gt;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">&lt;t:layout 
title="message:page-title"&gt;
 
   ${message:greeting}, ${user.name}!
   
@@ -135,19 +137,19 @@
 &lt;/t:layout&gt;
 </pre>
 </div></div><p>Here, the <code>page-title</code> message is extracted from the 
catalog and passed to the Border component's title parameter.</p><p>In 
addition, the <code>greeting</code> message is extracted and written into the 
response as part of the template.</p><p>As usual, "prop:" is the default 
binding prefix, thus <code>user.name</code> is a property path, not a message 
key.</p><p>You would extend this with a set of properties files:</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;">page-title=Your Account
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">page-title=Your Account
 greeting=Welcome back
 </pre>
 </div></div><p>Or, perhaps, a French version:</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;">page-title=Votre Compte
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">page-title=Votre Compte
 greeting=Bienvenue en arriere
 </pre>
 </div></div><p>Programatically, you may inject your component message catalog 
into your class, as an instance of the Messages 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;">  @Inject
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  @Inject
   private Messages messages;
 </pre>
 </div></div><p>You could then <code>get()</code> messages, or 
<code>format()</code> them:</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 String getCartSummary()     
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  public String 
getCartSummary()     
   {
     if (items.isEmpty())
       return messages.get("no-items");
@@ -156,11 +158,11 @@ greeting=Bienvenue en arriere
   }
 </pre>
 </div></div><p>The format() option works using a 
<code>java.util.Formatter</code>, with all the printf-style loveliness you've 
come to expect:</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;">no-items=Your shopping cart is empty.     
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">no-items=Your shopping cart 
is empty.     
 item-summary=You have %d items in your cart.
 </pre>
 </div></div><p>As easy as conditionals are to use inside a Tapestry template, 
sometimes it's even easier to do it in Java code.</p><h2 
id="Localization-MissingKeys">Missing Keys</h2><p>If you reference a key that 
is not in the message catalog, Tapestry does not throw an exception (because 
that would make initially developing an application very frustrating). When a 
key can not be located, a "placeholder" message is generated, such as 
"[[missing key: key-not-found]]".</p><h2 
id="Localization-Reloading">Reloading</h2><p>If you change a property file in a 
message catalog, you'll see the change immediately, just as with component 
classes and component templates (provided you're not running in <a  
href="configuration.html">production mode</a>).</p><h2 
id="Localization-AssetLocalization">Asset Localization</h2><p>When <a  
href="assets.html">injecting assets</a>, the injected asset will be localized 
as well. A search for the closest match for the active locale is made, and the 
final Asset 
 will reflect that.</p><h2 id="Localization-LocaleSelection">Locale 
Selection</h2><p>The locale for each request is determined from the HTTP 
request headers. The request locale reflects the environment of the web browser 
and possibly even the keyboard selection of the user on the client. It can be 
highly specific, for example, identifying British English (as en_GB) vs. 
American English (en).</p><p>Tapestry "narrows" the raw request locale, as 
specified in the request, to a known quantity. It uses the <a  
href="configuration.html">configuration symbol</a> 
<code>tapestry.supported-locales</code> to choose the effective locale for each 
request. This value is a comma-separated list of locale names. Tapestry 
searches the list for the best match for the request locale; for example, a 
request locale of "fr_FR" would match "fr" but not "de". If no match is found, 
then the first locale name in the list is used as the effective locale (that 
is, the first locale is used as the default for non-m
 atching requests). Thus a site that primarily caters to French speakers would 
want to list "fr" as the first locale in the list.</p><h2 
id="Localization-ChangingtheLocale">Changing the Locale</h2><p>The <a  
class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/PersistentLocale.html";>PersistentLocale
 service</a> can be used to programmatically override the locale. Note: You 
should be careful to only set the persistent locale to a supported 
locale.</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Toggle 
between English and German</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">@Inject 
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">@Inject 
 private PersistentLocale persistentLocale;
 
 void onActionFromLocaleToggle() {

Modified: websites/production/tapestry/content/logging-in-tapestry.html
==============================================================================
--- websites/production/tapestry/content/logging-in-tapestry.html (original)
+++ websites/production/tapestry/content/logging-in-tapestry.html Sun Apr 26 
21:22:55 2020
@@ -84,23 +84,25 @@
 
 
 
+
+
 <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="logging-in-tapestry.html">Logging in 
Tapestry</a>
+                        <a  href="logging.html">Logging</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="logging.html">Logging</a>
+                        <a  href="logging-in-tapestry.html">Logging in 
Tapestry</a>
                 
                         
                     </div>
@@ -155,7 +157,7 @@
 . . .
 </pre>
 </div></div><h1 
id="LogginginTapestry-ConfiguringTapestryforotherLoggingToolkits">Configuring 
Tapestry for other Logging Toolkits</h1><p>The default configuration uses 
Log4J.</p><p>If you need to use another logging system, that can be 
accomplished using Maven dependency control.</p><p>You can exclude some of the 
dependencies that Tapestry introduces, and replace them with your own. For 
example, to switch over to JDK logging, update your pom as follows:</p><div 
class="code panel pdl" style="border-width: 1px;"><div class="codeContent 
panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default" 
style="font-size:12px;"> 
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml; 
gutter: false; theme: Default" data-theme="Default"> 
   &lt;dependencies&gt;
     &lt;dependency&gt;
       &lt;groupId&gt;org.apache.tapestry&lt;/groupId&gt;

Modified: websites/production/tapestry/content/logging.html
==============================================================================
--- websites/production/tapestry/content/logging.html (original)
+++ websites/production/tapestry/content/logging.html Sun Apr 26 21:22:55 2020
@@ -84,23 +84,25 @@
 
 
 
+
+
 <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="logging-in-tapestry.html">Logging in 
Tapestry</a>
+                        <a  href="logging.html">Logging</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="logging.html">Logging</a>
+                        <a  href="logging-in-tapestry.html">Logging in 
Tapestry</a>
                 
                         
                     </div>
@@ -109,9 +111,9 @@
 
 
 <p>The default configuration for logging uses <a  class="external-link" 
href="http://logging.apache.org/log4j/";>Log4J</a> as the logging toolkit, 
though <a  href="logging-in-tapestry.html">this can be changed</a>.</p><h1 
id="Logging-ClasstoLogger">Class to Logger</h1><p>The logger name for a page or 
component matches the fully qualified class name. You can configure this in 
log4j.properties:</p><div class="code panel pdl" style="border-width: 
1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 
1px;"><b>log4j.properties</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">log4j.category.org.apache.tapestry5.integration.app1.pages.MerryChristmas=trace</pre>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" 
data-theme="Default">log4j.category.org.apache.tapestry5.integration.app1.pages.MerryChristmas=trace</pre>
 </div></div><p>&#160;</p><h1 id="Logging-InjectingLoggers">Injecting 
Loggers</h1><p>You may mark a field of type <a  class="external-link" 
href="http://www.slf4j.org/api/org/slf4j/Logger.html"; rel="nofollow">Logger</a> 
with the @Inject annotation. The proper Logger for your page or component will 
be injected.</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeHeader panelHeader pdl" style="border-bottom-width: 
1px;"><b>MyPage.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">public class MyPage
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">public class MyPage
 {
     @Inject
     private Logger logger;

Modified: websites/production/tapestry/content/maven-support-faq.html
==============================================================================
--- websites/production/tapestry/content/maven-support-faq.html (original)
+++ websites/production/tapestry/content/maven-support-faq.html Sun Apr 26 
21:22:55 2020
@@ -78,11 +78,11 @@
 
       <div id="content">
                 <div id="ConfluenceContent"><h1 
id="MavenSupportFAQ-MavenSupport">Maven Support</h1><h2 
id="MavenSupportFAQ-Contents">Contents</h2><p><style 
type="text/css">/*<![CDATA[*/
-div.rbtoc1587536401115 {padding: 0px;}
-div.rbtoc1587536401115 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536401115 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587936107986 {padding: 0px;}
+div.rbtoc1587936107986 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587936107986 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536401115">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587936107986">
 <ul class="toc-indentation"><li><a  
href="#MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why
 do Maven project names and other details show up in my pages?</a></li></ul>
 </div><h2 
id="MavenSupportFAQ-WhydoMavenprojectnamesandotherdetailsshowupinmypages?">Why 
do Maven project names and other details show up in my pages?</h2><p>Tapestry 
and maven both use the same syntax for dynamic portions of files: the 
<code>${...</code>} syntax. When Maven is copying resources from 
<code>src/main/resources</code>, and when filtering is <em>enabled</em> (which 
is not the default), then any expansions in <em>Tapestry templates</em> that 
match against Maven project properties are substituted. If you look at the 
deployed application you'll see that <code>${name</code>} is gone, replaced 
with your project's name!</p><p>The solution is to update your 
<code>pom.xml</code> and ignore any .tml files when copying and 
filtering:</p><div class="code panel pdl" style="border-width: 1px;"><div 
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>pom.xml 
(partial)</b></div><div class="codeContent panelContent pdl">
 <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml; 
gutter: false; theme: Default" data-theme="Default">  &lt;resource&gt;

Modified: websites/production/tapestry/content/menuleft.html
==============================================================================
--- websites/production/tapestry/content/menuleft.html (original)
+++ websites/production/tapestry/content/menuleft.html Sun Apr 26 21:22:55 2020
@@ -91,7 +91,17 @@
     
     <div id="footer">
             <div id="footer"><p>Apache Tapestry, Tapestry, Apache, the Apache 
feather logo, and the Apache Tapestry project logo are trademarks of The Apache 
Software Foundation.<br clear="none">
-</p><p></p><div class="aui-message aui-message-error"><p 
class="title"><strong>Error rendering macro 'html'</strong></p><p>Your 
Confluence administrator has disallowed the use of Javascript in the HTML 
macro.  This setting can be changed using  HTML for Confluence Configuration.  
Please see your administrator for details.</p></div><p></p></div>
+</p><p><script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-400821-1']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; 
ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
+  })();
+</script></p><p></p></div>
     </div>
 
     <div id="comments_thread"></div>

Added: websites/production/tapestry/content/navigationv2.html
==============================================================================
--- websites/production/tapestry/content/navigationv2.html (added)
+++ websites/production/tapestry/content/navigationv2.html Sun Apr 26 21:22:55 
2020
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+       
+       <!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<html>
+<head>
+  <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
+  <meta http-equiv="x-ua-compatible" content="IE=9">
+  <meta name="viewport" content="width=device-width, initial-scale=1"> 
+  <title>
+          NavigationV2 -- Apache Tapestry
+      </title>
+  <link type="text/css" rel="stylesheet" href="/resources/space.css" />
+
+  
+  <link href="/styles/style.css" rel="stylesheet" type="text/css"/>
+
+</head>
+
+<body>
+
+  <div class="wrapper bs">
+
+        <div id="navigation"><div class="nav"><ul class="alternate"><li><a  
href="index.html">Home</a></li><li><a  href="getting-started.html">Getting 
Started</a></li><li><a  href="documentation.html">Documentation</a></li><li><a  
href="download.html">Download</a></li><li><a  
href="about.html">About</a></li><li><a  class="external-link" 
href="http://www.apache.org/licenses/LICENSE-2.0";>License</a></li><li><a  
href="community.html">Community</a></li><li><a  class="external-link" 
href="http://www.apache.org/security/";>Security</a></li><li><a  
class="external-link" href="http://www.apache.org/";>Apache</a></li><li><a  
class="external-link" 
href="http://www.apache.org/foundation/sponsorship.html";>Sponsorship</a></li><li><a
  class="external-link" 
href="http://www.apache.org/foundation/thanks.html";>Thanks</a></li></ul></div>
+
+</div>
+
+          <div id="top">
+            <div id="smallbanner"><div class="searchbox" 
style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999; 
font-size: 90%">Tapestry docs, issues, wikis &amp; blogs:</span>
+<form enctype="application/x-www-form-urlencoded" method="get" 
action="https://tapestry.apache.org/search.html";>
+  <input type="text" name="q">
+  <input type="submit" value="Search">
+</form>
+
+</div>
+
+
+<div class="emblem" style="float:left"><p><span 
class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image 
confluence-external-resource" 
src="https://tapestry.apache.org/images/tapestry_small.png"; 
data-image-src="https://tapestry.apache.org/images/tapestry_small.png";></span></p></div>
+
+
+<div class="title" style="float:left; margin: 0 0 0 3em"><h1 
id="SmallBanner-PageTitle">NavigationV2</h1></div>
+
+</div>
+      <div class="clearer"></div>
+      </div>
+
+      <div class="clearer"></div>
+
+      <div id="breadcrumbs">
+                <a href="index.html">Apache Tapestry</a>&nbsp;&gt;&nbsp;<a 
href="index.html">Index</a>&nbsp;&gt;&nbsp;<a 
href="navigationv2.html">NavigationV2</a>
+        <a class="edit" title="Edit this page (requires approval -- just ask 
on the mailing list)" 
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=152112575";>edit</a>
+      </div>
+
+      <div id="content">
+                <div id="ConfluenceContent"><p><header>
+  <div class="container-fluid">
+    <div class="row">
+      <div class="col-12">
+        <nav class="navbar navbar-expand-xl navbar-light 
justify-content-between">
+          <a  class="navbar-brand" href="index.html">
+            <img src="images/apache-tapestry-icon-dark.svg" width="30" 
alt="Apache Tapestry" title="Apache Tapestry">
+            <span>Apache Tapestry</span>
+          </a>
+          <button type="button" class="navbar-toggler" data-toggle="collapse" 
data-target="#navbarCollapse" aria-controls="navbarCollapse" 
aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+          </button>
+          <div class="collapse navbar-collapse" id="navbarCollapse">
+            <ul class="navbar-nav mx-auto"><li class="nav-item">
+                <a  class="nav-link active" 
href="getting-started.html">Getting Started</a>
+              </li><li class="nav-item">
+                <a  class="nav-link active" 
href="documentation.html">Documentation</a>
+              </li><li class="nav-item">
+                <a  class="nav-link active" href="download.html">Download</a>
+              </li><li class="nav-item dropdown">
+                <a  class="nav-link dropdown-toggle active" 
id="communityNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
+                  Community
+                </a>
+                <div class="dropdown-menu" 
aria-labelledby="communityNavbarDropdown">
+                  <a  class="dropdown-item" href="community.html">Mailing 
Lists</a>
+                  <a  class="dropdown-item" 
href="https://stackoverflow.com/questions/tagged/tapestry";>StackOverflow</a>
+                  <a  class="dropdown-item" href="support.html">Support</a>
+                  <a  class="dropdown-item" href="community.html">Getting 
Involved</a>
+                  <a  class="dropdown-item" 
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=$page.id";
 title="Edit this page (requires approval, just ask on the mailing list)">Edit 
this page</a>
+                  <div class="dropdown-divider"></div>
+                  <a  class="dropdown-item" 
href="https://twitter.com/ApacheTapestry";>@ApacheTapestry</a>
+                  <a  class="dropdown-item" 
href="https://twitter.com/hashtag/tapestry5";>#tapestry5</a>
+                </div>
+              </li><li class="nav-item dropdown">
+                <a  class="nav-link dropdown-toggle active" 
id="developmentNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
+                  Development
+                </a>
+                <div class="dropdown-menu" 
aria-labelledby="developmentNavbarDropdown">
+                  <a  class="dropdown-item" 
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git";>Source Code</a>
+                  <a  class="dropdown-item" 
href="https://issues.apache.org/jira/browse/TAP5";>Issues</a>
+                </div>
+              </li><li class="nav-item dropdown">
+                <a  class="nav-link dropdown-toggle active" 
id="apacheNavbarDropdown" href="#" role="button" data-toggle="dropdown" 
aria-haspopup="true" aria-expanded="false">
+                  Apache
+                </a>
+                <div class="dropdown-menu" 
aria-labelledby="apacheNavbarDropdown">
+                  <a  class="dropdown-item" 
href="https://www.apache.org/";>About Apache</a>
+                  <a  class="dropdown-item" 
href="https://apachecon.com/?ref=royale.apache.org";>Events</a>
+                  <a  class="dropdown-item" 
href="https://www.apache.org/foundation/sponsorship.html";>Sponsorship</a>
+                  <a  class="dropdown-item" 
href="https://www.apache.org/licenses/LICENSE-2.0";>License</a>
+                  <a  class="dropdown-item" 
href="https://www.apache.org/security/";>Security</a>
+                  <a  class="dropdown-item" 
href="https://www.apache.org/foundation/thanks.html";>Thanks!</a>
+                </div>
+              </li></ul>
+            <form enctype="application/x-www-form-urlencoded" method="get" 
class="form-inline" action="search.html">
+              <input type="search" class="form-control search-input" name="q" 
placeholder="Search docs, issues, wikis and blogs" aria-label="Search">
+              <button type="submit" class="d-none">Search</button>
+            </form>
+          </div>
+        </nav>
+      </div>
+    </div>
+  </div>
+</header></p></div>
+      </div>
+
+      <div class="clearer"></div>
+    
+    <div id="footer">
+            <div id="footer"><p>Apache Tapestry, Tapestry, Apache, the Apache 
feather logo, and the Apache Tapestry project logo are trademarks of The Apache 
Software Foundation.<br clear="none">
+</p><p><script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-400821-1']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; 
ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 
'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s);
+  })();
+</script></p><p></p></div>
+    </div>
+
+    <div id="comments_thread"></div>
+    <script type="text/javascript" 
src="https://comments.apache.org/show_comments.lua?site=tapestry&amp;page=http://tapestry.apache.org/navigationv2.html";
 async="true">
+    </script>
+    <noscript>
+      <iframe width="100%" height="500" 
src="https://comments.apache.org/iframe.lua?site=tapestry&amp;page=http://tapestry.apache.org/navigationv2.html";></iframe>
+    </noscript>
+
+  </div>
+
+</body>
+</html>

Modified: websites/production/tapestry/content/object-providers.html
==============================================================================
--- websites/production/tapestry/content/object-providers.html (original)
+++ websites/production/tapestry/content/object-providers.html Sun Apr 26 
21:22:55 2020
@@ -76,17 +76,17 @@
 
       <div id="content">
                 <div id="ConfluenceContent"><p>When you don't provide the @<a  
class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/InjectService.html";>InjectService</a>
 annotation on a parameter (to a service builder method or constructor), 
Tapestry will resolve the parameter automatically.</p><p>This is called 
<em>object injection</em>, rather than <em>service injection</em>, because the 
value that will ultimately be injected is not necessarily a service; it may be 
some arbitrary object.</p><p>If this sounds vague, its because there is not 
just one <a  class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/ObjectProvider.html";>ObjectProvider</a>;
 there's a whole set of them, forming a <a  
href="chainbuilder-service.html">chain of command</a>. The commands in the 
chain may provide an object based on the parameter type, or based on additional 
annotations on the parameter.</p><p>There are 
 several built-in object providers:</p><ul><li>Check for @<a  
class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Value.html";>Value</a>
 annotation</li><li>Check for @<a  class="external-link" 
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Symbol.html";>Symbol</a>
 annotation</li><li>Check for a <em>unique</em> service in the Registry whose 
service interface matches the parameter type<br clear="none"> Usually, the 
@Inject annotation is supplemented by an additional annotation which triggers a 
specific ObjectProvider to provide the value.</li></ul><h1 
id="ObjectProviders-@ValueAnnotationProvider">@Value Annotation 
Provider</h1><p>The Value annotation allows a literal value to be injected. 
When combined with <a  href="object-providers.html">symbols</a>, they represent 
a way for parts of the overall service network to be spot-configured. For 
example:</p><div class="code panel pdl" style="border-w
 idth: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  public MyService build(@Value("${max-seconds}") long 
maxSeconds)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  public MyService 
build(@Value("${max-seconds}") long maxSeconds)
   {
     return new MyServiceImpl(maxSeconds);
   }</pre>
 </div></div><p>Here, the MyService service requires a configuration of a 
number of seconds. The value is supplied as a symbol, with a factory default 
that may be overwritten with an application default.</p><p>Usually, the symbol 
reference is only part of the string, i.e. 
<code>@Value("${report.dir}/${report.name}.txt")</code></p><h1 
id="ObjectProviders-@SymbolAnnotationProvider">@Symbol Annotation 
Provider</h1><p>This is closely related to the @Value annotation approach, 
except that the annotation directly specifies a symbol name.</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 MyService build(@Symbol("max-seconds") long 
maxSeconds)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  public MyService 
build(@Symbol("max-seconds") long maxSeconds)
   {
     return new MyServiceImpl(maxSeconds);
   }</pre>
 </div></div><h1 id="ObjectProviders-ServiceProvider">Service 
Provider</h1><p>This is always that last object provider checked.</p><p>A 
<em>single</em> service must exist whose service interface matches the 
parameter type. This is <em>not</em> an exact match: a search is made for any 
and all services whose service interface is a super class of the parameter 
type.</p><p>An exception is thrown if there are no matches, or if there are 
multiple matches.</p><h1 id="ObjectProviders-AliasObjectProvider">Alias Object 
Provider</h1><p>The tapestry-core module defines the <a  
href="aliases.html">Alias object provider</a>, which is used as a way to 
override services or disambiguate services (when multiple services implement 
the same interface).</p><h1 id="ObjectProviders-DefiningNewProviders">Defining 
New Providers</h1><p>New providers can be specified by contributing to the 
MasterObjectProvider service's configuration. The configuration is mapped, with 
the keys being the provider prefix, and th
 e values being the object provider implementation.</p><p>Example:</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 void 
contributeMasterObjectProvider(OrderedConfiguration&lt;ObjectProvider&gt; 
configuration)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; 
gutter: false; theme: Default" data-theme="Default">  public void 
contributeMasterObjectProvider(OrderedConfiguration&lt;ObjectProvider&gt; 
configuration)
   {
     configuration.add("MyObject", new MyObjectProvider());
   }</pre>

Modified: websites/production/tapestry/content/operation-tracker.html
==============================================================================
--- websites/production/tapestry/content/operation-tracker.html (original)
+++ websites/production/tapestry/content/operation-tracker.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="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>
@@ -98,10 +100,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>


Reply via email to