You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by bu...@apache.org on 2015/07/26 23:19:57 UTC

svn commit: r959684 [2/5] - in /websites/production/tapestry/content: ./ cache/

Modified: websites/production/tapestry/content/css.html
==============================================================================
--- websites/production/tapestry/content/css.html (original)
+++ websites/production/tapestry/content/css.html Sun Jul 26 21:19:56 2015
@@ -32,7 +32,6 @@
   <script src='/resources/highlighter/scripts/shCore.js' type='text/javascript'></script>
   <script src='/resources/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
   <script src='/resources/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
-  <script src='/resources/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
   <script type="text/javascript">
   SyntaxHighlighter.defaults['toolbar'] = false;
   SyntaxHighlighter.all();
@@ -67,8 +66,55 @@
   </div>
 
 <div id="content">
-<div id="ConfluenceContent"><h1 id="CSS-CascadingStyleSheets">Cascading Style Sheets</h1><div class="navmenu" style="float:right; background:#eee; margin:3px; padding:3px">
-<div class="error"><span class="error">Error formatting macro: contentbylabel: com.atlassian.confluence.api.service.exceptions.BadRequestException: Could not parse cql : null</span> </div></div><p>Most web applications delegate to <strong>Cascading Style Sheets</strong> (CSS) the stylistic details of the page &#8211; fonts, colors, margins, borders and alignment. This helps the remaining HTML to remain simple and semantic, which usually makes it easier to read and maintain.</p><p>Tapestry includes sophisticated support for CSS in the form of annotation-based linking, far-future expire headers, automatic duplicate removal, and other features provided for <a shape="rect" href="assets.html">assets</a>.</p><h2 id="CSS-Defaultstylesheet">Default style sheet</h2><p>Tapestry includes a built-in style sheet, tapestry.css, in all HTML documents (documents that have an outer &lt;html&gt; element and a nested &lt;head&gt; element), as part of the "core" JavaScript stack. The core JavaScript st
 ack also includes the CSS for <a shape="rect" class="external-link" href="http://getbootstrap.com/" >Bootstrap 3.1.1</a>.</p><h2 id="CSS-AddingyourownCSS">Adding your own CSS</h2><p>A page or component (for example, a <a shape="rect" href="layout-component.html">layout component</a>) that is rendering the &lt;head&gt; tag can add a style sheet directly in the markup.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<div id="ConfluenceContent"><p>Most web applications delegate to <strong>Cascading Style Sheets</strong> (CSS) the stylistic details of the page &#8211; fonts, colors, margins, borders and alignment. This helps the remaining HTML to remain simple and semantic, which usually makes it easier to read and maintain.</p><div class="aui-label" style="float:right" title="Related Articles">
+
+
+
+
+
+
+
+
+<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>
+
+        <div class="details">
+                        <a shape="rect" href="layout-component.html">Layout Component</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="css.html">CSS</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="legacy-javascript.html">Legacy JavaScript</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="assets.html">Assets</a>
+                
+                        
+                    </div>
+    </li></ul>
+</div><p>Tapestry includes sophisticated support for CSS in the form of annotation-based linking, far-future expire headers, automatic duplicate removal, and other features provided for <a shape="rect" href="assets.html">assets</a>.</p><h2 id="CSS-Defaultstylesheet">Default style sheet</h2><p>Tapestry includes a built-in style sheet, tapestry.css, in all HTML documents (documents that have an outer &lt;html&gt; element and a nested &lt;head&gt; element), as part of the "core" JavaScript stack. The core JavaScript stack also includes the CSS for <a shape="rect" class="external-link" href="http://getbootstrap.com/" >Bootstrap 3.1.1</a>.</p><h2 id="CSS-AddingyourownCSS">Adding your own CSS</h2><p>A page or component (for example, a <a shape="rect" href="layout-component.html">layout component</a>) that is rendering the &lt;head&gt; tag can add a style sheet directly in the markup.</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;head&gt;
   &lt;link href="/css/site.css" rel="stylesheet" type="text/css"/&gt;
   . . .

Modified: websites/production/tapestry/content/development-dashboard.html
==============================================================================
--- websites/production/tapestry/content/development-dashboard.html (original)
+++ websites/production/tapestry/content/development-dashboard.html Sun Jul 26 21:19:56 2015
@@ -57,7 +57,7 @@
   </div>
 
 <div id="content">
-<div id="ConfluenceContent"><h1 id="DevelopmentDashboard-DevelopmentDashboard">Development&#160;Dashboard</h1><p>Tapestry has a built-in Dashboard that is typically only available to requests from localhost (the page is whitelist access only, see <a shape="rect" href="security.html">Security</a>).</p><p><span style="line-height: 1.4285715;">The dashboard provides developer features that can help identify and resolve problems in the application.&#160;</span><span style="line-height: 1.4285715;">Some features of the dashboard are only available in development mode.</span></p><p>The dashboard is available via the URI "core/t5dashboard", or can be accessed by the <a shape="rect" class="external-link" href="http://tapestry.apache.org/5.4/apidocs/org/apache/tapestry5/corelib/components/DevTool.html">DevTool</a> component's dropdown menu.</p><p><span style="line-height: 1.4285715;">&#160;</span></p><p><span class="confluence-embedded-file-wrapper image-center-wrapper confluence-embedded-ma
 nual-size"><img class="confluence-embedded-image confluence-content-image-border image-center" width="500" src="development-dashboard.data/Tapestry_5_Dashboard_-_pages.png"></span></p><p>By default, there are three tabs (this is extensible).</p><h2 id="DevelopmentDashboard-Pages">Pages</h2><p>The pages tab shows what pages are currently loaded into the application. Tapestry only loads a page when it is first needed.</p><p>It is possible to clear out Tapestry's caches, forcing a reload. You can also run a garbage collection (GC).</p><p>It is possible to load any individual page, or attempt to load all pages. This can be a good way to see if all pages (and templates) are error free ... loading all will catch quite a few potential errors.</p><h2 id="DevelopmentDashboard-Services">Services</h2><p>When using Tapestry there will often be a large number of services defined in the registry; a mix of the built-in services provided by the framework and your own.</p><p>Services are usually onl
 y instantiated once they are needed.</p><p><span class="confluence-embedded-file-wrapper image-center-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image confluence-content-image-border image-center" width="500" src="development-dashboard.data/Tapestry_5_Dashboard.png"></span></p><p>Services may be builtin, defined, virtual or real.</p><p><strong>Builtin</strong> only applies to a few special services that are part of Tapestry IoC.</p><p><strong>Defined</strong> services are defined in some module, but have not yet been referenced in any way.</p><p><strong>Virtual</strong> services have been referenced and have gotten as far as creating a service proxy.</p><p><strong>Real</strong> services have had methods invoked, this forces the <em>realization</em> of the service which includes instantiating the service, injecting dependencies, and decorating with any applicable interceptors.</p><h2 id="DevelopmentDashboard-ComponentLibraries">Component Libraries</h2><p
 ><span class="confluence-embedded-file-wrapper image-center-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image confluence-content-image-border image-center" width="500" src="development-dashboard.data/Tapestry_5_Dashboard_-_libs.png"></span></p><p>This page gives a summary of all component libraries used in the current application.</p></div>
