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 2019/01/25 12:21:24 UTC

svn commit: r1039509 - in /websites/production/tapestry/content: bean-validation.html cache/main.pageCache forms-and-validation.html

Author: buildbot
Date: Fri Jan 25 12:21:24 2019
New Revision: 1039509

Log:
Production update by buildbot for tapestry

Modified:
    websites/production/tapestry/content/bean-validation.html
    websites/production/tapestry/content/cache/main.pageCache
    websites/production/tapestry/content/forms-and-validation.html

Modified: websites/production/tapestry/content/bean-validation.html
==============================================================================
--- websites/production/tapestry/content/bean-validation.html (original)
+++ websites/production/tapestry/content/bean-validation.html Fri Jan 25 12:21:24 2019
@@ -92,11 +92,13 @@
 
 
 
+
+
 <h3>Related Articles</h3>
 
 <ul class="content-by-label"><li>
         <div>
-                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+                <span class="icon aui-icon content-type-page" title="Page">Page:</span>        </div>
 
         <div class="details">
                         <a  href="bean-validation.html">Bean Validation</a>
@@ -105,7 +107,7 @@
                     </div>
     </li><li>
         <div>
-                <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>        </div>
+                <span class="icon aui-icon content-type-page" title="Page">Page:</span>        </div>
 
         <div class="details">
                         <a  href="forms-and-validation.html">Forms and Validation</a>
@@ -117,7 +119,7 @@
 
 
 <p>Tapestry has always provided a powerful non-JSR 303 validation mechanism (see <a  href="forms-and-validation.html">Forms and Validation</a>). Among other things this mechanism allows you to annotate your domain model classes with the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beaneditor/Validate.html">@Validate</a> annotation. However, this annotation is problematic if your domain model is used in non-Tapestry applications as well as in Tapestry applications. Your non-Tapestry application becomes dependent on <em>tapestry5-annotations</em> module. To make your domain model independent from Tapestry you can use the <a  class="external-link" href="http://jcp.org/en/jsr/detail?id=303" rel="nofollow">JSR 303: Bean Validation</a> instead. This library provides integration between Tapestry and JSR-303.</p><h2 id="BeanValidation-Configuration">Configuration</h2><p>The Tapestry's JSR 303 - Bean Validation Library is responsible for con
 figuring and bootstrapping the <a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/Validator.html" rel="nofollow">Validator</a> for you. In order to use this library you have to choose an implementation of the JSR-303 specification like <a  class="external-link" href="https://www.hibernate.org/412.html" rel="nofollow">Hibernate Validator 4.x</a>. This library is not specific to any implementation of JSR-303 and will work with any implementation of your choice.</p><h3 id="BeanValidation-BootstrapingtheBeanValidator">Bootstraping the Bean Validator</h3><p>The <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beanvalidator/BeanValidatorSource.html">BeanValidatorSource</a> service is responsible for bootstrapping the <a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/Validator.html" rel="nofollow">Validator</a>. You can contribute a <a  class="external-link" href="htt
 p://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beanvalidator/BeanValidatorConfigurer.html">BeanValidatorConfigurer</a> to the configuration of this service in order to participate on the configuration of <a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/Validator.html" rel="nofollow">Validator</a>.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">@Contribute(BeanValidatorSource.class)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">@Contribute(BeanValidatorSource.class)
 public static void provideBeanValidatorConfigurer(OrderedConfiguration&lt;BeanValidatorConfigurer&gt; configuration)
 {
    configuration.add("MyConfigurer", new BeanValidatorConfigurer()
@@ -129,7 +131,7 @@ public static void provideBeanValidatorC
    });
 }</pre>
 </div></div><h3 id="BeanValidation-Validationgroups">Validation groups</h3><p>In JSR-303 validation groups are used to define a subset of the constraints validated at a given time. If no validation group is specified the <a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/groups/Default.html" rel="nofollow">Default</a> group is taken. By default, Tapestry passes only this group to <a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/Validator.html" rel="nofollow">Validator</a>. You can tell Tapestry to pass more groups by contributing group classes into the configuration of the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beanvalidator/BeanValidatorSource.html">BeanValidatorSource</a> service.</p><h2 id="BeanValidation-Usage">Usage</h2><h3 id="BeanValidation-ValidatingInputFields">Validating Input Fields</h3><p>Once you included this library and its dependencie
 s into your web app, you may use the JSR-303 annotations to validate the user's input.</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 Login
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">public class Login
 {
    @NotNull
    @Size(max=10)
@@ -148,7 +150,7 @@ public static void provideBeanValidatorC
    }
 }</pre>
 </div></div><p>You can even mix JSR-303 annotations and Tapestry's @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beaneditor/Validate.html">Validate</a> annotation.</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 Login
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">public class Login
 {
    @NotNull
    @Validate("maxlength=10")
@@ -167,7 +169,7 @@ public static void provideBeanValidatorC
    }
 }</pre>
 </div></div><p>Next you have to pass the object to validate into the Form's <em>validate</em> parameter. In the following example the Form's fields are bound to the properties of the <em>Login</em> page. That's why we pass <em>this</em>, thus the page instance, to the&#160; <em>validate</em> parameter.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">&lt;html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"&gt;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml; gutter: false; theme: Default" data-theme="Default">&lt;html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"&gt;
    &lt;body&gt;
       &lt;t:form validate="this"&gt;
 
