ActionForms in Strecks fundamentally no different from regular Struts ActionForms
,
with two major differences. First, annotations can be used to define validators for
fields as well as to perform data binding from form properties to domain objects.
Second, Strecks applications will tend to use fewer ActionForms
than plain Struts applications.
This is because the @RequestParameter
annotation provides a mechanism to
capture and type convert request parameters, a feature missing from plain Struts.
This means that ActionForms
are only really required for handling input in situations where
validation is required. In other words, ActionForms
are only really necessary for handling
HTML form input.
As in plain Struts, Strecks ActionForm
properties tend to be Strings,
especially for single value fields. Data binding
and type conversion occurs within the form itself, that is, from the form property
to a typed property of a domain object nested within the form.
An example of a Strecks action form is shown below:
public class ExampleActionForm extends ActionForm { private static final long serialVersionUID = 7423616982362263002L; private String numberField; private DomainObject domainObject; /* ************** form property getters and setters ************* */ @BindSimple(expression = "domainObject.domainInteger") public String getNumberField() { return numberField; } @ValidateRequired(key = "number.required") @ValidateInteger(key = "field.must.be.number") public void setNumberField(String numberField) { this.numberField = numberField; } /* ************** domain getters and setters ************* */ public DomainObject getDomainObject() { return domainObject; } public void setDomainObject(DomainObject domainObject) { this.domainObject = domainObject; } }
The form has getters and setters both for form properties and domain model objects.
In the above example, there is just one form property, numberField. Using the @BindSimple
annotation, it is type converted and bound to an Integer
property (named domainInteger
)
of the class DomainObject
.
Data binding and type conversion annotations
are applied to form property setter methods.
Validators can also be applied to form properties, this time using
setter method validation annotations.
Note that the ActionForm
's validate() method will still be called, allowing
for programmatic validation to handle scenarios that the annotations cannot cover.
The current behaviour of Strecks is to call the annotation-based validations first,
then call ActionForm.validate()
, merging any ActionMessages
returned into a single ActionErrors
object.
In future versions, it is likely that this behaviour will be
customisable on a per-form basis.