Struts
Lazy ActionForm which
wraps a
LazyDynaBean.
There isn't really that much to this implementation as most of the
lazy behaviour is in
LazyDynaBean and
wrapping the
LazyDynaBean is handled in the parent
BeanValidatorForm. The only thing it really does is populate
indexed properties
which are a
List type with a LazyDynaBean in the get(name, index)
method.
Lazy DynaBeans provide several types of
lazy behaviour:
- lazy property addition - properties which do not exist
are automatically added.
- lazy List facilities - automatically grows a
List or
Array to accomodate the index value being set. - lazy List creation - automatic creation of a
List
or Array for indexed properties, if it doesn't exist. - lazy Map creation - automatic creation of a
Map
for mapped properties, if it doesn't exist.
Using this
lazy ActionForm means that you don't have to define the ActionForm's
properties in the
struts-config.xml. However, a word of warning, everything in the
Request gets populated into this
ActionForm circumventing the normal
firewall
function of Struts forms. Therefore you should only
take out of this form properties you expect
to be there rather than blindly populating all the properties into the business tier.
Having said that it is not necessary to pre-define properties in the
struts-config.xml, it is
useful to sometimes do so for
mapped or
indexed properties. For example, if you want to use
a different
Map implementation from the default HashMap or an array for indexed
properties, rather than the default
List type:
<form-bean name="myForm" type="org.apache.struts.validator.LazyValidatorForm">
<form-property name="myMap" type="java.util.TreeMap" />
<form-property name="myBeans" type="org.apache.commons.beanutils.LazyDynaBean[]" />
</form-bean>
Another reason for defining
indexed properties in the
struts-config.xml is that
if you are validating indexed properties using the Validator and none are submitted then the indexed
property will be
null which causes validator to fail. Pre-defining them in the
struts-config.xml will result in a zero-length indexed property (array or List) being
instantiated, avoiding an issue with validator in that circumstance.
This implementation validates using the ActionForm
name. If you require a version that
validates according to the
path then it can be easily created in the following manner:
public class MyLazyForm extends LazyValidatorForm {
public MyLazyForm () {
super();
setPathValidation(true);
}
}
Rather than using this class, another alternative is to either use a
LazyDynaBean or
custom version of
LazyDynaBean directly. Struts now automatically
wraps objects
which are not
ActionForms in a
BeanValidatorForm. For example:
<form-bean name="myForm" type="org.apache.commons.beanutils.LazyDynaBean">
<form-property name="myBeans" type="org.apache.commons.beanutils.LazyDynaBean[]" />
</form-bean>