+<div id="ConfluenceContent"><p>The <strong>development dashboard</strong> is a built-in Tapestry page that can help identify and resolve problems in your application.</p><p>The dashboard is typically only available to requests from localhost (the page is whitelist access only, see <a shape="rect" href="security.html">Security</a>).</p><p><span style="line-height: 1.4285715;">Some features of the dashboard are only available in development mode.</span></p><p>The dashboard is available via the URI "core/t5dashboard", or can be accessed by the <a shape="rect" class="external-link" href="http://tapestry.apache.org/5.4/apidocs/org/apache/tapestry5/corelib/components/DevTool.html">DevTool</a> component's dropdown menu.</p><p><span style="line-height: 1.4285715;">&#160;</span></p><p><span class="confluence-embedded-file-wrapper image-center-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image confluence-content-image-border image-center" width="500" src="developme
 nt-dashboard.data/Tapestry_5_Dashboard_-_pages.png"></span></p><p>By default, there are three tabs (this is extensible).</p><h2 id="DevelopmentDashboard-Pages">Pages</h2><p>The pages tab shows what pages are currently loaded into the application. Tapestry only loads a page when it is first needed.</p><p>It is possible to clear out Tapestry's caches, forcing a reload. You can also run a garbage collection (GC).</p><p>It is possible to load any individual page, or attempt to load all pages. This can be a good way to see if all pages (and templates) are error free ... loading all will catch quite a few potential errors.</p><h2 id="DevelopmentDashboard-Services">Services</h2><p>When using Tapestry there will often be a large number of services defined in the registry; a mix of the built-in services provided by the framework and your own.</p><p>Services are usually only instantiated once they are needed.</p><p><span class="confluence-embedded-file-wrapper image-center-wrapper confluence-
 embedded-manual-size"><img class="confluence-embedded-image confluence-content-image-border image-center" width="500" src="development-dashboard.data/Tapestry_5_Dashboard.png"></span></p><p>Services may be builtin, defined, virtual or real.</p><p><strong>Builtin</strong> only applies to a few special services that are part of Tapestry IoC.</p><p><strong>Defined</strong> services are defined in some module, but have not yet been referenced in any way.</p><p><strong>Virtual</strong> services have been referenced and have gotten as far as creating a service proxy.</p><p><strong>Real</strong> services have had methods invoked, this forces the <em>realization</em> of the service which includes instantiating the service, injecting dependencies, and decorating with any applicable interceptors.</p><h2 id="DevelopmentDashboard-ComponentLibraries">Component Libraries</h2><p><span class="confluence-embedded-file-wrapper image-center-wrapper confluence-embedded-manual-size"><img class="confluen
 ce-embedded-image confluence-content-image-border image-center" width="500" src="development-dashboard.data/Tapestry_5_Dashboard_-_libs.png"></span></p><p>This page gives a summary of all component libraries used in the current application.</p></div>
 </div>
 
 <div class="clearer"></div>

Modified: websites/production/tapestry/content/environmental-services.html
==============================================================================
--- websites/production/tapestry/content/environmental-services.html (original)
+++ websites/production/tapestry/content/environmental-services.html Sun Jul 26 21:19:56 2015
@@ -67,27 +67,11 @@
   </div>
 
 <div id="content">
-<div id="ConfluenceContent"><h1 id="EnvironmentalServices-EnvironmentalServices">Environmental Services</h1>
-
-<div class="navmenu" style="float:right; width:30%; background:#eee; margin:3px; padding:3px">
+<div id="ConfluenceContent"><div class="navmenu" style="float:right; width:30%; background:#eee; margin:3px; padding:3px">
 <p>Environmental services represent yet another, distinct form of injection.</p>
 
-<p>Unlike service injection (injection via a service implementation's constructor) or normal component injection (directly into component fields, via the @Inject annotation) where the injected value is always the same, with environmental services, the injected value is very late bound and dynamic.</p></div>
-
-<p><strong>Environmental services</strong> provide a conduit of communication between two components (usually a component and the components it encloses).  The first component pushes an object of a certain type into the <em>environment</em>, and then the second component can access that object merely by defining an annotated property of the same type.</p>
-
-<p>An example of how this works is Tapestry's built-in <em>form support</em>. The <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Form.html">Form</a> component creates an object of type <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/FormSupport.html">FormSupport</a> and pushes it into the environment. Then, the enclosed form components can use that FormSupport object to participate in both the rendering of the Form and the Form's eventual submission. This is how control names and client-side ids are determined, how fields register callbacks so that they can process their part of the submission, and how fields hook themselves to client-side validation.</p>
-
-<h1 id="EnvironmentalServices-Usingthe@Environmentalannotation">Using the @Environmental annotation</h1>
-
-<p>The @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Environmental.html">Environmental</a> annotation, when used in a component class, causes the associated field to be replaced at runtime with a read-only value obtained from an Environment service provided by an enclosing component.</p>
-
-<p>A very common Environmental is <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/javascript/JavaScriptSupport.html">JavaScriptSupport</a>, used when generating <a shape="rect" href="legacy-javascript.html">client-side JavaScript</a>.</p>
-
-<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
-
-  @Inject @Path("${tapestry.scriptaculous}/dragdrop.js")
+<p>Unlike service injection (injection via a service implementation's constructor) or normal component injection (directly into component fields, via the @Inject annotation) where the injected value is always the same, with environmental services, the injected value is very late bound and dynamic.</p></div><strong>Environmental services</strong> provide a conduit of communication between two components (usually a component and the components it encloses). The first component pushes an object of a certain type into the <em>environment</em>, and then the second component can access that object merely by defining an annotated property of the same type.<p>An example of how this works is Tapestry's built-in <em>form support</em>. The <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Form.html">Form</a> component creates an object of type <a shape="rect" class="external-link" href="http://tapestry.apache.org/curr
 ent/apidocs/org/apache/tapestry5/services/FormSupport.html">FormSupport</a> and pushes it into the environment. Then, the enclosed form components can use that FormSupport object to participate in both the rendering of the Form and the Form's eventual submission. This is how control names and client-side ids are determined, how fields register callbacks so that they can process their part of the submission, and how fields hook themselves to client-side validation.</p><h1 id="EnvironmentalServices-Usingthe@Environmentalannotation">Using the @Environmental annotation</h1><p>The @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Environmental.html">Environmental</a> annotation, when used in a component class, causes the associated field to be replaced at runtime with a read-only value obtained from an Environment service provided by an enclosing component.</p><p>A very common Environmental is <a shape="rect" class="e
 xternal-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/javascript/JavaScriptSupport.html">JavaScriptSupport</a>, used when generating <a shape="rect" href="legacy-javascript.html">client-side JavaScript</a>.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">  @Inject @Path("${tapestry.scriptaculous}/dragdrop.js")
   private Asset dragDropLibrary;
 
   @Environmental
@@ -99,25 +83,8 @@
   }
 
 </pre>
-</div></div>
-
-<p>Environmental services are, by their nature, per-thread (and therefore per-request).</p>
-
-<p>Accessing an environmental field causes a lookup, by type, against the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/Environment.html">Environment</a> service.</p>
-
-<p>Normally, an environmental of the specified type must be available in the Environment, or an exception is thrown when accessing the field. However, if the value of the Environmental annotation's value is false, then the environmental value is optional.</p>
-
-<h1 id="EnvironmentalServices-Placingavalueintheenvironment">Placing a value in the environment</h1>
-
-<p>The Environment service has push() and pop() methods to put a value in the Environment, and discard it.</p>
-
-<p>For example, say you were building a tab-based menu system and you needed to allow an outer TabGroup component to communicate with inner Tab components, to control various aspects of presentation.</p>
-
-<p>The relevant information could be exposed as an interface, TabModel.</p>
-
-<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
-public class TabGroup
+</div></div><p>Environmental services are, by their nature, per-thread (and therefore per-request).</p><p>Accessing an environmental field causes a lookup, by type, against the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/Environment.html">Environment</a> service.</p><p>Normally, an environmental of the specified type must be available in the Environment, or an exception is thrown when accessing the field. However, if the value of the Environmental annotation's value is false, then the environmental value is optional.</p><h1 id="EnvironmentalServices-Placingavalueintheenvironment">Placing a value in the environment</h1><p>The Environment service has push() and pop() methods to put a value in the Environment, and discard it.</p><p>For example, say you were building a tab-based menu system and you needed to allow an outer TabGroup component to communicate with inner Tab components, to control various aspects of pr
 esentation.</p><p>The relevant information could be exposed as an interface, TabModel.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">public class TabGroup
 {
   @Inject
   private Environment environment;
@@ -144,40 +111,13 @@ public class Tab
   }
 }
 </pre>
