tapestry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From build...@apache.org
Subject svn commit: r961249 - in /websites/production/tapestry/content: ./ cache/
Date Sun, 09 Aug 2015 16:20:08 GMT
Author: buildbot
Date: Sun Aug  9 16:20:08 2015
New Revision: 961249

Log:
Production update by buildbot for tapestry

Modified:
    websites/production/tapestry/content/aliases.html
    websites/production/tapestry/content/cache/main.pageCache
    websites/production/tapestry/content/creating-the-skeleton-application.html
    websites/production/tapestry/content/exploring-the-project.html
    websites/production/tapestry/content/implementing-the-hi-lo-guessing-game.html
    websites/production/tapestry/content/using-beaneditform-to-create-user-forms.html
    websites/production/tapestry/content/using-tapestry-with-hibernate.html

Modified: websites/production/tapestry/content/aliases.html
==============================================================================
--- websites/production/tapestry/content/aliases.html (original)
+++ websites/production/tapestry/content/aliases.html Sun Aug  9 16:20:08 2015
@@ -136,7 +136,7 @@
                         
                     </div>
     </li></ul>
-</div><p>&#160;</p><p>See <a shape="rect" href="ioc-cookbook-overriding-ioc-services.html">IoC Cookbook - Overriding IoC Services</a></p><h1 id="Aliases-Introduction">Introduction</h1><p>Tapestry goes to great lengths so that you can use the [Inject|#inject.html] annotation on a field and provide no additional data, yet end up with the correct object or service.</p><p>In many cases, Tapestry must match a field type to an available IoC service.</p><p>If there is only single service in the registry that implements the service, Tapestry will utilize that service.</p><p>When there is more than one such service, it is necessary to disambiguate which service is to be injected. To disambiguate globally (across all injections), you must create an alias from the service interface directly to the particular service.</p><p>This takes the form of a contribution to the Alias service.</p><p>The Alias service has additional purposes: first, it allows for spot overrides on injected services, based 
 on the application's mode. Currently, the only mode is "servlet", but future modes may include "portlet" and possibly "offline".</p><p>Secondly, the companion AliasOverrides service configuration allows for spot overrides of specific services, without disturbing the rest of the network of services within the IoC Registry.</p><h1 id="Aliases-ContributinganAlias">Contributing an Alias</h1><p>To contribute a new service to the Alias service, you must first decide on a logical name. Often, this is the name of the service interface implemented by the service.</p><p>You can then contribute into the Infrastructure service's configuration:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div><p>&#160;</p><p>See <a shape="rect" href="ioc-cookbook-overriding-ioc-services.html">IoC Cookbook - Overriding IoC Services</a></p><h1 id="Aliases-Introduction">Introduction</h1><p>Tapestry goes to great lengths so that you can use the <a shape="rect" href="injection.html">Inject</a> annotation on a field and provide no additional data, yet end up with the correct object or service.</p><p>In many cases, Tapestry must match a field type to an available IoC service.</p><p>If there is only single service in the registry that implements the service, Tapestry will utilize that service.</p><p>When there is more than one such service, it is necessary to disambiguate which service is to be injected. To disambiguate globally (across all injections), you must create an alias from the service interface directly to the particular service.</p><p>This takes the form of a contribution to the Alias service.</p><p>The Alias service has additional purposes: first, it allows for spot overrides o
 n injected services, based on the application's mode. Currently, the only mode is "servlet", but future modes may include "portlet" and possibly "offline".</p><p>Secondly, the companion AliasOverrides service configuration allows for spot overrides of specific services, without disturbing the rest of the network of services within the IoC Registry.</p><h1 id="Aliases-ContributinganAlias">Contributing an Alias</h1><p>To contribute a new service to the Alias service, you must first decide on a logical name. Often, this is the name of the service interface implemented by the service.</p><p>You can then contribute into the Infrastructure service's configuration:</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 static void contributeAlias(@InjectService("MyService") MyService myService,
         Configuration&lt;AliasContribution&gt; configuration)
 {

Modified: websites/production/tapestry/content/cache/main.pageCache
==============================================================================
Binary files - no diff available.

Modified: websites/production/tapestry/content/creating-the-skeleton-application.html
==============================================================================
--- websites/production/tapestry/content/creating-the-skeleton-application.html (original)
+++ websites/production/tapestry/content/creating-the-skeleton-application.html Sun Aug  9 16:20:08 2015
@@ -81,7 +81,7 @@
   &lt;localRepository&gt;C:/Users/joeuser/.m2/repository&lt;/localRepository&gt;
 &lt;/settings&gt;
 </pre>
-</div></div><p>Of course, adjust the <code>localRepository</code> element to match the correct path for your computer.</p></div></div><p>Okay, let's get started creating our new project.</p><p>In Eclipse, go to <strong>File &gt; New &gt;</strong> <strong>Project... &gt; Maven &gt; Maven Project</strong></p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/select-a-wizard.png"></span></p><p>Then click <strong>Next</strong>, <strong>Next</strong> (again), and then on the <strong>Select an Archetype</strong> page click the <strong>Configure</strong> button on the Catalog line. The <strong>Archetype</strong> preferences dialog should appear. Click the <strong>Add Remote Catalog...</strong> button, as shown below:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/add-archetype-catalog.png"></span></p><p>As shown above, en
 ter <span class="nolink"><span class="nolink">"http://tapestry.apache.org"</span></span> in the Catalog File field, and "Apache Tapestry" in the Description field.</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>If you want to try an unreleased (alpha or beta) version of Tapestry, use <span class="nolink">the <strong>https://repository.apache.org/content/repositories/staging</strong></span> archetype catalog file instead.</p></div></div><p>Click <strong>OK</strong>, then<strong> OK</strong> again.</p><p>On the Select an Archetype dialog (shown below), select the newly-added Apache Tapestry catalog, then select the "quickstart" artifact from the list and click <strong>Next</strong>.</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-ap
 plication.data/select-archetype.png"></span></p><p><em><strong>Note:</strong> Screenshots in this tutorial may show different (either newer or older) versions of Tapestry than you may see.</em></p><p>Fill in the Group Id, Artifact Id, Version and Package&#160; as follows:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/specify-archetype-parameters.png"></span></p><p>then click Finish.</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>The first time you use Maven, project creation may take a while as Maven downloads a large number of JAR dependencies for Maven, Jetty and Tapestry. These downloaded files are cached locally and will not need to be downloaded again, but you do have to be patient on first use.</p></div></
 div><p>After Maven finishes, you'll see a new directory, <code>tutorial in your Package Explorer view in Eclipse.</code></p><h2 id="CreatingTheSkeletonApplication-RunningtheApplicationusingJetty">Running the Application using Jetty</h2><p>One of the first things you can do is use Maven to run Jetty directly.</p><p>Right-click on the tutorial project in your Package Explorer view and select <strong>Run As &gt; Maven Build... &gt;</strong>, enter a Goal of <strong>"jetty:run"</strong>. This creates a "Run Configuration" named "tutorial1" that we'll use throughout this tutorial to start the app:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/run-configuration.png"></span></p><p>Tapestry runs best with a couple of additional options; click the "JRE" tab and enter the following VM Arguments:</p><pre></pre><p>-XX:MaxPermSize=256M</p><p>-Xmx600m</p><p>-Dtapestry.execution-mode=development</p><p><code><
 em>(If you're using JDK 1.8 then you should omit the MaxPermSize argument.)</em></code></p><p><code>Here's how it looks:<br clear="none"></code></p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/run-configuration-jre.png"></span></p><p>Finally, click <strong>Run</strong>.</p><p>Again, the first time, there's a dizzying number of downloads, but before you know it, the Jetty servlet container is up and running.</p><p>Once Jetty is initialized (which only takes a few seconds after the first time), you'll see the following in your console:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/console-startup.png"></span></p><p><em>Note the red square icon above. Later on you'll use that icon to stop Jetty before restarting the app.</em></p><p>You can now open a web browser to <a shape="rect" class="external-link" href="ht
 tp://localhost:8080/tutorial1/" >http://localhost:8080/tutorial1/</a> to see the running application:</p><p>&#160;</p><p><span class="confluence-embedded-file-wrapper image-left-wrapper"><img class="confluence-embedded-image confluence-content-image-border image-left" src="creating-the-skeleton-application.data/startpage.png"></span></p><p>&#160;</p><div style="clear: both"></div><p style="text-align: left;">The date and time in the middle of the page shows that this is a live application.</p><p>This is a complete little web app; it doesn't do much, but it demonstrate how to create a number of pages sharing a common layout, and demonstrates some simple navigation and link handling. You can see that it has several different pages that share a common layout. (<span style="line-height: 1.4285715;"><em>Layout</em> is a loose term meaning common look and feel and navigation across many or all of the pages of an application. Often an application will include a Layout component to provide 
 that commonness.)</span></p><p><span style="line-height: 1.4285715;">Next: <a shape="rect" href="exploring-the-project.html">Exploring the Project</a></span></p><p><span style="line-height: 1.4285715;"><br clear="none"></span></p></div>
+</div></div><p>Of course, adjust the <code>localRepository</code> element to match the correct path for your computer.</p></div></div><p>Okay, let's get started creating our new project.</p><p>In Eclipse, go to <strong>File &gt; New &gt;</strong> <strong>Project... &gt; Maven &gt; Maven Project</strong></p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/select-a-wizard.png"></span></p><p>Then click <strong>Next</strong>, <strong>Next</strong> (again), and then on the <strong>Select an Archetype</strong> page click the <strong>Configure</strong> button on the Catalog line. The <strong>Archetype</strong> preferences dialog should appear. Click the <strong>Add Remote Catalog...</strong> button, as shown below:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/add-archetype-catalog.png"></span></p><p>As shown above, en
 ter <span class="nolink"><span class="nolink">"http://tapestry.apache.org"</span></span> in the Catalog File field, and "Apache Tapestry" in the Description field.</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>If you want to try an unreleased (alpha or beta) version of Tapestry, use <span class="nolink">the <strong>https://repository.apache.org/content/repositories/staging</strong></span> archetype catalog file instead.</p></div></div><p>Click <strong>OK</strong>, then<strong> OK</strong> again.</p><p>On the Select an Archetype dialog (shown below), select the newly-added Apache Tapestry catalog, then select the "quickstart" artifact from the list and click <strong>Next</strong>.</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-ap
 plication.data/select-archetype.png"></span></p><p><em><strong>Note:</strong> Screenshots in this tutorial may show different (either newer or older) versions of Tapestry than you may see.</em></p><p>Fill in the Group Id, Artifact Id, Version and Package&#160; as follows:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/specify-archetype-parameters.png"></span></p><p>then click Finish.</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>The first time you use Maven, project creation may take a while as Maven downloads a large number of JAR dependencies for Maven, Jetty and Tapestry. These downloaded files are cached locally and will not need to be downloaded again, but you do have to be patient on first use.</p></div></
 div><p>After Maven finishes, you'll see a new directory, <code>tutorial1, in your Package Explorer view in Eclipse.</code></p><h2 id="CreatingTheSkeletonApplication-RunningtheApplicationusingJetty">Running the Application using Jetty</h2><p>One of the first things you can do is use Maven to run Jetty directly.</p><p>Right-click on the <code>tutorial1</code> project in your Package Explorer view and select <strong>Run As &gt; Maven Build... &gt;</strong>, enter a Goal of <strong>"jetty:run"</strong>. This creates a "Run Configuration" named "tutorial1" that we'll use throughout this tutorial to start the app:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/run-configuration.png"></span></p><p>Tapestry runs best with a couple of additional options; click the "JRE" tab and enter the following VM Arguments:</p><pre></pre><p>-XX:MaxPermSize=256M</p><p>-Xmx600m</p><p>-Dtapestry.execution-mode=developme
 nt</p><p><code><em>(If you're using JDK 1.8 then you should omit the MaxPermSize argument.)</em></code></p><p><code>Here's how it looks:<br clear="none"></code></p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/run-configuration-jre.png"></span></p><p>Finally, click <strong>Run</strong>.</p><p>Again, the first time, there's a dizzying number of downloads, but before you know it, the Jetty servlet container is up and running.</p><p>Once Jetty is initialized (which only takes a few seconds after the first time), you'll see the following in your console:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="creating-the-skeleton-application.data/console-startup.png"></span></p><p><em>Note the red square icon above. Later on you'll use that icon to stop Jetty before restarting the app.</em></p><p>You can now open a web browser to <a shape="rect" class="externa
 l-link" href="http://localhost:8080/tutorial1/" >http://localhost:8080/tutorial1/</a> to see the running application:</p><p>&#160;</p><p><span class="confluence-embedded-file-wrapper image-left-wrapper"><img class="confluence-embedded-image confluence-content-image-border image-left" src="creating-the-skeleton-application.data/startpage.png"></span></p><p>&#160;</p><div style="clear: both"></div><p style="text-align: left;">The date and time in the middle of the page shows that this is a live application.</p><p>This is a complete little web app; it doesn't do much, but it demonstrate how to create a number of pages sharing a common layout, and demonstrates some simple navigation and link handling. You can see that it has several different pages that share a common layout. (<span style="line-height: 1.4285715;"><em>Layout</em> is a loose term meaning common look and feel and navigation across many or all of the pages of an application. Often an application will include a Layout compo
 nent to provide that commonness.)</span></p><p><span style="line-height: 1.4285715;">Next: <a shape="rect" href="exploring-the-project.html">Exploring the Project</a></span></p><p><span style="line-height: 1.4285715;"><br clear="none"></span></p></div>
 </div>
 
 <div class="clearer"></div>

Modified: websites/production/tapestry/content/exploring-the-project.html
==============================================================================
--- websites/production/tapestry/content/exploring-the-project.html (original)
+++ websites/production/tapestry/content/exploring-the-project.html Sun Aug  9 16:20:08 2015
@@ -78,7 +78,7 @@
         &lt;!-- The only significant configuration for Tapestry 5, this informs Tapestry
 of where to look for pages, components and mixins. --&gt;
         &lt;param-name&gt;tapestry.app-package&lt;/param-name&gt;
-        &lt;param-value&gt;com.example.tutorial&lt;/param-value&gt;
+        &lt;param-value&gt;com.example.tutorial1&lt;/param-value&gt;
     &lt;/context-param&gt;
     &lt;!--
     Specify some additional Modules for two different execution
@@ -88,13 +88,13 @@ of where to look for pages, components a
     &lt;context-param&gt;
         &lt;param-name&gt;tapestry.development-modules&lt;/param-name&gt;
         &lt;param-value&gt;
-            com.example.tutorial.services.DevelopmentModule
+            com.example.tutorial1.services.DevelopmentModule
         &lt;/param-value&gt;
     &lt;/context-param&gt;
     &lt;context-param&gt;
         &lt;param-name&gt;tapestry.qa-modules&lt;/param-name&gt;
         &lt;param-value&gt;
-            com.example.tutorial.services.QaModule
+            com.example.tutorial1.services.QaModule
         &lt;/param-value&gt;
     &lt;/context-param&gt;
     &lt;filter&gt;
@@ -107,8 +107,8 @@ of where to look for pages, components a
     &lt;/filter-mapping&gt;
 &lt;/web-app&gt;
 </pre>
-</div></div><p>This is short and sweet: you can see that the package name you provided earlier shows up as the <code>tapestry.app-package</code> context parameter; the TapestryFilter instance will use this information to locate the Java classes for pages and components.</p><p>Tapestry operates as a <em>servlet filter</em> rather than as a traditional <em>servlet</em>. In this way, Tapestry has a chance to intercept all incoming requests, to determine which ones apply to Tapestry pages (or other resources). The net effect is that you don't have to maintain any additional configuration for Tapestry to operate, regardless of how many pages or components you add to your application.</p><p>Much of the rest of web.xml is configuration to match Tapestry execution modes against module classes. An execution mode defines how the application is being run: the default execution mode is "production", but the web.xml defines two additional modes: "development" and "qa" (for "Quality Assurance"). 
 The module classes indicated will be loaded for those execution modes, and can change the configuration of the application is various ways. We'll come back to execution modes and module classes later in the tutorial.</p><p>Tapestry pages minimally consist of an ordinary Java class plus a component template file.</p><p>In the root of your web application, a page named "Index" will be used for any request that specifies no additional path after the context name.</p><h1 id="ExploringtheProject-IndexJavaClass">Index Java Class</h1><p>Tapestry has very specific rules for where page classes go. Tapestry adds a sub-package, "pages", to the root application package ("com.example.tutorial"); the Java classes for pages goes there. Thus the full Java class name is com.example.tutorial.pages.Index.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/pages/Index.java</b></div><di
 v class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages;
+</div></div><p>This is short and sweet: you can see that the package name you provided earlier shows up as the <code>tapestry.app-package</code> context parameter; the TapestryFilter instance will use this information to locate the Java classes for pages and components.</p><p>Tapestry operates as a <em>servlet filter</em> rather than as a traditional <em>servlet</em>. In this way, Tapestry has a chance to intercept all incoming requests, to determine which ones apply to Tapestry pages (or other resources). The net effect is that you don't have to maintain any additional configuration for Tapestry to operate, regardless of how many pages or components you add to your application.</p><p>Much of the rest of web.xml is configuration to match Tapestry execution modes against module classes. An execution mode defines how the application is being run: the default execution mode is "production", but the web.xml defines two additional modes: "development" and "qa" (for "Quality Assurance"). 
 The module classes indicated will be loaded for those execution modes, and can change the configuration of the application is various ways. We'll come back to execution modes and module classes later in the tutorial.</p><p>Tapestry pages minimally consist of an ordinary Java class plus a component template file.</p><p>In the root of your web application, a page named "Index" will be used for any request that specifies no additional path after the context name.</p><h1 id="ExploringtheProject-IndexJavaClass">Index Java Class</h1><p>Tapestry has very specific rules for where page classes go. Tapestry adds a sub-package, "pages", to the root application package ("com.example.tutorial1"); the Java classes for pages goes there. Thus the full Java class name is <code>com.example.</code>tutorial<code>1.pages.Index</code>.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/p
 ages/Index.java</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
 
 import java.util.Date;
 import org.apache.tapestry5.annotations.*;
@@ -233,13 +233,13 @@ public class Index
 
 
 
-<span class="gliffy-container" id="gliffy-container-24346949-9971" data-fullwidth="913" data-ceoid="24188263" data-edit="${diagramEditLink.getLinkUrl()}" data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Templates and Parameters">
+<span class="gliffy-container" id="gliffy-container-24346949-9182" data-fullwidth="913" data-ceoid="24188263" data-edit="${diagramEditLink.getLinkUrl()}" data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Templates and Parameters">
 
-    <map id="gliffy-map-24346949-3231" name="gliffy-map-24346949-3231"></map>
+    <map id="gliffy-map-24346949-4085" name="gliffy-map-24346949-4085"></map>
 
-    <img class="gliffy-image gliffy-image-border" id="gliffy-image-24346949-9971" width="304" height="300" data-full-width="913" data-full-height="901" src="https://cwiki.apache.org/confluence/download/attachments/24188263/Templates%20and%20Parameters.png?version=2&amp;modificationDate=1371888025000&amp;api=v2" alt="Templates and Parameters" usemap="#gliffy-map-24346949-3231">
+    <img class="gliffy-image gliffy-image-border" id="gliffy-image-24346949-9182" width="304" height="300" data-full-width="913" data-full-height="901" src="https://cwiki.apache.org/confluence/download/attachments/24188263/Templates%20and%20Parameters.png?version=2&amp;modificationDate=1371888025000&amp;api=v2" alt="Templates and Parameters" usemap="#gliffy-map-24346949-4085">
 
-    <map class="gliffy-dynamic" id="gliffy-dynamic-map-24346949-9971" name="gliffy-dynamic-map-24346949-9971"></map>
+    <map class="gliffy-dynamic" id="gliffy-dynamic-map-24346949-9182" name="gliffy-dynamic-map-24346949-9182"></map>
 </span>
 
 

Modified: websites/production/tapestry/content/implementing-the-hi-lo-guessing-game.html
==============================================================================
--- websites/production/tapestry/content/implementing-the-hi-lo-guessing-game.html (original)
+++ websites/production/tapestry/content/implementing-the-hi-lo-guessing-game.html Sun Aug  9 16:20:08 2015
@@ -79,8 +79,10 @@
 
 &lt;/html&gt;
 </pre>
-</div></div><p>And edit the corresponding Java class, Index.java, removing its body (but leaving the imports in place for now):</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Index.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">public class Index
+</div></div><p>And edit the corresponding Java class, Index.java, removing its body (but you can leave the imports in place for now):</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Index.java</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
+
+public class Index
 {
 }
 </pre>
@@ -90,7 +92,7 @@
     &lt;/p&gt;
 </pre>
 </div></div><p>If you refresh the browser and hover your mouse over the "start guessing" link, you'll see that its URL is now /tutorial1/index.start, which identifies the name of the page ("index") and the id of the component ("start").</p><p>If you click the link now, you'll get an error:</p><p><span class="confluence-embedded-file-wrapper image-center-wrapper confluence-embedded-manual-size"><img class="confluence-embedded-image image-center" width="500" src="implementing-the-hi-lo-guessing-game.data/Application_Exception.png"></span></p><p>&#160;</p><p>Tapestry is telling us that we need to provide some kind of event handler for that event. What does that look like?</p><p>An event handler is a method of the Java class with a special name. The name is <code>on</code><strong><em>Eventname</em></strong><code>From</code><strong><em>Component-id</em></strong> ... here we want a method named <code>onActionFromStart()</code>. How do we know that "action" is the right event name? Because
  that's what ActionLink does, that's why its named <strong><em>Action</em></strong>Link.</p><p>Once again, Tapestry gives us options; if you don't like naming conventions, there's an @<a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/OnEvent.html">OnEvent</a> annotation you can place on the method instead, which restores the freedom to name the method as you like. Details about this approach are in the <a shape="rect" href="component-events.html">Tapestry Users' Guide</a>. We'll be sticking with the naming convention approach for the tutorial.</p><p>When handling a component event request (the kind of request triggered by the ActionLink component's URL), Tapestry will find the component and trigger a component event on it. This is the callback our server-side code needs to figure out what the user is doing on the client side. Let's start with an empty event handler:</p><div class="code panel pdl" style="border-wid
 th: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Index.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
 
 public class Index
 {
@@ -118,7 +120,7 @@ public class Index
 [INFO] AppModule.TimingFilter Request time: 5 ms
 </pre>
 </div></div><p>The @Log annotation directs Tapestry to log method entry and exit. You'll get to see any parameters passed into the method, and any return value from the method ... as well as any exception thrown from within the method. It's a powerful debugging tool. This is an example of Tapestry's meta-programming power, something we'll use quite a bit of in the tutorial.</p><p>Why do we see two requests for one click? Tapestry uses an approach based on the <a shape="rect" class="external-link" href="http://en.wikipedia.org/wiki/Post/Redirect/Get" >Post/Redirect/Get</a> pattern. In fact, Tapestry generally performs a redirect after each component event. So the first request was to process the action, and the second request was to re-render the Index page. You can see this in the browser, because the URL is still "/tutorial1" (the URL for rendering the Index page). We'll return to this in a bit.</p><p>We're ready for the next step, which involves tying together the Index and Guess 
 pages. Index will select a target number for the user to Guess, then "pass the baton" to the Guess page.</p><p>Let's start by thinking about the Guess page. It needs a variable to store the target value in, and it needs a method that the Index page can invoke, to set up that target value.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Guess.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
 
 public class Guess
 {
@@ -131,7 +133,7 @@ public class Guess
 }
 </pre>
 </div></div><p>Create that Guess.java file in the same folder as Index.java. Next, we can modify Index to invoke the <code>setup()</code> method of our new Guess page class:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Index.java (revised)</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
 
 import java.util.Random;
 
@@ -199,7 +201,7 @@ public class Index
 &lt;/html&gt;
 </pre>
 </div></div><p>So it looks like we need a <code>guessCount</code> property that starts at 1.</p><p>We're also seeing one new component, the Loop component. A Loop component iterates over the values passed to it in its <code>source</code> parameter, and renders it body once for each value. It updates the property bound to its <code>value</code> parameter before rendering its body.</p><p>That special property expression, <code>1..10</code>, generates a series of numbers from 1 to 10, inclusive. usually, when you use the Loop component, you are iterating over a List or Collection of values, such as the results of a database query.</p><p>So, the Loop component is going to set the <code>current</code> property to 1, and render its body (the \&lt;li\&gt; tag, and the ActionLink component). Then its going to set the <code>current</code> property to 2 and render its body again ... all the way up to 10.</p><p>And notice what we're doing with the ActionLink component; its no longer enough to 
 know the user clicked on the ActionLink ... we need to know <em>which iteration</em> the user clicked on. The <code>context</code> parameter allows a value to be added to the ActionLink's URL, and we can get it back in the event handler method.</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>The URL for the ActionLink will be <code>/tutorial1/guess.makeguess/3</code>. That's the page name, "Guess", the component id, "makeGuess", and the context value, "3".</p></div></div><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Guess.java (revised)</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
 
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
@@ -261,7 +263,7 @@ public class Guess
     &lt;/t:if&gt;
 </pre>
 </div></div><p>This snippet uses Tapestry's <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/If.html">If</a> component. The If component evaluates its <code>test</code> parameter and, if the value evaluates to true, renders its body. The property bound to <code>test</code> doesn't have to be a boolean; Tapestry treats <code>null</code> as false, it treats zero as false and non-zero as true, it treats an empty Collection as false ... and for Strings (such as <code>message</code>) it treats a blank string (one that is null, or consists only of white space) as false, and a non-blank string is true.</p><p>We can wrap up with the "GameOver" page:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>GameOver.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
 
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;

Modified: websites/production/tapestry/content/using-beaneditform-to-create-user-forms.html
==============================================================================
--- websites/production/tapestry/content/using-beaneditform-to-create-user-forms.html (original)
+++ websites/production/tapestry/content/using-beaneditform-to-create-user-forms.html Sun Aug  9 16:20:08 2015
@@ -67,9 +67,9 @@
 
 <div id="content">
 <div id="ConfluenceContent"><p>In the previous chapters, we saw how Tapestry can handle simple links, even links that pass information in the URL. In this chapter, we'll see how Tapestry can do the same, and quite a bit more, for HTML forms.</p><p>Form support in Tapestry is deep and rich, more than can be covered in a single chapter. However, we can show the basics, including some very common development patterns. To get started, let's create a simple address book application.</p><p>We'll start with the entity data, a simple object to store the information we'll need. These classes go in an <code>entities</code> sub-package. Unlike the use of the <code>pages</code> sub-package (for page component classes), this is not enforced by Tapestry; it's just a convention (but as we'll see shortly, a handy one).</p><p>Tapestry treats public fields as if they were JavaBeans properties; since the Address object is just "dumb data", there's no need to get carried away writing getters and setter
 s. Instead, we'll define an entity that is all public fields:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/entities/Address.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.entities;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.entities;
 
-import com.example.tutorial.data.Honorific;
+import com.example.tutorial1.data.Honorific;
 
 public class Address
 {
@@ -86,7 +86,7 @@ public class Address
 }
 </pre>
 </div></div><p>We also need to define the enum type, Honorific:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/data/Honorific.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.data;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.data;
 
 public enum Honorific
 {
@@ -109,30 +109,30 @@ public enum Honorific
 &lt;/html&gt;
 </pre>
 </div></div><p>(Note: for Tapestry 5.4, make that <code>tapestry_5_4.xsd</code> instead.)</p><p>Next, the corresponding class:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/pages/address/CreateAddress.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages.address;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages.address;
 
 public class CreateAddress
 {
 
 }
 </pre>
-</div></div><p>So ... why is the class named "CreateAddress" and not simply "Create"? Actually, we could have named it "Create", and the application would still work, but the longer <em>class</em> name is equally valid. Tapestry noticed the redundancy in the class name (com.example.tutorial.pages.<code><em>address</em></code>.Create<em>Address</em>) and just stripped out the redundant suffix.</p><p><span style="line-height: 1.4285715;">Tapestry actually creates a bunch of aliases for you pages; any of these aliases are valid and can appear in URLs or in the page parameter of PageLink. &#160;You can see the list in the console:</span></p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>So ... why is the class named "CreateAddress" and not simply "Create"? Actually, we could have named it "Create", and the application would still work, but the longer <em>class</em> name is equally valid. Tapestry noticed the redundancy in the class name (com.example.tutorial1.pages.<code><em>address</em></code>.Create<em>Address</em>) and just stripped out the redundant suffix.</p><p><span style="line-height: 1.4285715;">Tapestry actually creates a bunch of aliases for you pages; any of these aliases are valid and can appear in URLs or in the page parameter of PageLink. &#160;You can see the list in the console:</span></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;">[INFO] TapestryModule.ComponentClassResolver Available pages (12):
-              (blank): com.example.tutorial.pages.Index
+              (blank): com.example.tutorial1.pages.Index
    ComponentLibraries: org.apache.tapestry5.corelib.pages.ComponentLibraries
-             Error404: com.example.tutorial.pages.Error404
+             Error404: com.example.tutorial1.pages.Error404
       ExceptionReport: org.apache.tapestry5.corelib.pages.ExceptionReport
-             GameOver: com.example.tutorial.pages.GameOver
-                Guess: com.example.tutorial.pages.Guess
-                Index: com.example.tutorial.pages.Index
+             GameOver: com.example.tutorial1.pages.GameOver
+                Guess: com.example.tutorial1.pages.Guess
+                Index: com.example.tutorial1.pages.Index
           PageCatalog: org.apache.tapestry5.corelib.pages.PageCatalog
 PropertyDisplayBlocks: org.apache.tapestry5.corelib.pages.PropertyDisplayBlocks
    PropertyEditBlocks: org.apache.tapestry5.corelib.pages.PropertyEditBlocks
         ServiceStatus: org.apache.tapestry5.corelib.pages.ServiceStatus
           T5Dashboard: org.apache.tapestry5.corelib.pages.T5Dashboard
-       address/Create: com.example.tutorial.pages.address.CreateAddress
-address/CreateAddress: com.example.tutorial.pages.address.CreateAddress</pre>
-</div></div><p><span style="line-height: 1.4285715;">Tapestry users the shortest alias when constructing URLs.</span></p><p><span style="line-height: 1.4285715;">Eventually, your application will probably have more entities: perhaps you'll have a "user/Create" page and a "payment/Create" page and an "account/Create" page. You </span><em style="line-height: 1.4285715;">could</em><span style="line-height: 1.4285715;"> have a bunch of different classes all named Create spread across a number of different packages. That's legal Java, but it isn't ideal. You may find yourself accidentally editing the Java code for creating an Account when you really want to be editing the code for creating a Payment.</span></p><p>Tapestry is encouraging you to use a more descriptive name: Create<em>Address</em>, not just Create, but it isn't making you pay the cost (in terms of longer, uglier URLs). The URL to access the page will still be <a shape="rect" class="external-link" href="http://localhost:8080
 /tutorial1/address/create" >http://localhost:8080/tutorial1/address/create</a>.</p><p>And remember, regardless of the name that Tapestry assigns to your page, the template file is named like the Java class itself: CreateAddress.tml.</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>Index pages work in folders as well. A class named com.example.tutorial.pages.address.AddressIndex would be given the name "address/Index". However, Tapestry has special rules for pages named "Index" and the rendered URL would be <a shape="rect" class="external-link" href="http://localhost:8080/tutorial1/address/" >http://localhost:8080/tutorial1/address/</a>. In other words, you can place Index pages in any folder and Tapestry will build a short URL for that page ... and you <em>don't</em> have to keep naming the classes Ind
 ex (it's confusing to have many classes with the same name, even across multiple packages); instead, you can name each index page after the package that contains it. Tapestry users a smart <em>convention</em> to keep it all straight and generate short, to the point URLs.</p></div></div><h1 id="UsingBeanEditFormToCreateUserForms-UsingtheBeanEditFormComponent">Using the BeanEditForm Component</h1><p>Time to start putting together the logic for this form. Tapestry has a specific component for client-side Forms: the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Form.html">Form</a> component, as well as components for form controls, such as <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Checkbox.html">Checkbox</a> and <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corel
 ib/components/TextField.html">TextField</a>. We'll cover those in a bit more detail later .. instead, we're again going to let Tapestry do the heavy lifting for us, via the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/BeanEditForm.html">BeanEditForm</a> component.</p><p>Add the following to the CreateAddress template (replacing the "coming soon ..." message):</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CreateAddress.tml (partial)</b></div><div class="codeContent panelContent pdl">
+       address/Create: com.example.tutorial1.pages.address.CreateAddress
+address/CreateAddress: com.example.tutorial1.pages.address.CreateAddress</pre>
+</div></div><p><span style="line-height: 1.4285715;">Tapestry users the shortest alias when constructing URLs.</span></p><p><span style="line-height: 1.4285715;">Eventually, your application will probably have more entities: perhaps you'll have a "user/Create" page and a "payment/Create" page and an "account/Create" page. You </span><em style="line-height: 1.4285715;">could</em><span style="line-height: 1.4285715;"> have a bunch of different classes all named Create spread across a number of different packages. That's legal Java, but it isn't ideal. You may find yourself accidentally editing the Java code for creating an Account when you really want to be editing the code for creating a Payment.</span></p><p>Tapestry is encouraging you to use a more descriptive name: Create<em>Address</em>, not just Create, but it isn't making you pay the cost (in terms of longer, uglier URLs). The URL to access the page will still be <a shape="rect" class="external-link" href="http://localhost:8080
 /tutorial1/address/create" >http://localhost:8080/tutorial1/address/create</a>.</p><p>And remember, regardless of the name that Tapestry assigns to your page, the template file is named like the Java class itself: CreateAddress.tml.</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>Index pages work in folders as well. A class named com.example.tutorial1.pages.address.AddressIndex would be given the name "address/Index". However, Tapestry has special rules for pages named "Index" and the rendered URL would be <a shape="rect" class="external-link" href="http://localhost:8080/tutorial1/address/" >http://localhost:8080/tutorial1/address/</a>. In other words, you can place Index pages in any folder and Tapestry will build a short URL for that page ... and you <em>don't</em> have to keep naming the classes In
 dex (it's confusing to have many classes with the same name, even across multiple packages); instead, you can name each index page after the package that contains it. Tapestry users a smart <em>convention</em> to keep it all straight and generate short, to the point URLs.</p></div></div><h1 id="UsingBeanEditFormToCreateUserForms-UsingtheBeanEditFormComponent">Using the BeanEditForm Component</h1><p>Time to start putting together the logic for this form. Tapestry has a specific component for client-side Forms: the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Form.html">Form</a> component, as well as components for form controls, such as <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Checkbox.html">Checkbox</a> and <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/core
 lib/components/TextField.html">TextField</a>. We'll cover those in a bit more detail later .. instead, we're again going to let Tapestry do the heavy lifting for us, via the <a shape="rect" class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/BeanEditForm.html">BeanEditForm</a> component.</p><p>Add the following to the CreateAddress template (replacing the "coming soon ..." message):</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CreateAddress.tml (partial)</b></div><div class="codeContent panelContent pdl">
 <pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">    &lt;t:beaneditform object="address"/&gt;
 </pre>
 </div></div><p>And match that up with a property in the CreateAddress class:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CreateAddress.java (partial)</b></div><div class="codeContent panelContent pdl">

Modified: websites/production/tapestry/content/using-tapestry-with-hibernate.html
==============================================================================
--- websites/production/tapestry/content/using-tapestry-with-hibernate.html (original)
+++ websites/production/tapestry/content/using-tapestry-with-hibernate.html Sun Aug  9 16:20:08 2015
@@ -100,8 +100,8 @@
     &lt;/session-factory&gt;
 &lt;/hibernate-configuration&gt;
 </pre>
-</div></div><p>Most of the configuration is to identify the JDBC driver and connection URL.</p><p>Note the connection URL. We are instructing HSQLDB to store its database files within our project's target directory. We are also instructing HSQLDB to flush any data to these files at shutdown. This means that data will persist across different invocations of this project, but if the target directory is destroyed (e.g., via "mvn clean"), then all the database contents will be lost.</p><p>In addition, we are configuring Hibernate to <em>update</em> the database schema; when Hibernate initializes it will create or even modify tables to match the entities. Finally, we are configuring Hibernate to output any SQL it executes, which is very useful when initially building an application.</p><p>But what entities? Normally, the available entities are listed inside hibernate.cfg.xml, but that's not necessary with Tapestry; in another example of convention over configuration, Tapestry locates all
  entity classes inside the entities package ("com.example.tutorial.entities" in our case) and adds them to the configuration. Currently, that is just the Address entity.</p><h2 id="UsingTapestryWithHibernate-AddingHibernateAnnotations">Adding Hibernate Annotations</h2><p>For an entity class to be used with Hibernate, some Hibernate annotations must be added to the class.</p><p>Below is the updated Address class, with the Hibernate annotations (as well as the Tapestry ones).</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/entities/Address.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.entities;
+</div></div><p>Most of the configuration is to identify the JDBC driver and connection URL.</p><p>Note the connection URL. We are instructing HSQLDB to store its database files within our project's target directory. We are also instructing HSQLDB to flush any data to these files at shutdown. This means that data will persist across different invocations of this project, but if the target directory is destroyed (e.g., via "mvn clean"), then all the database contents will be lost.</p><p>In addition, we are configuring Hibernate to <em>update</em> the database schema; when Hibernate initializes it will create or even modify tables to match the entities. Finally, we are configuring Hibernate to output any SQL it executes, which is very useful when initially building an application.</p><p>But what entities? Normally, the available entities are listed inside hibernate.cfg.xml, but that's not necessary with Tapestry; in another example of convention over configuration, Tapestry locates all
  entity classes inside the entities package ("com.example.tutorial1.entities" in our case) and adds them to the configuration. Currently, that is just the Address entity.</p><h2 id="UsingTapestryWithHibernate-AddingHibernateAnnotations">Adding Hibernate Annotations</h2><p>For an entity class to be used with Hibernate, some Hibernate annotations must be added to the class.</p><p>Below is the updated Address class, with the Hibernate annotations (as well as the Tapestry ones).</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/entities/Address.java</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.entities;
 
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -111,7 +111,7 @@ import javax.persistence.Id;
 import org.apache.tapestry5.beaneditor.NonVisual;
 import org.apache.tapestry5.beaneditor.Validate;
 
-import com.example.tutorial.data.Honorific;
+import com.example.tutorial1.data.Honorific;
 
 @Entity
 public class Address
@@ -148,10 +148,10 @@ public class Address
 }
 </pre>
 </div></div><p>The Tapestry annotations, @NonVisual and @Validate, may be placed on the setter or getter method or on the field (as we have done here). As with the Hibernate annotations, putting the annotation on the field requires that the field name match the corresponding property name.</p><ul><li><strong>@NonVisual</strong> &#8211; indicates a field, such as a primary key, that should not be made visible to the user.</li><li><strong>@Validate</strong> &#8211; identifies the validations associated with a field.</li></ul><p>At this point you should stop and restart your application.</p><h2 id="UsingTapestryWithHibernate-UpdatingtheDatabase">Updating the Database</h2><p>So we have a database set up, and Hibernate is configured to connect to it. Let's make use of that to store our Address object in the database.</p><p>What we need is to provide some code to be executed when the form is submitted. When a Tapestry form is submitted, there is a whole series of events that get fired. Th
 e event we are interested in is the "success" event, which comes late in the process, after all the values have been pulled out of the request and applied to the page properties, and after all server-side validations have occurred.</p><p>The success event is only fired if there are no validation errors.</p><p>Our event handler must do two things:</p><ul><li>Use the Hibernate Session object to persist the new Address object.</li><li>Commit the transaction to force the data to be written to the database.</li></ul><p>Let's update our CreateAddress.java class:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/pages/address/CreateAddress.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages.address;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages.address;
 
-import com.example.tutorial.entities.Address;
-import com.example.tutorial.pages.Index;
+import com.example.tutorial1.entities.Address;
+import com.example.tutorial1.pages.Index;
 import org.apache.tapestry5.annotations.InjectPage;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.hibernate.annotations.CommitAfter;
@@ -183,11 +183,11 @@ public class CreateAddress
          include="honorific,firstName,lastName,street1,city,state,zip,phone"/&gt;
 </pre>
 </div></div><p>Note that the Grid component accepts many of the same parameters that we used with the BeanEditForm. Here we use the include parameter to specify the properties to show, and in what order.</p><p>Now all we have to do is supply the addresses property in the Java code. Here's how Index.java should look now:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>src/main/java/com/example/tutorial/pages/Index.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial.pages;
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package com.example.tutorial1.pages;
 import java.util.List;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.hibernate.Session;
-import com.example.tutorial.entities.Address;
+import com.example.tutorial1.entities.Address;
 public class Index
 {
     @Inject



Mime
View raw message