What we are going to do here is not a robust and universal example of user input validation. However, the benefit of this approach is its extreme simplicity. You can always take it as a starting point and go further, but as for me, the approach is good enough to use it as it is.
Let's say we want the date accepted by the component to be no earlier than a certain limit. Let's add the appropriate parameter to the component's class:
@Parameter private Date dateFrom;
We can add this parameter in the component's declaration in the page template:
<t:dateinput t:date="theDate" t:id="testDate"
t:dateFrom="lowerLimit"/>
We shall also provide a value for this parameter in the page class, like this:
public Date getLowerLimit() { return new Date(); }
We are going to check if the date submitted by the user is no earlier than the current date, and if there is a problem, we are going to ask Tapestry to take appropriate measures. For this, we need to inject a ValidationTracker...