-</div></div>
-
-<p>Notice that when pushing a value into the Environment, you identify its type as well as the instance. Environment maintains a number of stacks, one for each type. Thus, pushing a TabModel into the environment won't disturb the RenderSupport or other environmentals already there.</p>
-
-<p>What's important here is that the code that pushes a environmental onto a stack should also pop it off.</p>
-
-<p>The enclosed class, Tab, has full access to whatever object was pushed onto the stack by the TabGroup.</p>
-
-<p>The reason why Environment is a stack is so that a component can, when it makes sense, easily replace or intercept access to an Environmental.</p>
-
-<h1 id="EnvironmentalServices-FundamentalEnvironmentals">Fundamental Environmentals</h1>
-
-<p>Not all environmentals are pushed into the Environment by components.</p>
-
-<p>A number of environmentals are initialized as part of page rendering, even before the first component starts to render. This initialization is accomplished with <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MarkupRendererFilter.html">MarkupRendererFilter</a> contributions to the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MarkupRenderer.html">MarkupRenderer</a> service.</p>
-
-<h1 id="EnvironmentalServices-AccessingEnvironmentalsinServices">Accessing Environmentals in Services</h1>
-
-<p>The Environmental annotation only works inside components.</p>
-
-<p>To access an Environmental inside a service implementation, you must inject the Environment service and obtain values from it using the peek() method.</p>
-
-<p>If this is something that will occur frequently, it is possible to create a service implementation that is "backed" by the Environment. For example, RenderSupport is accessible as a normal injection, because a service is built for it in TapestryModule:</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 RenderSupport buildRenderSupport(EnvironmentalShadowBuilder builder)
+</div></div><p>Notice that when pushing a value into the Environment, you identify its type as well as the instance. Environment maintains a number of stacks, one for each type. Thus, pushing a TabModel into the environment won't disturb the RenderSupport or other environmentals already there.</p><p>What's important here is that the code that pushes a environmental onto a stack should also pop it off.</p><p>The enclosed class, Tab, has full access to whatever object was pushed onto the stack by the TabGroup.</p><p>The reason why Environment is a stack is so that a component can, when it makes sense, easily replace or intercept access to an Environmental.</p><h1 id="EnvironmentalServices-FundamentalEnvironmentals">Fundamental Environmentals</h1><p>Not all environmentals are pushed into the Environment by components.</p><p>A number of environmentals are initialized as part of page rendering, even before the first component starts to render. This initialization is accomplished with <a 
 shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MarkupRendererFilter.html">MarkupRendererFilter</a> contributions to the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/MarkupRenderer.html">MarkupRenderer</a> service.</p><h1 id="EnvironmentalServices-AccessingEnvironmentalsinServices">Accessing Environmentals in Services</h1><p>The Environmental annotation only works inside components.</p><p>To access an Environmental inside a service implementation, you must inject the Environment service and obtain values from it using the peek() method.</p><p>If this is something that will occur frequently, it is possible to create a service implementation that is "backed" by the Environment. For example, RenderSupport is accessible as a normal injection, because a service is built for it in TapestryModule:</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 RenderSupport buildRenderSupport(EnvironmentalShadowBuilder builder)
   {
     return builder.build(RenderSupport.class);
   }
 </pre>
-</div></div>
-
-<p>The EnvironmentShadowBuilder service creates a service implementation that delegates to the proper instance in the environment. The same technique can be used for your own services and environmentals.</p></div>
+</div></div><p>The EnvironmentShadowBuilder service creates a service implementation that delegates to the proper instance in the environment. The same technique can be used for your own services and environmentals.</p></div>
 </div>
 
 <div class="clearer"></div>

Modified: websites/production/tapestry/content/forms-and-validation.html
==============================================================================
--- websites/production/tapestry/content/forms-and-validation.html (original)
+++ websites/production/tapestry/content/forms-and-validation.html Sun Jul 26 21:19:56 2015
@@ -67,22 +67,60 @@
   </div>
 
 <div id="content">
-<div id="ConfluenceContent"><div class="navmenu" style="float:right; background:#eee; margin:3px; padding:3px">
-<div class="error"><span class="error">Error formatting macro: contentbylabel: com.atlassian.confluence.api.service.exceptions.BadRequestException: Could not parse cql : null</span> </div></div><p>The life's blood of any application is form input; this is the most effective way to gather significant information from the user. Whether it's a search form, a login screen or a multi-page registration wizard, forms are how the user really expresses themselves to the application.</p><p>Tapestry excels at creating forms and validating input. Input validation is declarative, meaning you simply tell Tapestry what validations to apply to a given field, and it takes care of it on the server and (once implemented) on the client as well.</p><p>Finally, Tapestry is able to not only present the errors back to the user, but to decorate the fields and the labels for the fields, marking them as containing errors (primarily, using CSS effects).</p><p><strong>Contents</strong></p><p><style type="text/c
 ss">/*<![CDATA[*/