@@ -188,7 +190,7 @@ public static void provideBeanValidatorC
    &lt;/body&gt;
 &lt;/html&gt;</pre>
 </div></div><p>Since the <em>validate</em> parameter defaults to the container of the Form component, we could also remove <em>validate="this"</em> in the example above.</p><h3 id="BeanValidation-ValidatingBeanswithBeanEditForm">Validating Beans with BeanEditForm</h3><p>If you use the <a  href="beaneditform-guide.html">BeanEditForm</a> component it's even easier to validate your beans. The only thing you have to do is to annotate your beans with JSR-303 annotations. If you are migrating from Tapestry's built-in validation mechanism to JSR-303 Bean Validation, you don't have to change your template at all.</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 User
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">public class User
 {
    @NotNull
    private String userName;
@@ -199,8 +201,8 @@ public static void provideBeanValidatorC
 
    ...
 }</pre>
-</div></div><h3 id="BeanValidation-Client-sideValidation">Client-side Validation</h3><p>Unfortunately JSR-303 doesn&#8217;t cover client-side validation, so web frameworks supporting this JSR need to come up with proprietary client-side solutions. Tapestry provides client-side validation for the following JSR-303 constraints:</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>JSR-303 constraint</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry' JavaScript function</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Max.html" rel="nofollow">@Max</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.maxnumber</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax
 /validation/constraints/Min.html" rel="nofollow">@Min</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.minnumber</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/NotNull.html" rel="nofollow">@NotNull</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.notnull</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Null.html" rel="nofollow">@Null</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.isnull</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Pattern.html" rel="nofollow">@Pattern</a></p></td><td colspan="1" rowspan="1" class="conf
 luenceTd"><p>Tapestry.Validator.pattern</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Size.html" rel="nofollow">@Size</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.size</p></td></tr></tbody></table></div><h3 id="BeanValidation-Providingownclient-sidevalidators">Providing own client-side validators</h3><p>Now let's see how to provide own client-side validation for JSR-303 constraints. Imagine you created the following constraint definition. The server-side implementation of the constraint is implemented by RangeValidator. I suppose you are familiar with JSR-303, so we won't explain how to implement RangeValidator.</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;">@Documented
+</div></div><h3 id="BeanValidation-Client-sideValidation">Client-side Validation</h3><p>Unfortunately JSR-303 doesn&#8217;t cover client-side validation, so web frameworks supporting this JSR need to come up with proprietary client-side solutions. Tapestry provides client-side validation for the following JSR-303 constraints:</p><div class="table-wrap"><table class="confluenceTable"><colgroup span="1"><col span="1"><col span="1"></colgroup><tbody><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>JSR-303 constraint</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry' JavaScript function</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Max.html" rel="nofollow">@Max</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.maxnumber</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external
 -link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Min.html" rel="nofollow">@Min</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.minnumber</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/NotNull.html" rel="nofollow">@NotNull</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.notnull</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Null.html" rel="nofollow">@Null</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.isnull</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Pattern.html" rel="nofollow">@P
 attern</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.pattern</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/Size.html" rel="nofollow">@Size</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Tapestry.Validator.size</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/AssertTrue.html" rel="nofollow">@AssertTrue</a> <em>(Since 5.4.5)</em></td><td colspan="1" rowspan="1" class="confluenceTd"><br clear="none"></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><a  class="external-link" href="http://download.oracle.com/javaee/6/api/javax/validation/constraints/AssertFalse.html" rel="nofollow">@AssertFalse</a> <em>(Since 5.4.5)</em></td><td colspan="1" rowspan="1" class="confluenceTd"><br clear="
 none"></td></tr></tbody></table></div><h3 id="BeanValidation-Providingownclient-sidevalidators">Providing own client-side validators</h3><p>Now let's see how to provide own client-side validation for JSR-303 constraints. Imagine you created the following constraint definition. The server-side implementation of the constraint is implemented by RangeValidator. I suppose you are familiar with JSR-303, so we won't explain how to implement RangeValidator.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">@Documented
 @Constraint(validatedBy = RangeValidator.class)
 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
 @Retention(RUNTIME)
