Author: buildbot
Date: Sat Apr  2 22:19:51 2016
New Revision: 984555

Log:
Production update by buildbot for tapestry

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

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 Sat Apr  2 
22:19:51 2016
@@ -109,17 +109,17 @@
                     </div>
     </li></ul>
 </div><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.rbtoc1447035649017 {padding: 0px;}
-div.rbtoc1447035649017 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1447035649017 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1459635580406 {padding: 0px;}
+div.rbtoc1459635580406 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1459635580406 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1447035649017">
+/*]]>*/</style></p><div class="toc-macro rbtoc1459635580406">
 <ul class="toc-indentation"><li>Related Articles</li></ul>
 <ul><li><a  href="#FormsandValidation-TheFormComponent">The Form 
Component</a></li><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><li><a  
href="#FormsandValidation-CentralizingValidationwith@Validate">Centralizing 
Validation with @Validate</a></li><li><a  
href="#FormsandValidation-ServerSideValidation">Server Side 
Validation</a></li><li><a  
href="#FormsandValidation-CustomizingValidationMessages">Customizing Validation 
Messages</a>
 <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>
 </div><h2 id="FormsandValidation-TheFormComponent">The Form 
Component</h2><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 methods 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>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>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" c
 lass="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 cols
 pan="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</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" 
rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>After all validation (s
 uccess 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></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">
+<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>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>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" c
 lass="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 cols
 pan="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</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" 
rowspan="1" class="confluenceTd"><p>Submit</p></td><td colspan="1" rowspan="1" 
class="confluenceTd"><p>After all validation (s
 uccess 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, ei
 ther 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="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">    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="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">    @OnEvent(value=EventConstants.VALIDATE, 
component="password")
@@ -198,7 +198,10 @@ public class Login {
   &lt;label for="userName" class="control-label"&gt;User Name&lt;/label&gt;
   &lt;input id="userName" class="form-control" name="userName" type="text"&gt;
 &lt;/div&gt;</pre>
-</div></div><p>&#160;</p><p><span style="color: rgb(83,145,38);font-size: 
24.0px;line-height: 1.25;">Form Validation</span></p><p>So, this is a basic 
(very basic!) form and you can leave the fields blank and submit the form. With 
very little effort we can add client-side validation, to prevent the user from 
submitting the form with either field left blank.</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 can be done using the 
validate parameter of the component itself.</p><p><span style="color: 
rgb(83,145,38);font-size: 20.0px;line-height: 1.5;">Available 
Validators</span></p><p>Tapestry provides the following built-in 
validators:</p><div class="table-wrap"><table 
class="confluenceTable"><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="email" validate="email" 
/&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 colspan="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="co
 nfluenceTd"><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></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, 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>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><p>&#160;</p><p><span style="color: rgb(83,145,38);font-size: 
24.0px;line-height: 1.25;">Form Validation</span></p><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="brush: xml; gutter: false; theme: Default" 
style="font-size:12px;">&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><p>&#160;</p><p><span style="color: rgb(83,145,38);font-size: 
20.0px;line-height: 1.5;">Available Validators</span></p><p>Tapestry provides 
the following built-in validators:</p><div class="table-wrap"><table 
class="confluenceTable"><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="email" validate="email" 
/&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd"><p>ma
 x</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 colspan="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></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 TextFie
 ld, 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">
 <pre class="brush: java; gutter: false; theme: Default" 
style="font-size:12px;">  @Persist
   @Property
   @Validate("required")
@@ -207,7 +210,7 @@ public class Login {
   @Property
   @Validate("required")
  private String password;</pre>
-</div></div><p>Now, rebuild the app, refresh the browser, and just hit 
enter:</p><p><span class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" width="500" 
src="forms-and-validation.data/newapp_com_example.png"></span></p><p>The form 
has updated, in place, to present the errors. You will not be able to submit 
the form until some value is provided for each field.</p><h2 
id="FormsandValidation-ServerSideValidation">Server Side Validation</h2><p>Some 
validation can't, or shouldn't, be done on the client side. How do we know if 
the password is correct? Short of downloading all users and passwords to the 
client, we really need to do the validation on the server.</p><p>In fact, all 
client-side validation (via the validate parameter, or&#160;@Validate 
annotation) is performed again on the server.</p><p>It is also possible to 
perform extra validation there.</p><div cla
 ss="code panel pdl" style="border-width: 1px;"><div class="codeContent 
panelContent pdl">
+</div></div><p>Now, we'll rebuild the app, refresh the browser, and just hit 
enter:</p><p><span class="confluence-embedded-file-wrapper image-center-wrapper 
confluence-embedded-manual-size"><img class="confluence-embedded-image 
confluence-content-image-border image-center" width="500" 
src="forms-and-validation.data/newapp_com_example.png"></span></p><p>The form 
has updated, in place, to present the errors. You will not be able to submit 
the form until some value is provided for each field.</p><h2 
id="FormsandValidation-ServerSideValidation">Server Side Validation</h2><p>Some 
validation can't, or shouldn't, be done on the client side. How do we know if 
the password is correct? Short of downloading all users and passwords to the 
client, we really need to do the validation on the server.</p><p>In fact, all 
client-side validation (via the validate parameter, or&#160;@Validate 
annotation) is performed again on the server.</p><p>It is also possible to 
perform extra validation there.</p><d
 iv 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;">  /**
      * Do the cross-field validation
      */


Reply via email to