-div.rbtoc1437340849383 {padding: 0px;}
-div.rbtoc1437340849383 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1437340849383 li {margin-left: 0px;padding-left: 0px;}
+<div id="ConfluenceContent"><p><strong>Form input and validation</strong> is the most effective way&#160;for most web applications to gather significant information from the user. Whether it's a search form, a login screen or a multi-page registration wizard, forms are how the user really expresses themselves to the application.</p><div class="aui-label" style="float:right" title="Related Articles">
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1437340849383">
-<ul class="toc-indentation"><li><a shape="rect" href="#FormsandValidation-TheFormComponent">The Form Component</a>
+
+
+
+
+
+
+
+<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>
+
+        <div class="details">
+                        <a shape="rect" href="forms-and-validation.html">Forms and Validation</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="forms-and-form-components-faq.html">Forms and Form Components FAQ</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="bean-validation.html">Bean Validation</a>
+                
+                        
+                    </div>
+    </li></ul>
+</div><p>Tapestry excels at creating forms and validating input. Input validation is declarative, meaning you simply tell Tapestry what validations to apply to a given field, and it takes care of it on the server and (once implemented) on the client as well.</p><p>Finally, Tapestry is able to not only present the errors back to the user, but to decorate the fields and the labels for the fields, marking them as containing errors (primarily, using CSS effects).</p><p><strong>Contents</strong></p><p><style type="text/css">/*<![CDATA[*/
+div.rbtoc1437945581375 {padding: 0px;}
+div.rbtoc1437945581375 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1437945581375 li {margin-left: 0px;padding-left: 0px;}
+
+/*]]>*/</style></p><div class="toc-macro rbtoc1437945581375">
+<ul class="toc-indentation"><li>Related Articles</li></ul>
+<ul><li><a shape="rect" href="#FormsandValidation-TheFormComponent">The Form Component</a>
 <ul class="toc-indentation"><li><a shape="rect" href="#FormsandValidation-FormEvents">Form Events</a></li><li><a shape="rect" href="#FormsandValidation-TrackingValidationErrors">Tracking Validation Errors</a></li><li><a shape="rect" href="#FormsandValidation-StoringDataBetweenRequests">Storing Data Between Requests</a></li><li><a shape="rect" href="#FormsandValidation-ConfiguringFieldsandLabels">Configuring Fields and Labels</a></li><li><a shape="rect" href="#FormsandValidation-CentralizingValidationwith@Validate">Centralizing Validation with @Validate</a></li><li><a shape="rect" href="#FormsandValidation-ServerSideValidation">Server Side Validation</a></li><li><a shape="rect" href="#FormsandValidation-CustomizingValidationMessages">Customizing Validation Messages</a>
 <ul class="toc-indentation"><li><a shape="rect" href="#FormsandValidation-CustomizingValidationMessagesforBeanEditForm">Customizing Validation Messages for BeanEditForm</a></li></ul>
 </li><li><a shape="rect" href="#FormsandValidation-ConfiguringValidatorContraintsintheMessageCatalog">Configuring Validator Contraints in the Message Catalog</a></li><li><a shape="rect" href="#FormsandValidation-ValidationMacros">Validation Macros</a></li><li><a shape="rect" href="#FormsandValidation-OverridingtheTranslatorwithEvents">Overriding the Translator with Events</a></li></ul>
-</li></ul>
-</div><h1 id="FormsandValidation-TheFormComponent">The Form Component</h1><p>The core of Tapestry's form support is the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Form.html">Form</a> component. The Form component encloses (wraps around) all the other <em>field components</em> such as <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/TextField.html">TextField</a>, <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/TextArea.html">TextArea</a>, <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Checkbox.html">Checkbox</a>, etc.</p><h2 id="FormsandValidation-FormEvents">Form Events</h2><p>The Form component emits a number of <a shape="rect" href="component-events.html">component 
 events</a>. You'll need to provide event handler methods for some of these.</p><p>When rendering, the Form component emits two notifications: first, "prepareForRender", then "prepare". These allow the Form's container to setup any fields or properties that will be referenced in the form. For example, this is a good place to create a temporary entity object to be rendered, or to load an entity from a database to be edited.</p><p>When user submits the form on the client, a series of steps occur on the server.</p><p>First, the Form emits a "prepareForSubmit" notification, then a "prepare" notification. These allow the container to ensure that objects are set up and ready to receive information from the form submission.</p><p>Next, all the fields inside the form are activated to pull values out of the incoming request, validate them and (if valid) store the changes.</p><div class="navmenu" style="float:right; width:25%; background:#eee; margin:3px; padding:3px">
-<p><em>For Tapestry 4 Users:</em> Tapestry 5 does not use the fragile "form rewind" approach from Tapestry 4. Instead, a hidden field generated during the render stores the information needed to process the form submission.</p></div><p>After the fields have done their processing, the Form emits a "validate" event. This is a chance to perform cross-form validation that can't be described declaratively.</p><p>Note: For compatibility with release 5.1 and earlier, the Form component also emits a "validateForm" event. (See <a shape="rect" class="external-link" href="https://issues.apache.org/jira/browse/TAP5-760">TAP5-760</a>.)</p><p>Next, the Form determines if there have been any validation errors. If there have been, then the submission is considered a failure, and a "failure" event is emitted. If there have been no validation errors, then a "success" event is emitted.</p><p>Finally, the Form emits a "submit" event, for logic that doesn't care about success or failure.</p><div class="
 table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Form Event (in order)</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Phase</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>When emitted</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Typical use</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepareForRender</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before rendering the form</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Load an entity from a database to be edited</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepare</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before rendering the form, but after <em>prepareForRender</em></p></td><td colspan="1" rowspan="1" class="confl
 uenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepareForSubmit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepare</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed, but after <em>prepareForSubmit</em></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>validate</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After fields have been populated from submitted values and validated</p></td><td colspan="1" rowspan="1" cl
 ass="confluenceTd"><p>Perform cross-field validation</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>validateForm</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>same as <em>validate</em></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><em>deprecated</em></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>failure</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After one or more validation errors have occurred</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>success</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>When validation has completed <em>without</em> any errors</p></td><td colspan="1" rowspan="1" class="con
 fluenceTd"><p>Save changes to the database</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After all validation (success or failure) has finished</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr></tbody></table></div><p>Note that the "prepare" event is emitted during both form rendering and form submission.</p><h2 id="FormsandValidation-TrackingValidationErrors">Tracking Validation Errors</h2><p>Associated with the Form is a <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ValidationTracker.html">ValidationTracker</a> that tracks all the provided user input and validation errors for every field in the form. The tracker can be provided to the Form via the Form's tracker parameter, but this is rarely necessary.</p><p>The Form includes methods <
 code>isValid()</code> and <code>getHasErrors()</code>, which are used to see if the Form's validation tracker contains any errors.</p><p>In your own logic, it is possible to record your own errors. Form includes two different versions of method <code>recordError()</code>, one of which specifies a <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/Field.html">Field</a> (an interface implemented by all form element components), and one of which is for "global" errors, unassociated with any particular field.</p><h2 id="FormsandValidation-StoringDataBetweenRequests">Storing Data Between Requests</h2><div class="navmenu" style="float:right; width:40%; background:white; margin:3px; padding:3px">
+</li></ul></div><h1 id="FormsandValidation-TheFormComponent">The Form Component</h1><p>The core of Tapestry's form support is the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Form.html">Form</a> component. The Form component encloses (wraps around) all the other <em>field components</em> such as <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/TextField.html">TextField</a>, <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/TextArea.html">TextArea</a>, <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Checkbox.html">Checkbox</a>, etc.</p><h2 id="FormsandValidation-FormEvents">Form Events</h2><p>The Form component emits a number of <a shape="rect" href="component-events.html">
 component events</a>. You'll need to provide event handler methods for some of these.</p><p>When rendering, the Form component emits two notifications: first, "prepareForRender", then "prepare". These allow the Form's container to setup any fields or properties that will be referenced in the form. For example, this is a good place to create a temporary entity object to be rendered, or to load an entity from a database to be edited.</p><p>When user submits the form on the client, a series of steps occur on the server.</p><p>First, the Form emits a "prepareForSubmit" notification, then a "prepare" notification. These allow the container to ensure that objects are set up and ready to receive information from the form submission.</p><p>Next, all the fields inside the form are activated to pull values out of the incoming request, validate them and (if valid) store the changes.</p><div class="navmenu" style="float:right; width:25%; background:#eee; margin:3px; padding:3px">
