Author: buildbot
Date: Wed Nov 30 03:20:31 2016
New Revision: 1001868
Log:
Production update by buildbot for tapestry
Modified:
websites/production/tapestry/content/cache/main.pageCache
websites/production/tapestry/content/getting-started.html
websites/production/tapestry/content/tapestry-for-jsf-users.html
Modified: websites/production/tapestry/content/cache/main.pageCache
==============================================================================
Binary files - no diff available.
Modified: websites/production/tapestry/content/getting-started.html
==============================================================================
--- websites/production/tapestry/content/getting-started.html (original)
+++ websites/production/tapestry/content/getting-started.html Wed Nov 30
03:20:31 2016
@@ -153,8 +153,9 @@ package: com.example.newapp
[INFO] ------------------------------------------------------------------------
~/workspaces/tapestry/tapestry-doc-examples
$</pre>
-</div></div><p><span style="line-height: 1.4285715;"><br
clear="none"></span></p><p>Maven will (after performing a number of one-time
downloads) create a skeleton project ready to run. Because we specified an
artifactId of "newapp", the project is created in the <code>newapp</code>
directory. (Note: if you get "Unable to get resource" warnings at this stage,
you may be behind a firewall which blocks outbound HTTP requests to Maven
repositories.)</p><p>To run the skeleton application, change to the
<code>newapp</code> directory and execute:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: bash; gutter: false; theme: Default"
style="font-size:12px;">$ mvn jetty:run
+</div></div><p><span style="line-height: 1.4285715;"><br
clear="none"></span></p><p>Maven will (after performing a number of one-time
downloads) create a skeleton project ready to run. Because we specified an
artifactId of "newapp", the project is created in the <code>newapp</code>
directory. (Note: if you get "Unable to get resource" warnings at this stage,
you may be behind a firewall which blocks outbound HTTP requests to Maven
repositories.)</p><p>To run the skeleton application, change to the
<code>newapp</code> directory and execute the <code>"mvn jetty:run"</code>
command to start the Jetty app server:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: bash; gutter: false; theme: Default"
style="font-size:12px;">$ cd newapp
+$ mvn jetty:run
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
Modified: websites/production/tapestry/content/tapestry-for-jsf-users.html
==============================================================================
--- websites/production/tapestry/content/tapestry-for-jsf-users.html (original)
+++ websites/production/tapestry/content/tapestry-for-jsf-users.html Wed Nov 30
03:20:31 2016
@@ -102,7 +102,7 @@
</html>
</pre>
</div></div></div><div class="columnMacro"><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Tapestry template
(HelloWorld.tml)</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><html>
+<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><html
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
<body>
<p>${greeting}</p>
</body>
@@ -124,7 +124,7 @@ public class HelloWorldBean {
}
}
</pre>
-</div></div></div></div></div></div><h2
id="TapestryforJSFUsers-Expressionsintemplates">Expressions in
templates</h2><p>JSF uses the Unified Expression Language with the #{...} or
${...} syntax for accessing Backing Bean properties. For its part, Tapestry
uses the ${...} syntax with a similar but more limited expression language
called <a href="property-expressions.html">Property Expressions</a>. Both
allow easy access to properties via the usual JavaBean conventions, but with
Tapestry you don't have to specify which class the expression starts at
(because it always starts at the component class corresponding to the
template). Some comparisons:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><th colspan="1" rowspan="1"
class="confluenceTh"><p>JSF Syntax</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Tapestry Syntax</p></th></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p
>Property (calls getEmployeeName() or setEmployeeName())</p></td><td
>colspan="1" rowspan="1"
>class="confluenceTd"><p>#{employeeBean.employeeName}</p></td><td colspan="1"
>rowspan="1" class="confluenceTd"><p>${employeeName}</p></td></tr><tr><td
>colspan="1" rowspan="1" class="confluenceTd"><p>Boolean property (calls
>isHourly() or setHourly())</p></td><td colspan="1" rowspan="1"
>class="confluenceTd"><p>#{employeeBean.hourly}</p></td><td colspan="1"
>rowspan="1" class="confluenceTd"><p>${hourly}</p></td></tr><tr><td
>colspan="1" rowspan="1" class="confluenceTd"><p>Property chain</p></td><td
>colspan="1" rowspan="1"
>class="confluenceTd"><p>#{employeeBean.address.street}</p></td><td
>colspan="1" rowspan="1"
>class="confluenceTd"><p>${address.street}</p></td></tr><tr><td colspan="1"
>rowspan="1" class="confluenceTd"><p>Null-safe property chain</p></td><td
>colspan="1" rowspan="1"
>class="confluenceTd"><p>#{employeeBean.address.street}</p></td><td
>colspan="1" rowspan="1" class="confluenceTd"><p>${ad
dress?.street}</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>5th element in a List</p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p>#{employeeBean.employees[5].name}</p></td><td
colspan="1" rowspan="1"
class="confluenceTd"><p>${employees.get(5).name}</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Negation</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>#{!
employeeBean.hourly}</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>${! hourly}</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>Arithmetic & relational
operators</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>+-*/% div
mod</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><em>not
available</em></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Relational operators</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>== != ne < lt > gt <= le >=
ge</p></td><td colspan=
"1" rowspan="1" class="confluenceTd"><p><em>not
available</em></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Ternary operator</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>#{myBean.foo < 0 ? 'bar' : 'baz'}</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><em>not
available</em></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Method calling</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>#{myBean.employees.size()}</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${employees.size()}</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Iterated Range</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><em>not
avaialble</em></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>${1..10}</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Iterated Range (calculated)</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><em>not avaialble</em></
p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>${1..groupList.size()}</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>List</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><em>not available</em></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${ [ user.name, user.email, user.phone ]
}</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Map</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><em>not available</em></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${ { 'id':'4039','type':'hourly' }
}</p></td></tr></tbody></table></div><p>Features shown as <em>not
available</em> above are absent by design, because (in both Tapestry and JSF)
it is considered best to keep complex logic in the component class rather than
in the template.</p><h2
id="TapestryforJSFUsers-EventHandling&PageNavigation">Event Handling &
Page Navigation</h2><h3 id="TapestryforJSFUsers-Eventhandling">Event handling<
/h3><p>In JSF, you specify the event via the <code>action</code> parameter
(for example, <h:commandButton value="Submit"
action="employeeBean.saveChanges">). For Tapestry, event handler methods are
found by method naming conventions (onSomeEvent() or by method annotations
(@Event), based on a combination of the "t:id" attribute and event name, and
the action name used depends on the component. For example, the
"<t:actionlink>" component in Tapestry emits an "action" event when
clicked, and you handle that event in your "onAction()" method.</p><h2
id="TapestryforJSFUsers-Validation">Validation</h2><p>Tapestry applications can
use JSR 303 Bean Validation annotations that JSF users should be familiar
with:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
+</div></div></div></div></div></div><h2
id="TapestryforJSFUsers-Expressionsintemplates">Expressions in
templates</h2><p>JSF uses the Unified Expression Language with the #{...} or
${...} syntax for accessing Backing Bean properties. For its part, Tapestry
uses the ${...} syntax with a similar but intentially limited expression
language called <a href="property-expressions.html">Property Expressions</a>.
Both allow easy access to properties via the usual JavaBean conventions, but
with Tapestry you don't have to specify which class the expression starts at
(because it always starts at the component class corresponding to the
template). Some comparisons:</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><th colspan="1" rowspan="1"
class="confluenceTh"><p>JSF Syntax</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Tapestry Syntax</p></th></tr><tr><td colspan="1"
rowspan="1" class="confluenc
eTd"><p>Property (calls getEmployeeName() or setEmployeeName())</p></td><td
colspan="1" rowspan="1"
class="confluenceTd"><p>#{employeeBean.employeeName}</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${employeeName}</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Boolean property (calls
isHourly() or setHourly())</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>#{employeeBean.hourly}</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${hourly}</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>Property chain</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>#{employeeBean.address.street}</p></td><td
colspan="1" rowspan="1"
class="confluenceTd"><p>${address.street}</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>Null-safe property chain</p></td><td
colspan="1" rowspan="1"
class="confluenceTd"><p>#{employeeBean.address.street}</p></td><td colspan="1"
rowspan="1" class="confluenceTd">
<p>${address?.street}</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>5th element in a List</p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p>#{employeeBean.employees[5].name}</p></td><td
colspan="1" rowspan="1"
class="confluenceTd"><p>${employees.get(5).name}</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Negation</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>#{!
employeeBean.hourly}</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>${! hourly}</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>Arithmetic & relational
operators</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>+-*/% div
mod</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><em>not
available</em></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Relational operators</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>== != ne < lt > gt <= le >=
ge</p></td><td c
olspan="1" rowspan="1" class="confluenceTd"><p><em>not
available</em></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Ternary operator</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>#{myBean.foo < 0 ? 'bar' : 'baz'}</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><em>not
available</em></p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Method calling</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>#{myBean.employees.size()}</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${employees.size()}</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Iterated Range</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><em>not
avaialble</em></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>${1..10}</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Iterated Range (calculated)</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><em>not avaialble
</em></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>${1..groupList.size()}</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>List</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><em>not available</em></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${ [ user.name, user.email, user.phone ]
}</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Map</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><em>not available</em></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>${ { 'id':'4039','type':'hourly' }
}</p></td></tr></tbody></table></div><p>Features shown as <em>not
available</em> above are absent by design, because (in both Tapestry and JSF)
it is considered best to keep complex logic in the component class rather than
in the template.</p><h2
id="TapestryforJSFUsers-EventHandling&PageNavigation">Event Handling &
Page Navigation</h2><h3 id="TapestryforJSFUsers-Eventhandling">Event ha
ndling</h3><p>In JSF, you specify the event via the <code>action</code>
parameter (for example, <h:commandButton value="Submit"
action="employeeBean.saveChanges">). For Tapestry, event handler methods are
found by method naming conventions (onSomeEvent() or by method annotations
(@Event), based on a combination of the "t:id" attribute and event name, and
the action name used depends on the component. For example, the
"<t:actionlink>" component in Tapestry emits an "action" event when
clicked, and you handle that event in your "onAction()" method.</p><h2
id="TapestryforJSFUsers-Validation">Validation</h2><p>Tapestry applications can
use JSR 303 Bean Validation annotations that JSF users should be familiar
with:</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 Employee {
@Validate("required,minlength=2,maxlength=100")
private String lastName;