Modified: websites/production/tapestry/content/component-templates.html
==============================================================================
--- websites/production/tapestry/content/component-templates.html (original)
+++ websites/production/tapestry/content/component-templates.html Tue Feb 13
03:21:20 2018
@@ -100,7 +100,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="templating-and-markup-faq.html">Templating
and Markup FAQ</a>
+ <a href="component-reference.html">Component
Reference</a>
</div>
@@ -109,7 +109,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="component-classes.html">Component Classes</a>
+ <a href="component-libraries.html">Component
Libraries</a>
</div>
@@ -118,7 +118,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="component-reference.html">Component
Reference</a>
+ <a href="templating-and-markup-faq.html">Templating
and Markup FAQ</a>
</div>
@@ -127,7 +127,7 @@
<span class="icon aui-icon aui-icon-small
aui-iconfont-page-default" title="Page">Page:</span> </div>
<div class="details">
- <a href="component-libraries.html">Component
Libraries</a>
+ <a href="component-classes.html">Component Classes</a>
</div>
@@ -176,7 +176,7 @@
<h1>Bonjour from HelloWorld component.</h1>
</html>
</pre>
-</div></div><div class="sectionMacro"><div
class="sectionMacroRow"> </div></div><p>We'll cover the specific content
of templates shortly, but first a few details about connecting a component to
its template.</p><h2 id="ComponentTemplates-TemplateLocation">Template
Location</h2><p>A component template shares the same name as its corresponding
class file, but with a ".tml" ending (i.e., <strong>T</strong>apestry
<strong>M</strong>arkup <strong>L</strong>anguage), and is stored in the same
package as the corresponding component class.</p><p>Under a typical Maven
directory structure, the Java class and template files for a <em>component</em>
might be:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Java class:</strong></p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p><code>src/main/java/org/example/myapp/components/MyComponent.java</code></p></td></tr><tr><td
colspan="1" rowspan="1" class="c
onfluenceTd"><p><strong>Template:</strong></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><code>src/main/resources/org/example/myapp/components/MyComponent.tml</code></p></td></tr></tbody></table></div><p>Likewise,
the Java class and template files for a <em>page</em> might be:</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p><strong>Java class:</strong></p></td><td
colspan="1" rowspan="1"
class="confluenceTd"><p><code>src/main/java/org/example/myapp/pages/MyPage.java</code></p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Template:</strong></p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p><code>src/main/resources/org/example/myapp/pages/MyPage.tml</code></p></td></tr></tbody></table></div><p>The
template and the compiled class will be packaged together in the
WEB-INF/classes folder of the application WAR.</p><p>For <em>pages</em> (but
not other components), a
second location will be searched: in the web application context. The location
is based on the logical name of the page, in the previous example, the template
would be <code>MyPage.tml</code> in the root folder of the web
application.</p><p>A template on the classpath takes precedence over a file in
the web application context.</p><div class="confluence-information-macro
confluence-information-macro-warning"><span class="aui-icon aui-icon-small
aui-iconfont-error confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Allowing pages to store their
template in the web context is a feature that may go away at some point. It was
included as a way for HTML designers to edit template directly and live preview
the template directly, without executing the Tapestry application. This comes
with a large number of limitations and leads to a false sense of security that
a template that previews correctly will render properly (this is not always the
case).</p>
</div></div><h2 id="ComponentTemplates-TemplateLocalization">Template
Localization</h2><p>Main Article: <a href="component-templates.html">Component
Templates</a></p><p>Templates are handled in much the same way as individual
files of a component's message catalog: the effective locale is inserted into
the name of the file. Thus a German users will see the content generated from
<code>MyPage_de.tml</code> and French users will see content generated from
<code>MyPage_fr.tml</code>. When no specific localization is available, the
default location (<code>MyPage.tml</code>) is used.</p><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>It is necessary to <a
href="component-templates.html">enable support for a locale</a> before Tapestry
will attempt to localize to that locale. This requires configuration in yo
ur application module (usually AppModule.java); if you are using the Tapestry
Quickstart archetype, only locale "en" will be enabled by
default.</p></div></div><p><span class="confluence-anchor-link"
id="ComponentTemplates-doctypes"></span></p><h2
id="ComponentTemplates-TemplateDoctypes">Template Doctypes</h2><p>As mentioned
above, component templates are well-formed XML documents. This means that if
you want to use any <a class="external-link"
href="http://www.w3.org/TR/html401/sgml/entities.html" rel="nofollow">Named
HTML entities</a> (such as &amp; &lt; &gt; &copy;), you must
use an <a class="external-link"
href="http://www.w3.org/QA/2002/04/valid-dtd-list.html" rel="nofollow">HTML or
XHTML doctype</a> in your template <em>(starting in 5.3, this is more-or-less
automatic, see notes below)</em>. If you choose to use (X)HTML doctypes in your
templates, they will be passed on to the client in the resultant (X)HTML. Note
that if your pages are composed of multiple c
omponents, each with a template, and each template contains a doctype
declaration, only the first doctype encountered by the template parser will be
passed on to the client.</p><p>It should also be noted that even though
<strong>X</strong>HTML DTDs are valid XML DTDs, HTML DTDs aren't. This means
that HTML doctypes cannot be used by XML parsers. Tapestry works around this
limitation internally by using XHTML DTDs to parse templates that use HTML
DTDs. This internal mapping is possible because XHTML 1.0 is nothing more than
"a reformulation of the three HTML 4 document types as applications of XML
1.0," <a class="external-link" href="http://www.w3.org/TR/xhtml1/#xhtml"
rel="nofollow">as per the W3C</a>. Don't worry though – the original HTML
4 doctype will still be emitted to the client!</p><p>The following are the most
common (X)HTML doctypes:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
+</div></div><div class="sectionMacro"><div
class="sectionMacroRow"> </div></div><p>We'll cover the specific content
of templates shortly, but first a few details about connecting a component to
its template.</p><h2 id="ComponentTemplates-TemplateLocation">Template
Location</h2><p>A component template shares the same name as its corresponding
class file, but with a ".tml" ending (i.e., <strong>T</strong>apestry
<strong>M</strong>arkup <strong>L</strong>anguage), and is stored in the same
package as the corresponding component class.</p><p>Under a typical Maven
directory structure, the Java class and template files for a <em>component</em>
might be:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Java class:</strong></p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p><code>src/main/java/org/example/myapp/components/MyComponent.java</code></p></td></tr><tr><td
colspan="1" rowspan="1" class="c
onfluenceTd"><p><strong>Template:</strong></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><code>src/main/resources/org/example/myapp/components/MyComponent.tml</code></p></td></tr></tbody></table></div><p>Likewise,
the Java class and template files for a <em>page</em> might be:</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p><strong>Java class:</strong></p></td><td
colspan="1" rowspan="1"
class="confluenceTd"><p><code>src/main/java/org/example/myapp/pages/MyPage.java</code></p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Template:</strong></p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p><code>src/main/resources/org/example/myapp/pages/MyPage.tml</code></p></td></tr></tbody></table></div><p>The
template and the compiled class will be packaged together in the
WEB-INF/classes folder of the application WAR.</p><p>For <em>pages</em> (but
not other components), a
second location will be searched: in the web application context. The location
is based on the logical name of the page, in the previous example, the template
would be <code>MyPage.tml</code> in the root folder of the web
application.</p><p>A template on the classpath takes precedence over a file in
the web application context.</p><div class="confluence-information-macro
confluence-information-macro-warning"><span class="aui-icon aui-icon-small
aui-iconfont-error confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Allowing pages to store their
template in the web context is a feature that may go away at some point. It was
included as a way for HTML designers to edit template directly and live preview
the template directly, without executing the Tapestry application. This comes
with a large number of limitations and leads to a false sense of security that
a template that previews correctly will render properly (this is not always the
case).</p>
</div></div><h2 id="ComponentTemplates-TemplateLocalization">Template
Localization</h2><p>Main Article: <a
href="localization.html">Localization</a></p><p>Templates are handled in much
the same way as individual files of a component's message catalog: the
effective locale is inserted into the name of the file. Thus a German users
will see the content generated from <code>MyPage_de.tml</code> and French users
will see content generated from <code>MyPage_fr.tml</code>. When no specific
localization is available, the default location (<code>MyPage.tml</code>) is
used.</p><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>It is necessary to <a
href="component-templates.html">enable support for a locale</a> before Tapestry
will attempt to localize to that locale. This requires configuration in your
application
module (usually AppModule.java); if you are using the Tapestry Quickstart
archetype, only locale "en" will be enabled by default.</p></div></div><p><span
class="confluence-anchor-link" id="ComponentTemplates-doctypes"></span></p><h2
id="ComponentTemplates-TemplateDoctypes">Template Doctypes</h2><p>As mentioned
above, component templates are well-formed XML documents. This means that if
you want to use any <a class="external-link"
href="http://www.w3.org/TR/html401/sgml/entities.html" rel="nofollow">Named
HTML entities</a> (such as &amp; &lt; &gt; &copy;), you must
use an <a class="external-link"
href="http://www.w3.org/QA/2002/04/valid-dtd-list.html" rel="nofollow">HTML or
XHTML doctype</a> in your template <em>(starting in 5.3, this is more-or-less
automatic, see notes below)</em>. If you choose to use (X)HTML doctypes in your
templates, they will be passed on to the client in the resultant (X)HTML. Note
that if your pages are composed of multiple components, eac
h with a template, and each template contains a doctype declaration, only the
first doctype encountered by the template parser will be passed on to the
client.</p><p>It should also be noted that even though <strong>X</strong>HTML
DTDs are valid XML DTDs, HTML DTDs aren't. This means that HTML doctypes cannot
be used by XML parsers. Tapestry works around this limitation internally by
using XHTML DTDs to parse templates that use HTML DTDs. This internal mapping
is possible because XHTML 1.0 is nothing more than "a reformulation of the
three HTML 4 document types as applications of XML 1.0," <a
class="external-link" href="http://www.w3.org/TR/xhtml1/#xhtml"
rel="nofollow">as per the W3C</a>. Don't worry though – the original HTML
4 doctype will still be emitted to the client!</p><p>The following are the most
common (X)HTML doctypes:</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;"><!DOCTYPE html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
@@ -197,12 +197,7 @@
<div class="aui-message aui-message-info">
Added in 5.3
- Tapestry 5.3 introduced two significant improvements to template Doctypes.
-
-A template without a is parsed as if it had the HTML Doctype ({{}}). In
fact, Tapestry creates an in-memory copy of the template that includes the
doctype.
-
-A template with the HTML Doctype ({{}}) is parsed _as if_ it had the XHTML
transitional Doctype. In fact, Tapestry creates an in-memory copy of the
template that replaces the line. This applies as well to a template without
any Doctype, in which case the XHTML transitional Doctype is inserted at the
top. In either case, this means you can use arbitrary HTML entities, such as
{{&copy;}} or {{&nbsp;}} without seeing the XML parsing errors that
would occur in earlier releases.
-
+ Tapestry 5.3 introduced two significant improvements to template Doctypes.
A template without a is parsed as if it had the HTML Doctype ({{}}). In fact,
Tapestry creates an in-memory copy of the template that includes the doctype. A
template with the HTML Doctype ({{}}) is parsed _as if_ it had the XHTML
transitional Doctype. In fact, Tapestry creates an in-memory copy of the
template that replaces the line. This applies as well to a template without any
Doctype, in which case the XHTML transitional Doctype is inserted at the top.
In either case, this means you can use arbitrary HTML entities, such as
{{&copy;}} or {{&nbsp;}} without seeing the XML parsing errors that
would occur in earlier releases.
</div><h2 id="ComponentTemplates-TheTapestryNamespace">The Tapestry
Namespace</h2><p>Component templates should include the Tapestry namespace,
defining it in the root element of the template.</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;"><html
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
<head>
@@ -252,11 +247,11 @@ A template with the HTML Doctype ({{}})
</div></div><p>Here, <code>${userId</code>} is the expansion. In this example,
the userId property of the component is extracted, converted to a string, and
streamed into the output.</p><p>Expansions are allowed inside text, and inside
attributes of ordinary elements, and component elements. For example:</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;"> <img
src="${request.contextPath}/images/catalog/product_${productId}.png"/>
</pre>
-</div></div><p>In this hypothetical example, the component class is providing
a request property and a productId property, and these are being used inside
the template to assemble the src attribute of the <img> element. This is
component-like behavior without actual components.</p><p>Under the covers,
expansions are the same as <a href="component-templates.html">parameter
bindings</a>. The default binding prefix for expansions is "prop:" (that is,
the name of a property or a <a href="component-templates.html">property
expression</a>), but other binding prefixes are useful, especially "message:"
(to access a localized message from the component's message catalog).</p><div
class="confluence-information-macro confluence-information-macro-warning"><span
class="aui-icon aui-icon-small aui-iconfont-error
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Do not use expansions in component
parameters if the parameter's default or explicit bi
nding prefix is "prop:" or "var:". Expansions convert the value to an
immutable string, resulting in a runtime exception if the component tries to
update the value. Even for read-only parameters, expansions are not as
desirable, since they always convert to a string, and from there to the
parameter's declared type.</p></div></div><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>Tapestry 4 users will note that
expansions are a concise, easy replacement for the Insert component, and for
the <span key="..."> directive.</p></div></div><p>Note that expansions
escape any HTML reserved characters. Specifically, any less-than (<),
greater than (>) and ampersand (&) are replaced with &lt;, &gt;
and &amp; respectively. That is usually what you want. However, if your
property contains HTM
L that you want rendered as raw markup, you can use the <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/OutputRaw.html">OutputRaw</a>
component instead, like this: <code><t:OutputRaw
value="someContent"/></code> where <code>someContent</code> is a property
containing HTML markup.</p><p><em>Caution: if the content comes from an
untrusted source (like a public user), be sure to filter it before providing it
to OutputRaw. Otherwise you've got a potential cross-site scripting
vulnerability.</em></p><h2 id="ComponentTemplates-EmbeddedComponents">Embedded
Components</h2><p>An embedded component is identified within the template as an
element in the t: namespace. Example:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>In this hypothetical example, the component class is providing
a request property and a productId property, and these are being used inside
the template to assemble the src attribute of the <img> element. This is
component-like behavior without actual components.</p><p>Under the covers,
expansions are the same as <a href="component-parameters.html">parameter
bindings</a>. The default binding prefix for expansions is "prop:" (that is,
the name of a property or a <a href="property-expressions.html">property
expression</a>), but other binding prefixes are useful, especially "message:"
(to access a localized message from the component's message catalog).</p><div
class="confluence-information-macro confluence-information-macro-warning"><span
class="aui-icon aui-icon-small aui-iconfont-error
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Do not use expansions in component
parameters if the parameter's default or explicit
binding prefix is "prop:" or "var:". Expansions convert the value to an
immutable string, resulting in a runtime exception if the component tries to
update the value. Even for read-only parameters, expansions are not as
desirable, since they always convert to a string, and from there to the
parameter's declared type.</p></div></div><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>Tapestry 4 users will note that
expansions are a concise, easy replacement for the Insert component, and for
the <span key="..."> directive.</p></div></div><p>Note that expansions
escape any HTML reserved characters. Specifically, any less-than (<),
greater than (>) and ampersand (&) are replaced with &lt;, &gt;
and &amp; respectively. That is usually what you want. However, if your
property contains H
TML that you want rendered as raw markup, you can use the <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/OutputRaw.html">OutputRaw</a>
component instead, like this: <code><t:OutputRaw
value="someContent"/></code> where <code>someContent</code> is a property
containing HTML markup.</p><p><em>Caution: if the content comes from an
untrusted source (like a public user), be sure to filter it before providing it
to OutputRaw. Otherwise you've got a potential cross-site scripting
vulnerability.</em></p><h2 id="ComponentTemplates-EmbeddedComponents">Embedded
Components</h2><p>An embedded component is identified within the template as an
element in the t: namespace. Example:</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;"> You have ${cartItems.size()} items in your cart.
<t:actionlink t:id="clear">Remove All</t:actionlink>.
</pre>
-</div></div><p>The element name, "actionlink" is used to select the type of
component, ActionLink.</p><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>As elsewhere, Tapestry is
insensitive to case when mapping from a component type to a component
class.</p></div></div><p>Embedded components may have two Tapestry-specific <a
href="component-templates.html">parameters</a>:</p><ul><li>id: A unique id for
the component (within its container).</li><li>mixins: An optional comma
separated list of mixins for the the component.</li></ul><p>These attributes
are specified inside the t: namespace (i.e.,
<code>t:id="clear"</code>).</p><p>If the id attribute is omitted, Tapestry will
assign a unique id for the element.</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>Non-trivial components should
always be assigned a specific id, rather than letting Tapestry do it. You'll
end up with shorter, more readable URLs and code that's easier to debug,
because it will be more obvious how the request URL maps to your pages and
components. This is even more strongly encouraged for form control components,
where the component id will usually be the same as the query parameter that
stores the value provided by the end user.</p></div></div><p>Ids must be valid
Java identifiers: start with a letter, and contain only letters, numbers and
underscores.</p><p>Any other attributes are used to <a
href="component-templates.html">bind parameters of the component</a>. These may
be formal parameters or informal parameters. Formal parameters will have a
default binding prefix (usually "prop:"). Informal parameters will be assumed
to be literal
s (i.e., the "literal:" binding prefix).</p><p>Use of the t: prefix is
optional for all other attributes. Some users implement a build process where
the Tapestry template files are validated ... in that case, any
Tapestry-specific attributes, not defined by the underlying DTD or schema,
should be in the Tapestry namespace, to avoid validation errors.</p><p>The open
and close tags of a Tapestry component element define the <strong>body</strong>
of the component. It is quite common for additional components to be
<strong>enclosed</strong> in the body of another component:</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>The element name, "actionlink" is used to select the type of
component, ActionLink.</p><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>As elsewhere, Tapestry is
insensitive to case when mapping from a component type to a component
class.</p></div></div><p>Embedded components may have two Tapestry-specific <a
href="component-parameters.html">parameters</a>:</p><ul><li>id: A unique id for
the component (within its container).</li><li>mixins: An optional comma
separated list of mixins for the the component.</li></ul><p>These attributes
are specified inside the t: namespace (i.e.,
<code>t:id="clear"</code>).</p><p>If the id attribute is omitted, Tapestry will
assign a unique id for the element.</p><div class="confluence-information-macro
confluence-information-macro-note"><span class="aui-ico
n aui-icon-small aui-iconfont-warning
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Non-trivial components should
always be assigned a specific id, rather than letting Tapestry do it. You'll
end up with shorter, more readable URLs and code that's easier to debug,
because it will be more obvious how the request URL maps to your pages and
components. This is even more strongly encouraged for form control components,
where the component id will usually be the same as the query parameter that
stores the value provided by the end user.</p></div></div><p>Ids must be valid
Java identifiers: start with a letter, and contain only letters, numbers and
underscores.</p><p>Any other attributes are used to <a
href="component-parameters.html">bind parameters of the component</a>. These
may be formal parameters or informal parameters. Formal parameters will have a
default binding prefix (usually "prop:"). Informal parameters will be assumed
to be liter
als (i.e., the "literal:" binding prefix).</p><p>Use of the t: prefix is
optional for all other attributes. Some users implement a build process where
the Tapestry template files are validated ... in that case, any
Tapestry-specific attributes, not defined by the underlying DTD or schema,
should be in the Tapestry namespace, to avoid validation errors.</p><p>The open
and close tags of a Tapestry component element define the <strong>body</strong>
of the component. It is quite common for additional components to be
<strong>enclosed</strong> in the body of another component:</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;"><t:form>
<t:errors/>
<t:label for="userId"/>
@@ -297,7 +292,7 @@ A template with the HTML Doctype ({{}})
</tr>
</tabel>
</pre>
-</div></div><p>Here, the loop component "merges into" the <tr> element.
It will render out a <tr> for each <code>item</code> in the
<code>items</code> list, with each <tr> including three <td>
elements. It will also write a dynamic "class" attribute into each
<tr>.</p><p><span class="confluence-anchor-link"
id="ComponentTemplates-parameter-namespaces"></span></p><h2
id="ComponentTemplates-ParameterNamespaces">Parameter Namespaces</h2><p>Main
Article: <a href="component-templates.html">Component
Templates</a></p><p>Parameter namespaces (introduced in Tapestry 5.1) are a
concise way of passing parameter blocks to components.</p><p>You must define a
special namespace, usually with the prefix "p":</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>Here, the loop component "merges into" the <tr> element.
It will render out a <tr> for each <code>item</code> in the
<code>items</code> list, with each <tr> including three <td>
elements. It will also write a dynamic "class" attribute into each
<tr>.</p><p><span class="confluence-anchor-link"
id="ComponentTemplates-parameter-namespaces"></span></p><h2
id="ComponentTemplates-ParameterNamespaces">Parameter Namespaces</h2><p>Main
Article: <a href="component-parameters.html">Component
Parameters</a></p><p>Parameter namespaces (introduced in Tapestry 5.1) are a
concise way of passing parameter blocks to components.</p><p>You must define a
special namespace, usually with the prefix "p":</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;"><html
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
xmlns:p="tapestry:parameter">
. . .
</pre>
Modified:
websites/production/tapestry/content/ioc-cookbook-service-configurations.html
==============================================================================
---
websites/production/tapestry/content/ioc-cookbook-service-configurations.html
(original)
+++
websites/production/tapestry/content/ioc-cookbook-service-configurations.html
Tue Feb 13 03:21:20 2018
@@ -77,7 +77,7 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><h1
id="IoCcookbook-ServiceConfigurations-ServiceConfigurations">Service
Configurations</h1><p>This is an area of Tapestry IoC that is often least well
understood. Tapestry services often must have some configuration to fine tune
exactly what they do. One of the interactions between modules is that these
service configurations are shared: they may be contributed into by any
module.</p><p>Let's start with the most basic kind, the unordered
configuration.</p><h1
id="IoCcookbook-ServiceConfigurations-UnorderedServiceConfigurations">Unordered
Service Configurations</h1><p>One of Tapestry's features is the ability to
package assets (images, style sheets, JavaScript libraries, etc.) inside JAR
files and expose those to the client. For example, an application URL
/assets/org/example/mylib/mylib.js would refer to a file, myllib.js, stored on
the classpath in the /org/example/mylib folder.</p><p>That's fine for most
cases, but for certain file exte
nsions, we don't want to allow a client browser to "troll" for the files, as
the contents could compromise security. For example, downloading a .class file
is bad: a clever client might download one that contains a hard-coded user name
or password.</p><p>Thus, for certain file extensions, Tapestry guards the
resource by attaching an MD5 digest for the resource to the URL. The checksum
is derived from the file contents; thus it can't be spoofed from the client
unless the client already has the file contents.</p><p>This is controlled by
the <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/ResourceDigestGenerator.html">ResourceDigestGenerator</a>
service, which uses its configuration to determine which file extensions
require an MD5 digest.</p><h2
id="IoCcookbook-ServiceConfigurations-ContributingtoaService">Contributing to a
Service</h2><p>Main Article: <a
href="ioc-cookbook-service-configurations.html">IoC cookbook - Service Co
nfigurations</a></p><p>The Tapestry module makes a contribution into the
service configuration:</p><div class="code panel pdl" style="border-style:
solid;border-width: 1px;"><div class="codeContent panelContent pdl">
+ <div id="ConfluenceContent"><h1
id="IoCcookbook-ServiceConfigurations-ServiceConfigurations">Service
Configurations</h1><p>This is an area of Tapestry IoC that is often least well
understood. Tapestry services often must have some configuration to fine tune
exactly what they do. One of the interactions between modules is that these
service configurations are shared: they may be contributed into by any
module.</p><p>Let's start with the most basic kind, the unordered
configuration.</p><h1
id="IoCcookbook-ServiceConfigurations-UnorderedServiceConfigurations">Unordered
Service Configurations</h1><p>One of Tapestry's features is the ability to
package assets (images, style sheets, JavaScript libraries, etc.) inside JAR
files and expose those to the client. For example, an application URL
/assets/org/example/mylib/mylib.js would refer to a file, myllib.js, stored on
the classpath in the /org/example/mylib folder.</p><p>That's fine for most
cases, but for certain file exte
nsions, we don't want to allow a client browser to "troll" for the files, as
the contents could compromise security. For example, downloading a .class file
is bad: a clever client might download one that contains a hard-coded user name
or password.</p><p>Thus, for certain file extensions, Tapestry guards the
resource by attaching an MD5 digest for the resource to the URL. The checksum
is derived from the file contents; thus it can't be spoofed from the client
unless the client already has the file contents.</p><p>This is controlled by
the <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/ResourceDigestGenerator.html">ResourceDigestGenerator</a>
service, which uses its configuration to determine which file extensions
require an MD5 digest.</p><h2
id="IoCcookbook-ServiceConfigurations-ContributingtoaService">Contributing to a
Service</h2><p>Main Article: <a
href="tapestry-ioc-configuration.html">Tapestry IoC Configuration</a></p>
<p>The Tapestry module makes a contribution into the service
configuration:</p><div class="code panel pdl" style="border-style:
solid;border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public static void
contributeResourceDigestGenerator(Configuration<String> configuration)
{
configuration.add("class");
Modified: websites/production/tapestry/content/property-expressions.html
==============================================================================
--- websites/production/tapestry/content/property-expressions.html (original)
+++ websites/production/tapestry/content/property-expressions.html Tue Feb 13
03:21:20 2018
@@ -67,7 +67,7 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><p>Tapestry uses <strong>property
expressions</strong> to move data between components. Property expressions are
the basis of the <a href="property-expressions.html">component parameters</a>
and <a href="property-expressions.html">template expansions</a>.</p><div
class="aui-label" style="float:right" title="Related Articles">
+ <div id="ConfluenceContent"><p>Tapestry uses <strong>property
expressions</strong> to move data between components. Property expressions are
the basis of the <a href="property-expressions.html">component parameters</a>
and <a href="component-templates.html">template expansions</a>.</p><div
class="aui-label" style="float:right" title="Related Articles">
@@ -140,7 +140,6 @@ mapKey : keyword | constant | propertyCh
</p><div class="aui-message aui-message-info">
Added in 5.3
Support for map literals was added in Tapestry 5.3.
-
</div>Notes:<ul><li>Whitespace is ignored.</li><li>Integers and decimals may
have a leading sign ('+' or '-').</li><li>Constants are in base 10 (octal and
hex notation is not yet supported). Decimals may contain a decimal point
(exponent notation not yet supported).</li><li>Literal strings are enclosed in
single quotes.</li><li>The <code>rangeOp</code> creates a range object that
will iterate between the two values. The upper and lower bounds may be literal
integers, or property expressions.</li><li>An identifier by itself is a
property name. An identifier with parenthesis is a method
invocation.</li><li>Property names, method names, and keywords are
case-insensitive.</li><li>'this' is the root object (i.e., the containing
component).</li><li>The <code>not</code> operator coerces the expression to a
<code>boolean</code> (so it can be used on strings, numbers,
etc.).</li><li>Method matching is based on method name and number of
parameters, but not parameter types. The <a href="prope
rty-expressions.html">TypeCoercer</a> service is used to convert parameters to
the correct type to be passed into the method.</li></ul><h2
id="PropertyExpressions-Examples">Examples</h2><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p> </p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Example</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Notes</p></th></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Keyword</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>this</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Keyword</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>null</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Property Name</p></th><td colspan="1" rowspan="1"
class="confluen
ceTd"><p>userName</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Calls getUserName() or setUserName, depending on
context</p></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Property Chain</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>user.address.city</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Calls getUser().getAddress().getCity() or
getUser().getAddress().setCity(), depending on context</p></td></tr><tr><th
colspan="1" rowspan="1" class="confluenceTh"><p>Property Chain</p></th><td
colspan="1" rowspan="1" class="confluenceTd"><p>user?.name</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Calls getUser() and, if the
result is not null, calls getName() on the result</p></td></tr><tr><th
colspan="1" rowspan="1" class="confluenceTh"><p>Method Invocation</p></th><td
colspan="1" rowspan="1" class="confluenceTd"><p>groupList.size()</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>calls getGroupList().size(
)</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Method
Invocation</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>members.findById(<a class="external-link"
href="http://user.id" rel="nofollow">user.id</a>)?.name</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>Calls
getMembers().findById(getUser().getId())?.getName() (unless findById returns
null)</p></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Range</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>1..10</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Iterates between integers 1 and 10</p></td></tr><tr><th
colspan="1" rowspan="1" class="confluenceTh"><p>Range</p></th><td colspan="1"
rowspan="1" class="confluenceTd"><p>1..groupList.size()</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>Iterates between 1 and the result of
getGroupList().size()</p></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Literal String</p></t
h><td colspan="1" rowspan="1" class="confluenceTd"><p>'Beer is proof that God
loves us and wants us to be happy.'</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Use single quotes</p></td></tr><tr><th colspan="1"
rowspan="1" class="confluenceTh"><p>List</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>[<a class="external-link" href="http://user.name"
rel="nofollow">user.name</a>, user.email, user.phone]</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p> </p></td></tr><tr><th colspan="1"
rowspan="1" class="confluenceTh"><p>Not Operator</p></th><td colspan="1"
rowspan="1" class="confluenceTd"><p>! user.deleted</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>the boolean negation of
getUser().getDeleted()</p></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Not, Coerced</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>! user.middleName</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>true only if ge
tUser.getMiddleName() returns null or an empty string</p></td></tr><tr><th
colspan="1" rowspan="1" class="confluenceTh"><p>Map</p></th><td colspan="1"
rowspan="1" class="confluenceTd"><p>{ 'framework' : 'Tapestry', 'version' :
version }</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Keys are
string literals (in single quotes), but could be properties as
well</p></td></tr></tbody></table></div></div>
</div>
Modified:
websites/production/tapestry/content/supported-environments-and-versions.html
==============================================================================
---
websites/production/tapestry/content/supported-environments-and-versions.html
(original)
+++
websites/production/tapestry/content/supported-environments-and-versions.html
Tue Feb 13 03:21:20 2018
@@ -67,7 +67,7 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><p>Tapestry is compatible with a
pretty wide range of app servers, Java versions, and open source libraries. Not
all combinations are known to work, however.</p><p>Note: blanks in the support
matrix tables below do NOT indicate incompatibility. They are just
documentation gaps.</p><p>If you know of any other known compatibilities or
incompatibilities, please add a comment at the bottom of this page, or on
the <a href="supported-environments-and-versions.html">Tapestry Users
mailing list</a> mailing list.</p><h2
id="SupportedEnvironmentsandVersions-Java&ServletAPIVersions">Java &
Servlet API Versions</h2><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh">Tapestry Version →</th><th colspan="1" rowspan="1"
class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan
="1" rowspan="1" class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1"
rowspan="1" class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Java JRE</td><td colspan="1" rowspan="1"
class="confluenceTd">1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.7, 1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6 - 1.8<sup>1,2</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6, 1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1
.6</td><td colspan="1" rowspan="1" class="confluenceTd">1.5, 1.6</td><td
colspan="1" rowspan="1" class="confluenceTd">1.4-1.6</td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd">Servlet API</td><td colspan="1"
rowspan="1" class="confluenceTd">3.0+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.2-2.3</td></tr></tbody></table></div><p
class="confluence-link"><sup class="confluence-link">1</sup> Tapestry does not
yet work with Java 1.9. See <a clas
s="external-link" href="https://issues.apache.org/jira/browse/TAP5-2588"><span
class="confluence-link">TAP5-2588</span></a>.</p><p><sup>2</sup> For using
Tapestry 5.3.8 with Java 1.8 see <a
href="supported-environments-and-versions.html">Supported Environments and
Versions</a></p><p><sup>3</sup> Servlet API 2.5 requires JDK 1.5+</p><h2
id="SupportedEnvironmentsandVersions-AppServers">App Servers</h2><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1" class="
confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache Tomcat</td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Jetty</td><td colspan="1" rowspan="1"
class="confluenceTd"> 9</td><td colspan="1" rowspan="1"
class="confluenceTd"> 7-9</td
><td colspan="1" rowspan="1" class="confluenceTd"> 6-9</td><td
>colspan="1" rowspan="1" class="confluenceTd"> 6-8</td><td colspan="1"
>rowspan="1" class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
>class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
>class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
>class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
>class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
>class="confluenceTd">6-7</td></tr><tr><td colspan="1" rowspan="1"
>class="confluenceTd">Glassfish</td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd">2.1</td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1" class="conf
luenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache TomEE</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">JBoss EAP</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">
4.2.3</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">4+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Wildfly/JBoss AS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan=
"1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Heroku</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Google App Engine</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rows
pan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Amazon AWS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">
 </td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td></tr></tbody></table></div><h2
id="SupportedEnvironmentsandVersions-Libraries">Libraries</h2><p>These are the
library versions known to work (and, in some cases, bundled with Tapestry).
Unless otherwise noted, adjacent versions will often work fine as well.</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.3-5.3.6</th><th colspan="1" rowspan="1"
class="confluence
Th">5.3.2</th><th colspan="1" rowspan="1" class="confluenceTh">5.3 -
5.3.1</th><th colspan="1" rowspan="1" class="confluenceTh">5.2.1</th><th
colspan="1" rowspan="1" class="confluenceTh">5.2</th><th colspan="1"
rowspan="1" class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.16</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Hibernate</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">?-4.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" row
span="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.5.4-3.6.0</td><td colspan="1" rowspan="1"
class="confluenceTd">-3.6.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.3.0+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">JPA</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="confluence
Td"> </td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Spring</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="
1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.1.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">jQuery.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.12.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="conf
luenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Prototype.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.7.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><t
d colspan="1" rowspan="1" class="confluenceTd">1.7</td><td colspan="1"
rowspan="1" class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.2</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Bootstrap CSS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd">3.0.2</td><td colspan="1" rowspan="1" class="conflue
nceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Moment.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">2.12.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td col
span="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Less4J</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="
confluenceTd">1.2.1-1.9</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Underscore.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">
0;</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.3.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr></tbody></table></div></div>
+ <div id="ConfluenceContent"><p>Tapestry is compatible with a
pretty wide range of app servers, Java versions, and open source libraries. Not
all combinations are known to work, however.</p><p>Note: blanks in the support
matrix tables below do NOT indicate incompatibility. They are just
documentation gaps.</p><p>If you know of any other known compatibilities or
incompatibilities, please add a comment at the bottom of this page, or on
the <a href="supported-environments-and-versions.html">Tapestry Users
mailing list</a> mailing list.</p><h2
id="SupportedEnvironmentsandVersions-Java&ServletAPIVersions">Java &
Servlet API Versions</h2><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh">Tapestry Version →</th><th colspan="1" rowspan="1"
class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan
="1" rowspan="1" class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1"
rowspan="1" class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Java JRE</td><td colspan="1" rowspan="1"
class="confluenceTd">1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.7, 1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6 - 1.8<sup>1,2</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6, 1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1
.6</td><td colspan="1" rowspan="1" class="confluenceTd">1.5, 1.6</td><td
colspan="1" rowspan="1" class="confluenceTd">1.4-1.6</td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd">Servlet API</td><td colspan="1"
rowspan="1" class="confluenceTd">3.0+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.2-2.3</td></tr></tbody></table></div><p
class="confluence-link"><sup class="confluence-link">1</sup> Tapestry does not
yet work with Java 1.9. See <a clas
s="external-link" href="https://issues.apache.org/jira/browse/TAP5-2588"><span
class="confluence-link">TAP5-2588</span></a>.</p><p><sup>2</sup> For using
Tapestry 5.3.8 with Java 1.8 see <a href="release-notes-538.html">Release
Notes 5.3.8</a></p><p><sup>3</sup> Servlet API 2.5 requires JDK 1.5+</p><h2
id="SupportedEnvironmentsandVersions-AppServers">App Servers</h2><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspa
n="1" rowspan="1" class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache Tomcat</td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Jetty</td><td colspan="1" rowspan="1"
class="confluenceTd"> 9</td><td colspan="1" rowspan="1"
class="confluenceTd"> 7-9</td><td colspan="1" rowspan="1" class
="confluenceTd"> 6-9</td><td colspan="1" rowspan="1"
class="confluenceTd"> 6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-7</td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Glassfish</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">2.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="
1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache TomEE</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">JBoss EAP</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">4.2.3</td><td colspan="1" rowspan=
"1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">4+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Wildfly/JBoss AS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="confluenceT
d"> </td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd">Heroku</td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Google App Engine</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> 
;</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Amazon AWS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan
="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr></tbody></table></div><h2
id="SupportedEnvironmentsandVersions-Libraries">Libraries</h2><p>These are the
library versions known to work (and, in some cases, bundled with Tapestry).
Unless otherwise noted, adjacent versions will often work fine as well.</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.3-5.3.6</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.2</th><th colspan="1" rows
pan="1" class="confluenceTh">5.3 - 5.3.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.16</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Hibernate</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">?-4.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">
0;</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd">3.5.4-3.6.0</td><td colspan="1"
rowspan="1" class="confluenceTd">-3.6.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.3.0+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">JPA</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" row
span="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Spring</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="confluenceTd
"> </td><td colspan="1" rowspan="1" class="confluenceTd">3.1.0</td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">jQuery.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.12.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="
1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Prototype.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.7.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="c
onfluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.2</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Bootstrap CSS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd">3.0.2</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Moment.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">2.12.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="conflu
enceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Less4J</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.2.1-1.9</td><td co
lspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Underscore.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.3.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr></tbody></table></div></div>
</div>
<div class="clearer"></div>