You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by bu...@apache.org on 2016/11/30 03:20:32 UTC

svn commit: r1001868 - in /websites/production/tapestry/content: cache/main.pageCache getting-started.html tapestry-for-jsf-users.html

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 @@
 &lt;/html&gt;
 </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;">&lt;html&gt;
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">&lt;html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"&gt;
   &lt;body&gt;
     &lt;p&gt;${greeting}&lt;/p&gt;
   &lt;/body&gt;
@@ -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>&#160;</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 &amp; 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; lt &gt; gt &lt;= le &gt;= 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 &lt; 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&amp;PageNavigation">Event Handling &amp; 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, &lt;h:commandButton value="Submit" action="employeeBean.saveChanges"&gt;). 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 "&lt;t:actionlink&gt;" 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>&#160;</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 &amp; 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; lt &gt; gt &lt;= le &gt;= 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 &lt; 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&amp;PageNavigation">Event Handling &amp; 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, &lt;h:commandButton value="Submit" action="employeeBean.saveChanges"&gt;). 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 "&lt;t:actionlink&gt;" 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;