@@ -216,7 +218,7 @@ public @interface Range {
    Class[] payload() default {};
 }</pre>
 </div></div><p>To provide client-side validation of a constraint you have to add a JavaScript function to the built-in <em>Tapestry.Validator</em> JavaScript-object. The function should contain exactly three parameters:</p><ol><li>Field being validated</li><li>Validation message</li><li>JSON object with values from the constraint annotation</li></ol><p>Here is an example:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: js; gutter: false; theme: Default" style="font-size:12px;">Tapestry.Validator.range = function(field, message, spec) {
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: js; gutter: false; theme: Default" data-theme="Default">Tapestry.Validator.range = function(field, message, spec) {
    field.addValidator(function(value) {
       if (value &lt; spec.min || value &gt; spec.max) {
          throw message;
@@ -224,7 +226,7 @@ public @interface Range {
    });
 };</pre>
 </div></div><p>Now you have to tell Tapestry to call the function <em>Tapestry.Validator.range</em> when client-side validation of <em>@Range</em> should be executed. This is accomplished by a contribution to the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptorSource.html">ClientConstraintDescriptorSource</a> service. The configuration of this service is a collection of <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beanvalidator/ClientConstraintDescriptor.html">ClientConstraintDescriptor</a>. Each <em>ClientConstraintDescriptor</em> represents a client-side validation constraint. The constructor of <em>ClientConstraintDescriptor</em> has three parameters:</p><ol><li>Class of the constraint annotation.</li><li>Name of the JavaScript function.</li><li>The last parameter is a varargs. It is used to pass the attribute names of the constraint annotatio
 n to be passed (along with their values) to the JavaScript function as an JSON object.</li></ol><p>The last step is to make the contribution, which links the <em>@Range</em> annotation with the JavaScript function <em>range</em>. The attributes <em>max</em> and <em>min</em> and their values are passed to the function.</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;">@Contribute(ClientConstraintDescriptorSource.class)
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">@Contribute(ClientConstraintDescriptorSource.class)
 public static void provideClientConstraintDescriptors(Configuration&lt;ClientConstraintDescriptor&gt; config) {
 
    config.add(new ClientConstraintDescriptor(Range.class, "range", "min", "max"));

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

Modified: websites/production/tapestry/content/forms-and-validation.html
==============================================================================
--- websites/production/tapestry/content/forms-and-validation.html (original)
+++ websites/production/tapestry/content/forms-and-validation.html Fri Jan 25 12:21:24 2019
@@ -104,7 +104,7 @@
                 <span class="icon aui-icon content-type-page" title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a  href="forms-and-form-components-faq.html">Forms and Form Components FAQ</a>
+                        <a  href="bean-validation.html">Bean Validation</a>
                 
                         
                     </div>
@@ -113,7 +113,7 @@
                 <span class="icon aui-icon content-type-page" title="Page">Page:</span>        </div>
 
         <div class="details">
-                        <a  href="bean-validation.html">Bean Validation</a>
+                        <a  href="forms-and-form-components-faq.html">Forms and Form Components FAQ</a>
                 
                         
                     </div>
@@ -122,11 +122,11 @@
 
 
 <p>&#160;</p><p>Tapestry provides support for creating and rendering forms, populating their fields, and validating user input. For simple cases, input validation is declarative, meaning you simply tell Tapestry what validations to apply to a given field, and it takes care of it on the server and (optionally) on the client as well. In addition, you can provide event handler methods&#160;in your page or component classes to handle more complex validation scenarios.</p><p>Finally, Tapestry not only makes it easy to present errors messages to the user, but it can also automatically highlight form fields when validation fails.</p><p><strong>Contents</strong></p><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1548415261309 {padding: 0px;}
-div.rbtoc1548415261309 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1548415261309 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1548418863351 {padding: 0px;}
+div.rbtoc1548418863351 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1548418863351 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1548415261309">
+/*]]>*/</style></p><div class="toc-macro rbtoc1548418863351">
 <ul class="toc-indentation"><li>Related Articles</li></ul>
 <ul><li><a  href="#FormsandValidation-TheFormComponent">The Form Component</a>
 <ul class="toc-indentation"><li><a  href="#FormsandValidation-FormEvents">Form Events</a></li><li><a  href="#FormsandValidation-HandlingEvents">Handling Events</a></li><li><a  href="#FormsandValidation-TrackingValidationErrors">Tracking Validation Errors</a></li><li><a  href="#FormsandValidation-StoringDataBetweenRequests">Storing Data Between Requests</a></li><li><a  href="#FormsandValidation-ConfiguringFieldsandLabels">Configuring Fields and Labels</a></li></ul>
@@ -135,7 +135,7 @@ div.rbtoc1548415261309 li {margin-left:
 <ul class="toc-indentation"><li><a  href="#FormsandValidation-CustomizingValidationMessagesforBeanEditForm">Customizing Validation Messages for BeanEditForm</a></li></ul>
 </li><li><a  href="#FormsandValidation-ConfiguringValidatorContraintsintheMessageCatalog">Configuring Validator Contraints in the Message Catalog</a></li><li><a  href="#FormsandValidation-ValidationMacros">Validation Macros</a></li><li><a  href="#FormsandValidation-OverridingtheTranslatorwithEvents">Overriding the Translator with Events</a></li></ul>
 </li></ul></div><h1 id="FormsandValidation-TheFormComponent">The Form Component</h1><p>The core of Tapestry's form support is the <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Form.html">Form</a> component. The Form component encloses (wraps around) all the other <em>field components</em> such as <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/TextField.html">TextField</a>, <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/TextArea.html">TextArea</a>, <a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/Checkbox.html">Checkbox</a>, etc.</p><h2 id="FormsandValidation-FormEvents">Form Events</h2><p>The Form component emits a number of <a  href="component-events.html">component events</a>. You'll want to provide event handler m
 ethods for some of these.</p><p>When rendering, the Form component emits two events: first, "prepareForRender", then "prepare". These allow the Form's container to set up any fields or properties that will be referenced in the form. For example, this is a good place to create a temporary entity object to be rendered, or to load an entity from a database to be edited.</p><p>When user submits the form on the client, a series of steps occur on the server.</p><p>First, the Form emits a "prepareForSubmit" event, then a "prepare" event. These allow the container to ensure that objects are set up and ready to receive information from the form submission.</p><p>Next, all the fields inside the form are <em>activated</em> to pull values out of the incoming request, validate them and (if valid) store the changes.</p><div class="navmenu" style="float:right; width:25%; background:#eee; margin:3px; padding:3px">
-<p><em>For Tapestry 4 Users:</em> Tapestry 5 does not use the fragile "form rewind" approach from Tapestry 4. Instead, a hidden field generated during the render stores the information needed to process the form submission.</p></div>&#160;<p><br clear="none"></p><p>After the fields have done their processing, the Form emits a "validate" event. This is your chance to perform any cross-form validation that can't be described declaratively.</p><p>Next, the Form determines if there have been any validation errors. If there have been, then the submission is considered a failure, and a "failure" event is emitted. If there have been no validation errors, then a "success" event is emitted.</p><p>Finally, the Form emits a "submit" event, for logic that doesn't care about success or failure.</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Form Event (in order)</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>P
 hase</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>When emitted (and typical use)</p></th><th colspan="1" rowspan="1" class="confluenceTh">Method Name</th><th colspan="1" rowspan="1" class="confluenceTh">@OnEvent Constant</th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepareForRender</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before rendering the form (e.g. load an entity from a database to be edited)</p></td><td colspan="1" rowspan="1" class="confluenceTd">onPrepareForRender()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPARE_FOR_RENDER</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepare</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before rendering the form, but after <em>prepareForRender</em></p></td><td c
 olspan="1" rowspan="1" class="confluenceTd">onPrepare()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPARE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepareForSubmit</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed</p></td><td colspan="1" rowspan="1" class="confluenceTd">onPrepareForSubmit()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPARE_FOR_SUBMIT</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepare</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed, but after <em>prepareForSubmit</em></p></td><td colspan="1" rowspan="1" class="confluenceTd">onPrepare()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPA
 RE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>validate</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After fields have been populated from submitted values and validated (e.g. perform cross-field validation)</p></td><td colspan="1" rowspan="1" class="confluenceTd">onValidate</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.VALIDATE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>validateForm</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>same as <em>validate (deprecated &#8211; do not use)<br clear="none"></em></p></td><td colspan="1" rowspan="1" class="confluenceTd"><em>onValidateForm</em></td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>failure</stro
 ng></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After one or more validation errors have occurred</p></td><td colspan="1" rowspan="1" class="confluenceTd">onFailure()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.FAILURE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>success</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>When validation has completed <em>without</em> any errors (e.g. save changes to the database)</p></td><td colspan="1" rowspan="1" class="confluenceTd">onSuccess()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.SUCCESS</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>submit</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p
 >After all validation (success or failure) has finished</p></td><td colspan="1" rowspan="1" class="confluenceTd">onSubmit()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.SUBMIT</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><strong>canceled</strong></td><td colspan="1" rowspan="1" class="confluenceTd">Submit</td><td colspan="1" rowspan="1" class="confluenceTd">Whenever a <em>Submit</em> or <em>LinkSubmit</em> component containing <em>mode="cancel"</em> or <em>mode="unconditional"</em> is clicked</td><td colspan="1" rowspan="1" class="confluenceTd">onCanceled()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.CANCELED</td></tr></tbody></table></div><p>Note that the "prepare" event is emitted during both form rendering and form submission.</p><h2 id="FormsandValidation-HandlingEvents">Handling Events</h2><p>Main Article: <a  href="component-events.html">Component Events</a></p><p>You handle events by providing methods in your pag
 e or component class, either following the on<strong><em>Event</em></strong>From<strong><em>Component</em></strong>() naming convention or using the OnEvent annotation. For example:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Event Handler Using Naming Convention</b></div><div class="codeContent panelContent pdl">
+<p><em>For Tapestry 4 Users:</em> Tapestry 5 does not use the fragile "form rewind" approach from Tapestry 4. Instead, a hidden field generated during the render stores the information needed to process the form submission.</p></div>&#160;<p><br clear="none"></p><p>After the fields have done their processing, the Form emits a "validate" event. This is your chance to perform any cross-form validation that can't be described declaratively.</p><p>Next, the Form determines if there have been any validation errors. If there have been, then the submission is considered a failure, and a "failure" event is emitted. If there have been no validation errors, then a "success" event is emitted.</p><p>Finally, the Form emits a "submit" event, for logic that doesn't care about success or failure.</p><div class="table-wrap"><table class="confluenceTable"><colgroup span="1"><col span="1"><col span="1"><col span="1"><col span="1"><col span="1"></colgroup><tbody><tr><th colspan="1" rowspan="1" class="
 confluenceTh"><p>Form Event (in order)</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Phase</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>When emitted (and typical use)</p></th><th colspan="1" rowspan="1" class="confluenceTh">Method Name</th><th colspan="1" rowspan="1" class="confluenceTh">@OnEvent Constant</th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepareForRender</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before rendering the form (e.g. load an entity from a database to be edited)</p></td><td colspan="1" rowspan="1" class="confluenceTd">onPrepareForRender()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPARE_FOR_RENDER</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepare</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Render</p></td><td colspan="1" rowspan="1" 
 class="confluenceTd"><p>Before rendering the form, but after <em>prepareForRender</em></p></td><td colspan="1" rowspan="1" class="confluenceTd">onPrepare()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPARE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepareForSubmit</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed</p></td><td colspan="1" rowspan="1" class="confluenceTd">onPrepareForSubmit()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPARE_FOR_SUBMIT</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>prepare</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Before the submitted form is processed, but after <em>prepareForSubmit</em></p></td><td colspan="1" rowspan="1" class=
 "confluenceTd">onPrepare()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.PREPARE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>validate</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After fields have been populated from submitted values and validated (e.g. perform cross-field validation)</p></td><td colspan="1" rowspan="1" class="confluenceTd">onValidate</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.VALIDATE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>validateForm</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>same as <em>validate (deprecated &#8211; do not use)<br clear="none"></em></p></td><td colspan="1" rowspan="1" class="confluenceTd"><em>onValidateForm</em></td><td colspan="1" rowspan="1" class="conflue
 nceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>failure</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After one or more validation errors have occurred</p></td><td colspan="1" rowspan="1" class="confluenceTd">onFailure()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.FAILURE</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>success</strong></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>When validation has completed <em>without</em> any errors (e.g. save changes to the database)</p></td><td colspan="1" rowspan="1" class="confluenceTd">onSuccess()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.SUCCESS</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>submit</strong></p></td><td colspan="1" ro
 wspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>After all validation (success or failure) has finished</p></td><td colspan="1" rowspan="1" class="confluenceTd">onSubmit()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.SUBMIT</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><strong>canceled</strong></td><td colspan="1" rowspan="1" class="confluenceTd">Submit</td><td colspan="1" rowspan="1" class="confluenceTd">Whenever a <em>Submit</em> or <em>LinkSubmit</em> component containing <em>mode="cancel"</em> or <em>mode="unconditional"</em> is clicked</td><td colspan="1" rowspan="1" class="confluenceTd">onCanceled()</td><td colspan="1" rowspan="1" class="confluenceTd">EventConstants.CANCELED</td></tr></tbody></table></div><p>Note that the "prepare" event is emitted during both form rendering and form submission.</p><h2 id="FormsandValidation-HandlingEvents">Handling Events</h2><p>Main Article: <a  href="
 component-events.html">Component Events</a></p><p>You handle events by providing methods in your page or component class, either following the on<strong><em>Event</em></strong>From<strong><em>Component</em></strong>() naming convention or using the OnEvent annotation. For example:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Event Handler Using Naming Convention</b></div><div class="codeContent panelContent pdl">
 <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">    void onValidateFromPassword() { ...}</pre>
 </div></div><p>or the equivalent using @OnEvent:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Event Handler Using @OnEvent Annotation</b></div><div class="codeContent panelContent pdl">
 <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">    @OnEvent(value=EventConstants.VALIDATE, component="password")
@@ -217,7 +217,7 @@ public class Login {
 </div></div><p>&#160;</p><h1 id="FormsandValidation-FormValidation"><span style="color: rgb(83,145,38);">Form Validation</span></h1><p>The above example is a very basic form which allows the fields to be empty. However, with a little more effort we can add client-side validation to prevent the user from submitting the form with either field empty.</p><p>Validation in Tapestry involves associating one or more&#160;<em>validators</em> with a form element component, such as TextField or PasswordField. This is done using the <strong>validate</strong> parameter:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml; gutter: false; theme: Default" data-theme="Default">&lt;t:textfield t:id="userName" validate="required" t:mixins="formgroup"/&gt;
 &lt;t:passwordfield t:id="password" value="password" validate="required" t:mixins="formgroup"/&gt;</pre>
-</div></div><h2 id="FormsandValidation-AvailableValidators"><span style="color: rgb(83,145,38);">Available Validators</span></h2><p>Tapestry provides the following built-in validators:</p><div class="table-wrap"><table class="confluenceTable"><colgroup span="1"><col span="1"><col span="1"><col span="1"><col span="1"></colgroup><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Validator</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Constraint Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Example</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>email</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#8211;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Ensures that the given input looks like a valid e-mail address</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="userEmail" validate="ema
 il" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>max</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>long</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Enforces a maximum integer value</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="age" validate="max=120,min=0" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>maxLength</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>int</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value has a maximum length</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="zip" validate="maxlength=7" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>min</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>long</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Enforces a minimum integer value</
 p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="age" validate="max=120,min=0" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>minLength</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>int</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value has a minimum length</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="somefield" validate="minlength=1" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>none</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#8211;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Does nothing (used to override a @Validate annotation)</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="somefield" validate="none" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>regexp</p></td><td c
 olspan="1" rowspan="1" class="confluenceTd"><p>pattern</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value conforms to a given pattern</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="letterfield" validate="regexp=^</code><code>[A-Za-z]+$" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>required</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#8211;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value is not null and not the empty string</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="name" validate="required" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">checked <em>(Since 5.4.5)</em></td><td colspan="1" rowspan="1" class="confluenceTd">boolean</td><td colspan="1" rowspan="1" class="confluenceTd">Makes sure that the boolean is true (checkbox is che
 cked)</td><td colspan="1" rowspan="1" class="confluenceTd">&lt;t:Checkbox value="value" validate="checked" /&gt;</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">unchecked <em>(Since 5.4.5)</em></td><td colspan="1" rowspan="1" class="confluenceTd">boolean</td><td colspan="1" rowspan="1" class="confluenceTd"><span>Makes sure that the boolean is false (checkbox is unchecked)</span></td><td colspan="1" rowspan="1" class="confluenceTd">&lt;t:Checkbox value="value" validate="unchecked" /&gt;</td></tr></tbody></table></div><h2 id="FormsandValidation-CentralizingValidationwith@Validate">Centralizing Validation with @Validate</h2><p>The @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beaneditor/Validate.html">Validate</a> annotation can take the place of the validate parameter of TextField, PasswordField, TextArea and other components. When the validate parameter is not bound in the template file, the component will check for the
  @Validate annotation and use its value as the validation definition.</p><p>The annotation may be placed on the getter or setter method, or on the field itself.</p><p>Let's update the two fields of the Login page:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><h2 id="FormsandValidation-AvailableValidators"><span style="color: rgb(83,145,38);">Available Validators</span></h2><p>Tapestry provides the following built-in validators:</p><div class="table-wrap"><table class="confluenceTable"><colgroup span="1"><col span="1"><col span="1"><col span="1"><col span="1"></colgroup><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Validator</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Constraint Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Example</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>email</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#8211;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Ensures that the given input looks like a valid e-mail address</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="userEmail" validate="ema
 il" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>max</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>long</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Enforces a maximum integer value</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="age" validate="max=120,min=0" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>maxLength</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>int</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value has a maximum length</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="zip" validate="maxlength=7" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>min</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>long</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Enforces a minimum integer value</
 p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="age" validate="max=120,min=0" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>minLength</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>int</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value has a minimum length</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="somefield" validate="minlength=1" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>none</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#8211;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Does nothing (used to override a @Validate annotation)</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="somefield" validate="none" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>regexp</p></td><td c
 olspan="1" rowspan="1" class="confluenceTd"><p>pattern</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value conforms to a given pattern</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="letterfield" validate="regexp=^</code><code>[A-Za-z]+$" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>required</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#8211;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes sure that a string value is not null and not the empty string</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>&lt;t:textfield value="name" validate="required" /&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">checked <em>(Since 5.4.5)</em></td><td colspan="1" rowspan="1" class="confluenceTd">boolean</td><td colspan="1" rowspan="1" class="confluenceTd">Makes sure that the boolean is true (checkbox is che
 cked)</td><td colspan="1" rowspan="1" class="confluenceTd"><code>&lt;t:Checkbox value="value" validate="checked" /&gt;</code></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">unchecked <em>(Since 5.4.5)</em></td><td colspan="1" rowspan="1" class="confluenceTd">boolean</td><td colspan="1" rowspan="1" class="confluenceTd"><span>Makes sure that the boolean is false (checkbox is unchecked)</span></td><td colspan="1" rowspan="1" class="confluenceTd"><code>&lt;t:Checkbox value="value" validate="unchecked" /&gt;</code></td></tr></tbody></table></div><h2 id="FormsandValidation-CentralizingValidationwith@Validate">Centralizing Validation with @Validate</h2><p>The @<a  class="external-link" href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/beaneditor/Validate.html">Validate</a> annotation can take the place of the validate parameter of TextField, PasswordField, TextArea and other components. When the validate parameter is not bound in the template file, the co
 mponent will check for the @Validate annotation and use its value as the validation definition.</p><p>The annotation may be placed on the getter or setter method, or on the field itself.</p><p>Let's update the two fields of the Login page:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java; gutter: false; theme: Default" data-theme="Default">  @Persist
   @Property
   @Validate("required")