+<p><em>For Tapestry 4 Users:</em> Tapestry 5 does not use the fragile "form rewind" approach from Tapestry 4. Instead, a hidden field generated during the render stores the information needed to process the form submission.</p></div>After the fields have done their processing, the Form emits a "validate" event. This is a chance to perform cross-form validation that can't be described declaratively.<p>Note: For compatibility with release 5.1 and earlier, the Form component also emits a "validateForm" event. (See <a shape="rect" class="external-link" href="https://issues.apache.org/jira/browse/TAP5-760">TAP5-760</a>.)</p><p>Next, the Form determines if there have been any validation errors. If there have been, then the submission is considered a failure, and a "failure" event is emitted. If there have been no validation errors, then a "success" event is emitted.</p><p>Finally, the Form emits a "submit" event, for logic that doesn't care about success or failure.</p><div class="table-w
 rap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Form Event (in order)</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Phase</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>When emitted</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Typical use</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepareForRender</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before rendering the form</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Load an entity from a database to be edited</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepare</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before rendering the form, but after <em>prepareForRender</em></p></td><td colspan="1" rowspan="1" class="confluenceTd
 "><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepareForSubmit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>prepare</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed, but after <em>prepareForSubmit</em></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>validate</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After fields have been populated from submitted values and validated</p></td><td colspan="1" rowspan="1" class="co
 nfluenceTd"><p>Perform cross-field validation</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>validateForm</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>same as <em>validate</em></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><em>deprecated</em></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>failure</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After one or more validation errors have occurred</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>success</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>When validation has completed <em>without</em> any errors</p></td><td colspan="1" rowspan="1" class="confluence
 Td"><p>Save changes to the database</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After all validation (success or failure) has finished</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr></tbody></table></div><p>Note that the "prepare" event is emitted during both form rendering and form submission.</p><h2 id="FormsandValidation-TrackingValidationErrors">Tracking Validation Errors</h2><p>Associated with the Form is a <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ValidationTracker.html">ValidationTracker</a> that tracks all the provided user input and validation errors for every field in the form. The tracker can be provided to the Form via the Form's tracker parameter, but this is rarely necessary.</p><p>The Form includes methods <code>is
 Valid()</code> and <code>getHasErrors()</code>, which are used to see if the Form's validation tracker contains any errors.</p><p>In your own logic, it is possible to record your own errors. Form includes two different versions of method <code>recordError()</code>, one of which specifies a <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/Field.html">Field</a> (an interface implemented by all form element components), and one of which is for "global" errors, unassociated with any particular field.</p><h2 id="FormsandValidation-StoringDataBetweenRequests">Storing Data Between Requests</h2><p></p><div class="navmenu" style="float:right; width:40%; background:white; margin:3px; padding:3px">
 <div class="confluence-information-macro confluence-information-macro-information"><p class="title">New in Tapestry 5.4</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
-<p>Starting in Tapestry 5.4, the default behavior for server-side validation failures is to re-render the page within the same request (rather than emitting a redirect). This removes the need to use a session-persistent field to store the validation tracker when validation failures occur.</p></div></div></div><p>As with other action requests, the result of a form submission (except when using <a shape="rect" href="ajax-and-zones.html">Zones</a>) is to send a redirect to the client, which results in a second request (to re-render the page). The ValidationTracker must be <a shape="rect" href="persistent-page-data.html">persisted</a> (generally in the HttpSession) across these two requests in order to prevent the loss of validation information. Fortunately, the default ValidationTracker provided by the Form component is persistent, so you don't normally have to worry about it.</p><p>However, for the same reason, the individual fields updated by the components should also be persisted a
 cross requests, and this is something you <strong>do</strong> need to do yourself &#8211; generally with the @Persist annotation.</p><p>For example, a Login page, which collects a user name and a password, might look like:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<p>Starting in Tapestry 5.4, the default behavior for server-side validation failures is to re-render the page within the same request (rather than emitting a redirect). This removes the need to use a session-persistent field to store the validation tracker when validation failures occur.</p></div></div></div>As with other action requests, the result of a form submission (except when using <a shape="rect" href="ajax-and-zones.html">Zones</a>) is to send a redirect to the client, which results in a second request (to re-render the page). The ValidationTracker must be <a shape="rect" href="persistent-page-data.html">persisted</a> (generally in the HttpSession) across these two requests in order to prevent the loss of validation information. Fortunately, the default ValidationTracker provided by the Form component is persistent, so you don't normally have to worry about it.<p>However, for the same reason, the individual fields updated by the components should also be persisted across r
 equests, and this is something you <strong>do</strong> need to do yourself &#8211; generally with the @Persist annotation.</p><p>For example, a Login page, which collects a user name and a password, might look like:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.newapp.pages;
 
 
