|
Dynamic options
It's much more interesting--seen from a programmer's point of
view--when the selectable options are computed in the
application, for example read from a database. Struts has
solutions for all the remaining controls--marked 4, 5, 6, and 7
above--but unfortunately they're rather different. One thing is,
however, common for some of them: they use the
logic:iterate tag to loop over the set of
selectable options. So let's take a quick recap of how to use
the iterate tag. A simple example:
<table border=1>
<logic:iterate id="customer" name="customers">
<tr>
<td><bean:write name="customer" property="firstName"/></td>
<td><bean:write name="customer" property="lastName"/></td>
<td><bean:write name="customer" property="address"/></td>
</tr>
</logic:iterate>
</table>
The iterate tag's name-attribute
refers to a Collection of beans stored in request
or session scope. The id-attribute gives the
(logical) name of the bean created in each iteration. Other
tags--for example the bean:write tag--may then
refer to this bean with their name-attribute. The
property-attribute finally selects the wanted
property from the bean.
You might now think that you simply use the name-
and property-attributes with the
html-tags, but it's not that simple. The
html-tags already use the property-
attribute for the name of the property in the
ActionForm, so there's a conflict here.
The tag inventors have had other challenges as well, so
therefore the syntax for the HTML-tags when
handling sets of options are a bit heterogeneous.
The Radio Button
Now I'll present a solution, and afterwards discuss the
explanations. First the struts-config file, where we define a
dynamic form bean (but you could just as well use the old
ActionForm bean):
<form-bean name="radioForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="control" type="java.lang.String"/>
</form-bean>
Then the jsp-code:
<logic:iterate id="choice" name="choices">
<html:radio property="control" idName="choice" value="value"/>
<bean:write name="choice" property="label"/>
<br>
</logic:iterate>
We're using a Collection of beans with properties
value and label. When the
idName attribute is used the radio-tag's
value-attribute denotes a property in the bean
given by idName. It's the id-attribute
in the iterate-tag and the idName in
the radio-tag that links the tags together.
Struts has a utility bean class called
LabelValueBean with exactly these properties:
value and label, and it may be used to
construct a "minimal" bean to put in a
Collection, for example:
import org.apache.struts.util.LabelValueBean;
. . .
Collection choices = new ArrayList();
choices.add(new LabelValueBean("American Express", "AE"));
choices.add(new LabelValueBean("MasterCard", "MC"));
choices.add(new LabelValueBean("Diners", "DN"));
request.setAttribute("choices", choices);
You don't have to use this utility class, any bean will do, as
long as it has properties that can be used for the
value attribute in the html:radio tag
and the property attribute in the
bean:write tag.
You may set or get the current value of the radio buttons in the
execute method, as described earlier. The name
we've used for the radio buttons, control, will
also be used in the following examples.
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|