@@ -130,9 +168,9 @@ public class Login {
 
 
 </pre>
-</div></div><div class="navmenu" style="float:right; width:40%; background:white; margin:3px; padding:3px">
+</div></div><p></p><div class="navmenu" style="float:right; width:40%; background:white; margin:3px; padding:3px">
 <div class="confluence-information-macro confluence-information-macro-information"><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body">
-<p>Note that the onValidateFromLoginForm() and onSuccess() methods are not public; event handler methods can have any visibility, even private. Package private (that is, no modifier) is the typical use, as it allows the component to be tested, from a test case class in the same package.</p></div></div></div><p>Because a form submission is really <em>two</em> requests: the submission itself (which results in a redirect response), then a second request for the page (which results in a re-rendering of the page), it is necessary to persist the userName field between the two requests, by using the @Persist annotation. This would be necessary for the password field as well, except that the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/PasswordField.html">PasswordField</a> component never renders a value.</p><div class="confluence-information-macro confluence-information-macro-tip"><span class="aui-icon aui-ic
 on-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>To avoid data loss, fields whose values are stored in the HttpSession (such as userName, above) must be serializable, particularly if you want to be able to cluster your application or preserve sessions across server restarts.</p></div></div><p>The Form only emits a "success" event if the there are no prior validation errors. This means it is not necessary to write <code>if (form.getHasErrors()) return;</code> as the first line of the method.</p><p>Finally, notice how business logic fits into validation. The UserAuthenticator service is responsible for ensuring that the userName and (plaintext) password are valid. When it returns false, we ask the Form component to record an error. We provide the PasswordField instance as the first parameter; this ensures that the password field, and its label, are decorated when the Form is re-rendered, to present the errors to 
 the user.</p><h2 id="FormsandValidation-ConfiguringFieldsandLabels">Configuring Fields and Labels</h2><p>The template for the Login page contains a minimal amount of Tapestry instrumentation and references some of the <a shape="rect" class="external-link" href="http://getbootstrap.com" >Bootstrap</a> CSS classes (Bootstrap is automatically integrated into each Tapestry page):</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<p>Note that the onValidateFromLoginForm() and onSuccess() methods are not public; event handler methods can have any visibility, even private. Package private (that is, no modifier) is the typical use, as it allows the component to be tested, from a test case class in the same package.</p></div></div></div>Because a form submission is really <em>two</em> requests: the submission itself (which results in a redirect response), then a second request for the page (which results in a re-rendering of the page), it is necessary to persist the userName field between the two requests, by using the @Persist annotation. This would be necessary for the password field as well, except that the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/PasswordField.html">PasswordField</a> component never renders a value.<div class="confluence-information-macro confluence-information-macro-tip"><span class="aui-icon aui-icon-smal
 l aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>To avoid data loss, fields whose values are stored in the HttpSession (such as userName, above) must be serializable, particularly if you want to be able to cluster your application or preserve sessions across server restarts.</p></div></div><p>The Form only emits a "success" event if the there are no prior validation errors. This means it is not necessary to write <code>if (form.getHasErrors()) return;</code> as the first line of the method.</p><p>Finally, notice how business logic fits into validation. The UserAuthenticator service is responsible for ensuring that the userName and (plaintext) password are valid. When it returns false, we ask the Form component to record an error. We provide the PasswordField instance as the first parameter; this ensures that the password field, and its label, are decorated when the Form is re-rendered, to present the errors to the use
 r.</p><h2 id="FormsandValidation-ConfiguringFieldsandLabels">Configuring Fields and Labels</h2><p>The template for the Login page contains a minimal amount of Tapestry instrumentation and references some of the <a shape="rect" class="external-link" href="http://getbootstrap.com" >Bootstrap</a> CSS classes (Bootstrap is automatically integrated into each Tapestry page):</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;">&lt;html t:type="layout" title="newapp com.example"
       xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"&gt;
 

Modified: websites/production/tapestry/content/https.html
==============================================================================
--- websites/production/tapestry/content/https.html (original)
+++ websites/production/tapestry/content/https.html Sun Jul 26 21:19:56 2015
@@ -31,8 +31,6 @@
   <link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet' type='text/css' />
   <script src='/resources/highlighter/scripts/shCore.js' type='text/javascript'></script>
   <script src='/resources/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
-  <script src='/resources/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
-  <script src='/resources/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
   <script type="text/javascript">
   SyntaxHighlighter.defaults['toolbar'] = false;
   SyntaxHighlighter.all();
@@ -67,8 +65,46 @@
   </div>
 
 <div id="content">
-<div id="ConfluenceContent"><h1 id="HTTPS-SecuringyourapplicationwithHTTPS">Securing your application with HTTPS</h1><pre>&#160;</pre><div class="navmenu" style="float:right; background:#eee; margin:3px; padding:3px">
-<div class="error"><span class="error">Error formatting macro: contentbylabel: com.atlassian.confluence.api.service.exceptions.BadRequestException: Could not parse cql : null</span> </div></div><p>Tapestry assumes your application will be primarily deployed as a standard web application, using HTTP&#160;(not HTTPS) as the transport mechanism.</p><p>However, many applications will need to have some of their pages secured: only accessible via HTTPS. This could be a login page, or a product ordering wizard, or administrative pages.</p><p>All that is necessary to mark a page as secure is to add the @Secure annotation to the page class:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<div id="ConfluenceContent"><h1 id="HTTPS-SecuringyourapplicationwithHTTPS">Securing your application with HTTPS</h1><div class="aui-label" style="float:right" title="Related Articles">
+
+
+
+
+
+
+
+
+<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>
+
+        <div class="details">
+                        <a shape="rect" href="security-faq.html">Security FAQ</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="https.html">HTTPS</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="security.html">Security</a>
+                
+                        
+                    </div>
+    </li></ul>
+</div><p>Tapestry assumes your application will be primarily deployed as a standard web application, using HTTP&#160;(not HTTPS) as the transport mechanism.</p><p>However, many applications will need to have some of their pages secured: only accessible via HTTPS. This could be a login page, or a product ordering wizard, or administrative pages.</p><p>All that is necessary to mark a page as secure is to add the @Secure annotation to the page class:</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;">@Secure
 public class ProcessOrder
 {

Modified: websites/production/tapestry/content/injection.html
==============================================================================
--- websites/production/tapestry/content/injection.html (original)
+++ websites/production/tapestry/content/injection.html Sun Jul 26 21:19:56 2015
@@ -67,162 +67,81 @@
   </div>
 
 <div id="content">
-<div id="ConfluenceContent"><h1 id="Injection-Injection">Injection</h1>
+<div id="ConfluenceContent"><p><strong>Injection</strong> is Tapestry's way of making a dependency &#8211; such as a resource, asset, component, block or service &#8211; available in a page, component, mixin or service class.</p><div class="aui-label" style="float:right" title="Related Articles">
 
-<p><strong>Injection</strong> is Tapestry's way of making a dependency &#8211; such as a resource, asset, component, block or service &#8211; available in a page, component, mixin or service class.</p>
 
-<p>Injection is a key concept in Tapestry, and it is used in several different but related ways.</p>
 
-<div class="navmenu" style="float:right; background:#eee; margin:3px; padding:3px">
-<div class="error"><span class="error">Error formatting macro: contentbylabel: com.atlassian.confluence.api.service.exceptions.BadRequestException: Could not parse cql : null</span> </div></div>
 
-<h2 id="Injection-InjectioninTapestryIOCServices">Injection in Tapestry IOC Services</h2>
 
-<p>Main Article: <a shape="rect" href="tapestry-ioc-overview.html">Tapestry Ioc Overview</a></p>
 
-<p>The Tapestry IoC container makes use of injection primarily through constructors and via parameters to service builder methods.</p>
 
-<h2 id="Injection-InjectioninComponentClasses">Injection in Component Classes</h2>
 
-<p>For components, however, Tapestry takes a completely different tack: injection directly into component fields.</p>
+<h3>Related Articles</h3>
 
-<p>The @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Inject.html">Inject</a> annotation is used to identify fields that will contain injected services and other resources.</p>
+<ul class="content-by-label"><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
 
-<p>Tapestry allows for two kinds of injection:</p>
+        <div class="details">
+                        <a shape="rect" href="injection-in-detail.html">Injection in Detail</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
 
-<ul><li><strong>Default injection</strong>, where Tapestry determines the object to inject into the field based on its type.</li><li><strong>Explicit injection</strong>, where the particular service to be injected is specified.</li></ul>
+        <div class="details">
+                        <a shape="rect" href="injection-faq.html">Injection FAQ</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
 
-
-<p>In both cases, the field is transformed into a read only value. As elsewhere in Tapestry, this transformation occurs at runtime (which is very important in terms of being able to test your components). Attempting to update an injected field will result in a runtime exception.</p>
-
-<p>In addition, there are a few special cases that are triggered by specific field types, or additional annotations, in addition, to @Inject, on a field.</p>
-
-<h3 id="Injection-BlockInjection">Block Injection</h3>
-
-<p>For field type <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/Block.html">Block</a>, the value of the Inject annotation is the id of the <a shape="rect" href="component-templates.html">&lt;t:block&gt;</a> element within the component's template. Normally, the id of the block is determined from the field name (after stripping out any leading "_" and "$" characters):</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
+        <div class="details">
+                        <a shape="rect" href="injection.html">Injection</a>
+                
+                        
+                    </div>
+    </li></ul>
+</div><p>Injection is a key concept in Tapestry, and it is used in several different but related ways.</p><h2 id="Injection-InjectioninTapestryIOCServices">Injection in Tapestry IOC Services</h2><p>Main Article: <a shape="rect" href="tapestry-ioc-overview.html">Tapestry IoC Overview</a></p><p>The Tapestry IoC container makes use of injection primarily through constructors and via parameters to service builder methods.</p><h2 id="Injection-InjectioninComponentClasses">Injection in Component Classes</h2><p>For components, however, Tapestry takes a completely different tack: injection directly into component fields.</p><p>The @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Inject.html">Inject</a> annotation is used to identify fields that will contain injected services and other resources.</p><p>Tapestry allows for two kinds of injection:</p><ul><li><strong>Default injection</strong>, where Tapestry determines
  the object to inject into the field based on its type.</li><li><strong>Explicit injection</strong>, where the particular service to be injected is specified.</li></ul><p>In both cases, the field is transformed into a read only value. As elsewhere in Tapestry, this transformation occurs at runtime (which is very important in terms of being able to test your components). Attempting to update an injected field will result in a runtime exception.</p><p>In addition, there are a few special cases that are triggered by specific field types, or additional annotations, in addition, to @Inject, on a field.</p><h3 id="Injection-BlockInjection">Block Injection</h3><p>For field type <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/Block.html">Block</a>, the value of the Inject annotation is the id of the <a shape="rect" href="component-templates.html">&lt;t:block&gt;</a> element within the component's template. Normally, the id of the b
 lock is determined from the field name (after stripping out any leading "_" and "$" characters):</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
 private Block foo;
 </pre>
-</div></div>
-
-<p>Where that is not appropriate, an @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Id.html">Id</a> annotation can be supplied:</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
+</div></div><p>Where that is not appropriate, an @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Id.html">Id</a> annotation can be supplied:</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
 @Id("bar")
 private Block barBlock;
 </pre>
-</div></div>
-
-<p>The first injection will inject the Block with id "foo" (as always, case is ignored). The second injection will inject the Block with id "bar".</p>
-
-<h3 id="Injection-ResourceInjection">Resource Injection</h3>
-
-<p>For a particular set of field types, Tapestry will inject a <em>resource</em> related to the component, such as its Locale.</p>
-
-<p>A very common example occurs when a component needs access to its <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ComponentResources.html">resources</a>. The component can define a field of the appropriate type and use the <code>@Inject</code> annotation without a value:</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
+</div></div><p>The first injection will inject the Block with id "foo" (as always, case is ignored). The second injection will inject the Block with id "bar".</p><h3 id="Injection-ResourceInjection">Resource Injection</h3><p>For a particular set of field types, Tapestry will inject a <em>resource</em> related to the component, such as its Locale.</p><p>A very common example occurs when a component needs access to its <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ComponentResources.html">resources</a>. The component can define a field of the appropriate type and use the <code>@Inject</code> annotation without a value:</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
 private ComponentResources resources;
 </pre>
-</div></div>
-
-<p>Tapestry uses the type of the field, ComponentResources, to determine what to inject into this field.</p>
-
-<p>The following types are supported for resources injection:</p>
-
-<ul><li><strong>java.lang.String</strong> &#8211;  The complete id of the component, which incorporates the complete class name of the containing page and the nested id of the component within the page.</li></ul>
-
-
-<ul><li><strong>java.util.Locale</strong> &#8211; The locale for the component (all components within a page use the same locale).</li></ul>
-
-
-<ul><li><strong>org.slf4j.Logger</strong> &#8211; A Logger instance configured for the component, based on the component's class name. <a shape="rect" class="external-link" href="http://www.slf4j.org/" >SLF4J</a> is a wrapper around Log4J or other logging toolkits.</li></ul>
-
-
-<ul><li><strong>org.apache.tapestry5.ComponentResources</strong> &#8211; The resources for the component, often used to generate links related to the component.</li></ul>
-
-
-<ul><li><strong>org.apache.tapestry5.ioc.Messages</strong> &#8211; The component message catalog for the component, from which <a shape="rect" href="injection.html">localized</a> messages can be generated.</li></ul>
-
-
-<h3 id="Injection-AssetInjection">Asset Injection</h3>
-
-<p>Main Article: <a shape="rect" href="assets.html">Assets</a></p>
-
-<p>When the @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Path.html">Path</a> annotation is also present, then the injected value (relative to the component) will be a localized asset.</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
+</div></div><p>Tapestry uses the type of the field, ComponentResources, to determine what to inject into this field.</p><p>The following types are supported for resources injection:</p><ul><li><strong>java.lang.String</strong> &#8211; The complete id of the component, which incorporates the complete class name of the containing page and the nested id of the component within the page.</li></ul><ul><li><strong>java.util.Locale</strong> &#8211; The locale for the component (all components within a page use the same locale).</li></ul><ul><li><strong>org.slf4j.Logger</strong> &#8211; A Logger instance configured for the component, based on the component's class name. <a shape="rect" class="external-link" href="http://www.slf4j.org/" >SLF4J</a> is a wrapper around Log4J or other logging toolkits.</li></ul><ul><li><strong>org.apache.tapestry5.ComponentResources</strong> &#8211; The resources for the component, often used to generate links related to the component.</li></ul><ul><li><strong>
 org.apache.tapestry5.ioc.Messages</strong> &#8211; The component message catalog for the component, from which <a shape="rect" href="injection.html">localized</a> messages can be generated.</li></ul><h3 id="Injection-AssetInjection">Asset Injection</h3><p>Main Article: <a shape="rect" href="assets.html">Assets</a></p><p>When the @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Path.html">Path</a> annotation is also present, then the injected value (relative to the component) will be a localized asset.</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("context:images/top_banner.png")
 private Asset banner;
 </pre>
-</div></div>
-
-<p>Symbols in the annotation value are expanded.</p>
-
-<h3 id="Injection-ServiceInjection">Service Injection</h3>
-
-<p>Here, a custom EmployeeService service is injected, but any custom or built-in service may be injected in the same way. </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
+</div></div><p>Symbols in the annotation value are expanded.</p><h3 id="Injection-ServiceInjection">Service Injection</h3><p>Here, a custom EmployeeService service is injected, but any custom or built-in service may be injected in the same way.</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
 private EmployeeService employeeService;
 </pre>
-</div></div>
-
-<p>A large number of services are provided by Tapestry. See the following packages:</p>
-
-<div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
+</div></div><p>A large number of services are provided by Tapestry. See the following packages:</p><div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
 <ul><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/package-summary.html">Core Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/ajax/package-summary.html">AJAX Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/assets/package-summary.html">Assets Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/dynamic/package-summary.html">Dynamic Component Services</a></li></ul>
-</div>
-
-<div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
+</div><div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
 <ul><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/javascript/package-summary.html">JavaScript Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/linktransform/package-summary.html">Link Transformation Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/messages/package-summary.html">Message Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/package-summary.html">Component Metadata Services</a></li></ul>
-</div>
-
-<div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
+</div><div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
 <ul><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/pageload/package-summary.html">Page Loading Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/security/package-summary.html">Security Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/templates/package-summary.html">Template Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/transform/package-summary.html">Class Transformation Services</a></li></ul>
-</div>
-
-<div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
+</div><div class="navmenu" style="float:left; width:15em; background:white; margin:3px; padding:3px">
 <ul><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/package-summary.html">Tapestry IOC Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/cron/package-summary.html">Tapestry IOC Cron Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/kaptcha/services/package-summary.html">Kaptcha Services</a></li><li><a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/upload/services/package-summary.html">File Upload Services</a></li></ul>
-</div>
-<p></p><p></p><div style="clear:both"></div><p></p>
-
-<h3 id="Injection-ExplicitServiceInjection">Explicit Service Injection</h3>
-
-<p>Here, a specific object is requested. A @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Service.html">Service</a> annotation is used to identify the service 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;">
-@Inject
+</div><div style="clear:both"></div>&#160;<h3 id="Injection-ExplicitServiceInjection">Explicit Service Injection</h3><p>Here, a specific object is requested. A @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Service.html">Service</a> annotation is used to identify the service 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;">@Inject
 @Service("Request")
 private Request request;
 </pre>
-</div></div>
-
-<p>This is generally not necessary; you should always be able to identify the service to be injected just by type, not by explicit id. Explicit ids have the disadvantage of not being refactoring-safe: this won't happen with the Request service, but perhaps in your own code ... if you rename the service interface and rename the service id to match, your existing injections using the explicit service id will break.</p>
-
-<h2 id="Injection-DefaultInjection">Default Injection</h2>
-
-<p>When the type and/or other annotations are not sufficient to identify the object or service to inject, Tapestry falls back on two remaining steps. It assumes that the field type will be used to identify a service, by the service interface.</p>
-
-<p>First, the object provider created by the Alias service is consulted. This object provider is used to disambiguate injections when there is more than one service that implements the same service interface.</p>
-
-<p>Second, a search for a unique service that implements the interface occurs. This will fail if either there are no services that implement the interface, or there is more than one. In the latter case, you must disambiguate, either with a contribution to the Alias service, or by explicitly identifying the service with the @Service annotation.</p>
-
-<h2 id="Injection-DefiningNewInjectionLogic">Defining New Injection Logic</h2>
-
-<p>Anonymous injection is controlled by the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/InjectionProvider.html">InjectionProvider</a> service. The configuration for this service is a <a shape="rect" href="chainbuilder-service.html">chain of command</a> for handling component injections.</p></div>
+</div></div><p>This is generally not necessary; you should always be able to identify the service to be injected just by type, not by explicit id. Explicit ids have the disadvantage of not being refactoring-safe: this won't happen with the Request service, but perhaps in your own code ... if you rename the service interface and rename the service id to match, your existing injections using the explicit service id will break.</p><h2 id="Injection-DefaultInjection">Default Injection</h2><p>When the type and/or other annotations are not sufficient to identify the object or service to inject, Tapestry falls back on two remaining steps. It assumes that the field type will be used to identify a service, by the service interface.</p><p>First, the object provider created by the Alias service is consulted. This object provider is used to disambiguate injections when there is more than one service that implements the same service interface.</p><p>Second, a search for a unique service that imp
 lements the interface occurs. This will fail if either there are no services that implement the interface, or there is more than one. In the latter case, you must disambiguate, either with a contribution to the Alias service, or by explicitly identifying the service with the @Service annotation.</p><h2 id="Injection-DefiningNewInjectionLogic">Defining New Injection Logic</h2><p>Anonymous injection is controlled by the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/InjectionProvider.html">InjectionProvider</a> service. The configuration for this service is a <a shape="rect" href="chainbuilder-service.html">chain of command</a> for handling component injections.</p></div>
 </div>
 
 <div class="clearer"></div>

Modified: websites/production/tapestry/content/integration-testing.html
==============================================================================
--- websites/production/tapestry/content/integration-testing.html (original)
+++ websites/production/tapestry/content/integration-testing.html Sun Jul 26 21:19:56 2015
@@ -32,7 +32,6 @@
   <script src='/resources/highlighter/scripts/shCore.js' type='text/javascript'></script>
   <script src='/resources/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
   <script src='/resources/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
-  <script src='/resources/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
   <script type="text/javascript">
   SyntaxHighlighter.defaults['toolbar'] = false;
   SyntaxHighlighter.all();
@@ -67,8 +66,37 @@
   </div>
 
 <div id="content">
-<div id="ConfluenceContent"><h1 id="IntegrationTesting-IntegrationTestingwithSelenium">Integration Testing with Selenium</h1><div class="navmenu" style="float:right; background:#eee; margin:3px; padding:3px">
-<div class="error"><span class="error">Error formatting macro: contentbylabel: com.atlassian.confluence.api.service.exceptions.BadRequestException: Could not parse cql : null</span> </div></div><p>The Tapestry Test Utilities is a small library to make it easier to build integration test suites around <a shape="rect" class="external-link" href="http://www.openqa.org/selenium/" >Selenium</a> version 2.14.0.</p><p>The strategy is to start, in process, a Selenimum Server (which, in turn, starts and manages a web browser), a Jetty instance (for the web browser to talk to), and a Selenium client (which talks to the server).</p><p>The client is able to request URLs, fill in form data, click links, and make assertions about output and behavior.</p><h1 id="IntegrationTesting-Usage">Usage</h1><p>The core part of this library is a base class for you to extend your tests classes : <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/test/Se
 leniumTestCase.html">SeleniumTestCase</a>.</p><p>This class is responsible for starting an instance of Jetty to server your web application, as well as a copy of Selenium Server. It also implements the <a shape="rect" class="external-link" href="http://release.openqa.org/selenium-remote-control/0.9.0/doc/java/" >Selenium</a> interface.</p><div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Before Tapestry 5.2, your class should extend <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/test/AbstractIntegrationTestSuite.html">AbstractIntegrationTestSuite</a></p></div></div><p>Here's an example from one of the Tapestry modules:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><
 b>Your Integration Test Class : SinglePersistenceUnitIntegrationTest.java</b></div><div class="codeContent panelContent pdl">
+<div id="ConfluenceContent"><p><strong>Integration testing</strong> involves the testing of larger segments of your Tapestry module or web application, typically including the user interface.</p><div class="aui-label" style="float:right" title="Related Articles">
+
+
+
+
+
+
+
+
+<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>
+
+        <div class="details">
+                        <a shape="rect" href="integration-testing.html">Integration Testing</a>
+                
+                        
+                    </div>
+    </li><li>
+        <div>
+                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+
+        <div class="details">
+                        <a shape="rect" href="unit-testing-pages-or-components.html">Unit testing pages or components</a>
+                
+                        
+                    </div>
+    </li></ul>
+</div><p>The Tapestry Test Utilities is a small library to make it easier to build integration test suites around <a shape="rect" class="external-link" href="http://www.openqa.org/selenium/" >Selenium</a> version 2.14.0.</p><p>The strategy is to start, in-process, a Selenimum Server (which, in turn, starts and manages a web browser), a Jetty instance (for the web browser to talk to), and a Selenium client (which talks to the server).</p><p>The client is able to request URLs, fill in form data, click links, and make assertions about output and behavior.</p><h1 id="IntegrationTesting-Usage">Usage</h1><p>The core part of this library is a base class for you to extend your tests classes : <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/test/SeleniumTestCase.html">SeleniumTestCase</a>.</p><p>This class is responsible for starting an instance of Jetty to server your web application, as well as a copy of Selenium Server. It also i
 mplements the <a shape="rect" class="external-link" href="http://release.openqa.org/selenium-remote-control/0.9.0/doc/java/" >Selenium</a> interface.</p><div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Before Tapestry 5.2, your class should extend <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/test/AbstractIntegrationTestSuite.html">AbstractIntegrationTestSuite</a></p></div></div><p>Here's an example from one of the Tapestry modules:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Your Integration Test Class : SinglePersistenceUnitIntegrationTest.java</b></div><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package org.apache.tapestry5.jpa.integration.app2;
 
 import org.apache.tapestry5.test.SeleniumTestCase;