Arron,

I modified the <html:select> test in struts-exercise-taglib to include a
simple example of how this tag is used, and I modified the TestBean class
for that test as well. I also checked in the docs for the tag, so you'll see
them if you build struts-documentation. If you need more than that, just let
me know exactly what you need.

--
Martin Cooper


----- Original Message -----
From: "Arron Bates" <[EMAIL PROTECTED]>
To: "Struts Developers List" <[EMAIL PROTECTED]>
Sent: Saturday, February 23, 2002 12:50 AM
Subject: Re: cvs commit: jakarta-struts/web/exercise-taglib html-select.jsp


> Martin,
>
> Can I get a simple example bean and markup of its various options, so I
> can see how I have to get it nested?...
>
> Ta.
>
> Arron.
>
> [EMAIL PROTECTED] wrote:
>
> >martinc     02/02/22 23:10:30
> >
> >  Modified:    doc/userGuide struts-html.xml
> >               src/exercise-taglib/org/apache/struts/webapp/exercise
> >                        TestBean.java
> >               src/share/org/apache/struts/taglib/html
> >                        LocalStrings.properties
> >               web/exercise-taglib html-select.jsp
> >  Added:       src/share/org/apache/struts/taglib/html
> >                        OptionsCollectionTag.java
> >  Log:
> >  Add new <html:optionsCollection> tag, as discussed last November.
> >
> >  I don't particularly like the tag name, but I couldn't think of
anything
> >  better.
> >
> >  Revision  Changes    Path
> >  1.2       +421 -1    jakarta-struts/doc/userGuide/struts-html.xml
> >
> >  Index: struts-html.xml
> >  ===================================================================
> >  RCS file: /home/cvs/jakarta-struts/doc/userGuide/struts-html.xml,v
> >  retrieving revision 1.1
> >  retrieving revision 1.2
> >  diff -u -r1.1 -r1.2
> >  --- struts-html.xml 20 Feb 2002 00:41:14 -0000 1.1
> >  +++ struts-html.xml 23 Feb 2002 07:10:30 -0000 1.2
> >  @@ -3430,7 +3430,7 @@
> >                   element.  This tag can be used multiple times within a
single
> >                   <code>&lt;html:select&gt;</code> element, either in
conjunction
> >                   with or instead of one or more
<code>&lt;html:option&gt;</code>
> >  -                elements.</p>
> >  +                or <code>&lt;html:optionsCollection&gt;</code>
elements.</p>
> >
> >                   <p>This tag operates in one of two major modes,
depending on
> >                   whether or not the <code>collection</code> attribute
is
> >  @@ -3570,6 +3570,426 @@
> >               <rtexprvalue>true</rtexprvalue>
> >               <info>
> >                   CSS stylesheet class to be applied to this HTML
element.
> >  +            </info>
> >  +        </attribute>
> >  +    </tag>
> >  +
> >  +    <tag>
> >  +
> >  +        <name>optionsCollection</name>
> >  +        <summary>
> >  +            Render a Collection of Select Options
> >  +        </summary>
> >  +
<tagclass>org.apache.struts.taglib.html.OptionsCollectionTag</tagclass>
> >  +        <bodycontent>empty</bodycontent>
> >  +        <info>
> >  +            <p>Renders a set of HTML <code>&lt;option&gt;</code>
elements,
> >  +            representing possible choices for a
<code>&lt;select&gt;</code>
> >  +            element.  This tag can be used multiple times within a
single
> >  +            <code>&lt;html:select&gt;</code> element, either in
conjunction
> >  +            with or instead of one or more
<code>&lt;html:option&gt;</code>
> >  +            or <code>&lt;html:options&gt;</code> elements.</p>
> >  +
> >  +            <p>This tag operates on a collection of beans, where each
bean
> >  +            has a <strong>label</strong> property and a
<strong>value</strong>
> >  +            property. The actual names of these properties can be
configured
> >  +            using the <code>label</code> and <code>value</code>
attributes
> >  +            of this tag.</p>
> >  +
> >  +            <p>This tag differs from the
<code>&lt;html:options&gt;</code> tag
> >  +            in that it makes more consistent use of the
<code>name</code> and
> >  +            <code>property</code> attributes, and allows the
collection to be
> >  +            more easily obtained from the enclosing form bean.</p>
> >  +        </info>
> >  +
> >  +        <attribute>
> >  +            <name>label</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                The property of the bean within the collection which
represents
> >  +                the label to be rendered for each option. Defaults to
"label".
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>name</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                The attribute name of the bean whose properties are
consulted
> >  +                when rendering the current value of this input field.
If not
> >  +                specified, the bean associated with the form tag we
are nested
> >  +                within is utilized.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>property</name>
> >  +            <required>true</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                The property of the form bean, or the bean specified
by the name
> >  +                attribute, that will return the collection of objects
to be
> >  +                rendered for these options.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>style</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                CSS styles to be applied to this HTML element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>styleClass</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                CSS stylesheet class to be applied to this HTML
element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>value</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                The property of the bean within the collection which
represents
> >  +                the value to be rendered for each option. Defaults to
"value".
> >  +            </info>
> >  +        </attribute>
> >  +    </tag>
> >  +
> >  +    <tag>
> >  +
> >  +        <name>password</name>
> >  +        <summary>
> >  +            Render A Password Input Field
> >  +        </summary>
> >  +        <tagclass>org.apache.struts.taglib.html.PasswordTag</tagclass>
> >  +        <info>
> >  +            Renders an HTML &lt;input&gt; element of type password,
populated
> >  +            from the specified value or the specified property of the
bean
> >  +            associated with our current form. This tag is only valid
when
> >  +            nested inside a form tag body.
> >  +        </info>
> >  +
> >  +        <attribute>
> >  +            <name>accesskey</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                The keyboard character used to move focus immediately
to this
> >  +                element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +                <name>alt</name>
> >  +                <required>false</required>
> >  +                <rtexprvalue>true</rtexprvalue>
> >  +                <info>
> >  +                <p>The alternate text for this element.</p>
> >  +                </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +                <name>altKey</name>
> >  +                <required>false</required>
> >  +                <rtexprvalue>true</rtexprvalue>
> >  +                <info>
> >  +                <p>The message resources key of the alternate text for
this
> >  +                element.</p>
> >  +                </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +          <name>disabled</name>
> >  +          <required>false</required>
> >  +          <rtexprvalue>true</rtexprvalue>
> >  +          <info>
> >  +          Set to <code>true</code> if this input field should be
> >  +          disabled.
> >  +          </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>indexed</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                Valid only inside of logic:iterate tag.
> >  +                If yes then name of the html tag will be rendered as
> >  +                "id[34].propertyName". Number in brackets will be
generated
> >  +                for every iteration and taken from ancestor
logic:iterate tag.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>maxlength</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                Maximum number of input characters to accept. [No
limit]
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>name</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                The attribute name of the bean whose properties are
consulted when
> >  +                rendering the current value of this input field. If
not specified,
> >  +                the bean associated with the form tag we are nested
within is utilized.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onblur</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
loses input
> >  +                focus.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onchange</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
loses input
> >  +                focus and its value has changed.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onclick</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
receives a
> >  +                mouse click.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +
> >  +        <attribute>
> >  +            <name>ondblclick</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
receives a
> >  +                mouse double click.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onfocus</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
receives input
> >  +                focus.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +
> >  +        <attribute>
> >  +            <name>onkeydown</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
has focus and a
> >  +                key is depressed.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onkeypress</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
has focus and a
> >  +                key is depressed and released.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onkeyup</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
has focus and a
> >  +                key is released.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onmousedown</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element is
under the mouse
> >  +                pointer and a mouse button is depressed.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onmousemove</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element is
under the
> >  +                mouse pointer and the pointer is moved.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onmouseout</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
was under the
> >  +                mouse pointer but the pointer was moved outside the
element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onmouseover</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element
was not under
> >  +                the mouse pointer but the pointer is moved inside the
element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>onmouseup</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                JavaScript event handler executed when this element is
under the
> >  +                mouse pointer and a mouse button is released.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>property</name>
> >  +            <required>true</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                Name of the request parameter that will be included
with this
> >  +                submission, set to the specified value.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +          <name>readonly</name>
> >  +          <required>false</required>
> >  +          <rtexprvalue>true</rtexprvalue>
> >  +          <info>
> >  +          Set to <code>true</code> if this input field should be
> >  +          read only.
> >  +          </info>
> >  +        </attribute>
> >  +
> >  +                <attribute>
> >  +                        <name>redisplay</name>
> >  +                        <required>false</required>
> >  +                        <rtexprvalue>true</rtexprvalue>
> >  +                        <info>
> >  +                        Boolean flag indicating whether or not
existing values
> >  +                        will be redisplayed if they exist.  Even
though the
> >  +                        redisplayed value will be shown as asterisks
on the
> >  +                        visible HTML page, the cleartext of the actual
password
> >  +                        value will be visible though the "Show Page
Source"
> >  +                        menu option of the client browser.  You may
wish to
> >  +                        set this value to <code>false</code> on login
pages.
> >  +                        Defaults to <code>true</code> for consistency
with
> >  +                        all other form tags that redisplay their
contents.
> >  +                        </info>
> >  +                </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>style</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                CSS styles to be applied to this HTML element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>styleClass</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                CSS stylesheet class to be applied to this HTML
element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>styleId</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                Identifier to be assigned to this HTML element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>size</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                Number of character positions to allocate. [Browser
default]
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>tabindex</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                The tab order (ascending positive integers) for this
element.
> >  +            </info>
> >  +        </attribute>
> >  +
> >  +                <attribute>
> >  +                  <name>title</name>
> >  +                  <required>false</required>
> >  +                  <rtexprvalue>true</rtexprvalue>
> >  +                  <info>
> >  +                  <p>The advisory title for this element.</p>
> >  +                  </info>
> >  +                </attribute>
> >  +
> >  +                <attribute>
> >  +                  <name>titleKey</name>
> >  +                  <required>false</required>
> >  +                  <rtexprvalue>true</rtexprvalue>
> >  +                  <info>
> >  +                  <p>The message resources key for the advisory title
> >  +                  for this element.</p>
> >  +                  </info>
> >  +                </attribute>
> >  +
> >  +        <attribute>
> >  +            <name>value</name>
> >  +            <required>false</required>
> >  +            <rtexprvalue>true</rtexprvalue>
> >  +            <info>
> >  +                Value of the label to be placed on this button. This
value will
> >  +                also be submitted as the value of the specified
request parameter.
> >  +                [Body of this tag (if any), or "Cancel"]
> >               </info>
> >           </attribute>
> >       </tag>
> >
> >
> >
> >  1.5       +55 -4
jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exercise/TestBea
n.java
> >
> >  Index: TestBean.java
> >  ===================================================================
> >  RCS file:
/home/cvs/jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exerci
se/TestBean.java,v
> >  retrieving revision 1.4
> >  retrieving revision 1.5
> >  diff -u -r1.4 -r1.5
> >  --- TestBean.java 15 Oct 2001 05:50:10 -0000 1.4
> >  +++ TestBean.java 23 Feb 2002 07:10:30 -0000 1.5
> >  @@ -1,7 +1,7 @@
> >   /*
> >  - * $Header:
/home/cvs/jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exerci
se/TestBean.java,v 1.4 2001/10/15 05:50:10 martinc Exp $
> >  - * $Revision: 1.4 $
> >  - * $Date: 2001/10/15 05:50:10 $
> >  + * $Header:
/home/cvs/jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exerci
se/TestBean.java,v 1.5 2002/02/23 07:10:30 martinc Exp $
> >  + * $Revision: 1.5 $
> >  + * $Date: 2002/02/23 07:10:30 $
> >    *
> >    *
====================================================================
> >    *
> >  @@ -63,22 +63,73 @@
> >   package org.apache.struts.webapp.exercise;
> >
> >
> >  +import java.util.Collection;
> >  +import java.util.Vector;
> >   import javax.servlet.http.HttpServletRequest;
> >   import org.apache.struts.action.ActionForm;
> >   import org.apache.struts.action.ActionMapping;
> >  +import org.apache.struts.util.LabelValueBean;
> >
> >
> >   /**
> >    * General purpose test bean for Struts custom tag tests.
> >    *
> >    * @author Craig R. McClanahan
> >  - * @version $Revision: 1.4 $ $Date: 2001/10/15 05:50:10 $
> >  + * @author Martin F N Cooper
> >  + * @version $Revision: 1.5 $ $Date: 2002/02/23 07:10:30 $
> >    */
> >
> >   public class TestBean extends ActionForm {
> >
> >
> >       // -------------------------------------------------------------
Properties
> >  +
> >  +
> >  +    /**
> >  +     * A collection property where the elements of the collection are
> >  +     * of type <code>LabelValueBean</code>.
> >  +     */
> >  +    private Collection beanCollection = null;
> >  +
> >  +    public Collection getBeanCollection() {
> >  +        if (beanCollection == null) {
> >  +            Vector entries = new Vector(10);
> >  +
> >  +            entries.add(new LabelValueBean("Label 0", "Value 0"));
> >  +            entries.add(new LabelValueBean("Label 1", "Value 1"));
> >  +            entries.add(new LabelValueBean("Label 2", "Value 2"));
> >  +            entries.add(new LabelValueBean("Label 3", "Value 3"));
> >  +            entries.add(new LabelValueBean("Label 4", "Value 4"));
> >  +            entries.add(new LabelValueBean("Label 5", "Value 5"));
> >  +            entries.add(new LabelValueBean("Label 6", "Value 6"));
> >  +            entries.add(new LabelValueBean("Label 7", "Value 7"));
> >  +            entries.add(new LabelValueBean("Label 8", "Value 8"));
> >  +            entries.add(new LabelValueBean("Label 9", "Value 9"));
> >  +
> >  +            beanCollection = entries;
> >  +        }
> >  +
> >  +        return (beanCollection);
> >  +    }
> >  +
> >  +    public void setBeanCollection(Collection beanCollection) {
> >  +        this.beanCollection = beanCollection;
> >  +    }
> >  +
> >  +
> >  +    /**
> >  +     * A multiple-String SELECT element using a bean collection.
> >  +     */
> >  +    private String[] beanCollectionSelect = { "Value 1", "Value 3",
> >  +                                              "Value 5" };
> >  +
> >  +    public String[] getBeanCollectionSelect() {
> >  +        return (this.beanCollectionSelect);
> >  +    }
> >  +
> >  +    public void setBeanCollectionSelect(String beanCollectionSelect[])
{
> >  +        this.beanCollectionSelect = beanCollectionSelect;
> >  +    }
> >
> >
> >       /**
> >
> >
> >
> >  1.14      +5 -2
jakarta-struts/src/share/org/apache/struts/taglib/html/LocalStrings.properti
es
> >
> >  Index: LocalStrings.properties
> >  ===================================================================
> >  RCS file:
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LocalString
s.properties,v
> >  retrieving revision 1.13
> >  retrieving revision 1.14
> >  diff -u -r1.13 -r1.14
> >  --- LocalStrings.properties 13 Jan 2002 03:38:38 -0000 1.13
> >  +++ LocalStrings.properties 23 Feb 2002 07:10:30 -0000 1.14
> >  @@ -22,6 +22,7 @@
> >   imgTag.type=Object must be of type Map
> >   includeTag.include=Error including page {0}: {1}
> >   includeTag.lookup=Cannot find global forward named {0}
> >  +indexed.noEnclosingIterate=indexed=\"true\" is only valid within an
enclosing iterate tag
> >   iterateTag.iterator=Cannot create iterator for {0}
> >   linkTag.destination=You must specify exactly one of 'forward', 'href',
or 'page'
> >   linkTag.forward=Cannot locate global forwarding for {0}
> >  @@ -32,9 +33,11 @@
> >   messageTag.message=Missing message for key {0}
> >   messageTag.resources=Missing resources attribute {0}
> >   multiboxTag.value=You must specify the value attribute or nested tag
content
> >  -optionTag.select=Option tag must be nested in a Select tag
> >  +optionsCollectionTag.collection=Failed to obtain specified collection
> >  +optionsCollectionTag.iterator=Cannot create iterator for {0}
> >  +optionsCollectionTag.select=OptionsCollection tag must be nested in a
Select tag
> >   optionsTag.enumeration=Cannot create enumeration for {0}
> >   optionsTag.iterator=Cannot create iterator for {0}
> >   optionsTag.select=Options tag must be nested in a Select tag
> >  +optionTag.select=Option tag must be nested in a Select tag
> >   rewrite.url=Cannot create rewrite URL: {0}
> >  -indexed.noEnclosingIterate=indexed=\"true\" is only valid within an
enclosing iterate tag
> >
> >
> >
> >  1.1
jakarta-struts/src/share/org/apache/struts/taglib/html/OptionsCollectionTag.
java
> >
> >  Index: OptionsCollectionTag.java
> >  ===================================================================
> >  /*
> >   * ====================================================================
> >   *
> >   * The Apache Software License, Version 1.1
> >   *
> >   * Copyright (c) 2002 The Apache Software Foundation.  All rights
> >   * reserved.
> >   *
> >   * Redistribution and use in source and binary forms, with or without
> >   * modification, are permitted provided that the following conditions
> >   * are met:
> >   *
> >   * 1. Redistributions of source code must retain the above copyright
> >   *    notice, this list of conditions and the following disclaimer.
> >   *
> >   * 2. Redistributions in binary form must reproduce the above copyright
> >   *    notice, this list of conditions and the following disclaimer in
> >   *    the documentation and/or other materials provided with the
> >   *    distribution.
> >   *
> >   * 3. The end-user documentation included with the redistribution, if
> >   *    any, must include the following acknowlegement:
> >   *       "This product includes software developed by the
> >   *        Apache Software Foundation (http://www.apache.org/)."
> >   *    Alternately, this acknowlegement may appear in the software
itself,
> >   *    if and wherever such third-party acknowlegements normally appear.
> >   *
> >   * 4. The names "The Jakarta Project", "Struts", and "Apache Software
> >   *    Foundation" must not be used to endorse or promote products
derived
> >   *    from this software without prior written permission. For written
> >   *    permission, please contact [EMAIL PROTECTED]
> >   *
> >   * 5. Products derived from this software may not be called "Apache"
> >   *    nor may "Apache" appear in their names without prior written
> >   *    permission of the Apache Group.
> >   *
> >   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
> >   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> >   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> >   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
> >   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> >   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> >   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> >   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> >   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> >   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> >   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> >   * SUCH DAMAGE.
> >   * ====================================================================
> >   *
> >   * This software consists of voluntary contributions made by many
> >   * individuals on behalf of the Apache Software Foundation.  For more
> >   * information on the Apache Software Foundation, please see
> >   * <http://www.apache.org/>.
> >   *
> >   */
> >
> >  package org.apache.struts.taglib.html;
> >
> >  import java.io.IOException;
> >  import java.lang.reflect.InvocationTargetException;
> >  import java.util.Arrays;
> >  import java.util.Collection;
> >  import java.util.Enumeration;
> >  import java.util.Iterator;
> >  import java.util.Map;
> >  import javax.servlet.jsp.JspException;
> >  import javax.servlet.jsp.JspWriter;
> >  import javax.servlet.jsp.PageContext;
> >  import javax.servlet.jsp.tagext.TagSupport;
> >  import org.apache.commons.beanutils.PropertyUtils;
> >  import org.apache.struts.util.IteratorAdapter;
> >  import org.apache.struts.util.MessageResources;
> >  import org.apache.struts.util.RequestUtils;
> >  import org.apache.struts.util.ResponseUtils;
> >
> >
> >  /**
> >   * Tag for creating multiple &lt;select&gt; options from a collection.
The
> >   * collection may be part of the enclosing form, or may be independent
of
> >   * the form. Each element of the collection must expose a 'label' and a
> >   * 'value', the property names of which are configurable by attributes
of
> >   * this tag.
> >   * <p>
> >   * The collection may be an array of objects, a Collection, an
Enumeration,
> >   * an Iterator, or a Map.
> >   * <p>
> >   * <b>NOTE</b> - This tag requires a Java2 (JDK 1.2 or later) platform.
> >   *
> >   * @author Martin Cooper
> >   * @version $Revision: 1.1 $ $Date: 2002/02/23 07:10:30 $
> >   */
> >
> >  public class OptionsCollectionTag extends TagSupport {
> >
> >
> >      // ----------------------------------------------------- Instance
Variables
> >
> >
> >      /**
> >       * The message resources for this package.
> >       */
> >      protected static MessageResources messages =
> >              MessageResources.getMessageResources(
> >                  Constants.Package + ".LocalStrings");
> >
> >
> >      // -------------------------------------------------------------
Properties
> >
> >
> >      /**
> >       * The name of the bean property containing the label.
> >       */
> >      protected String label = "label";
> >
> >      public String getLabel() {
> >          return label;
> >      }
> >
> >      public void setLabel(String label) {
> >          this.label = label;
> >      }
> >
> >
> >      /**
> >       * The name of the bean containing the values collection.
> >       */
> >      protected String name = Constants.BEAN_KEY;
> >
> >      public String getName() {
> >          return name;
> >      }
> >
> >      public void setName(String name) {
> >          this.name = name;
> >      }
> >
> >
> >      /**
> >       * The name of the property to use to build the values collection.
> >       */
> >      protected String property = null;
> >
> >      public String getProperty() {
> >          return property;
> >      }
> >
> >      public void setProperty(String property) {
> >          this.property = property;
> >      }
> >
> >
> >      /**
> >       * The style associated with this tag.
> >       */
> >      private String style = null;
> >
> >      public String getStyle() {
> >          return style;
> >      }
> >
> >      public void setStyle(String style) {
> >          this.style = style;
> >      }
> >
> >
> >      /**
> >       * The named style class associated with this tag.
> >       */
> >      private String styleClass = null;
> >
> >      public String getStyleClass() {
> >          return styleClass;
> >      }
> >
> >      public void setStyleClass(String styleClass) {
> >          this.styleClass = styleClass;
> >      }
> >
> >
> >      /**
> >       * The name of the bean property containing the value.
> >       */
> >      protected String value = "value";
> >
> >      public String getValue() {
> >          return value;
> >      }
> >
> >      public void setValue(String value) {
> >          this.value = value;
> >      }
> >
> >
> >      // --------------------------------------------------------- Public
Methods
> >
> >
> >      /**
> >       * Process the start of this tag.
> >       *
> >       * @exception JspException if a JSP exception has occurred
> >       */
> >      public int doStartTag() throws JspException {
> >
> >          // Acquire the select tag we are associated with
> >          SelectTag selectTag =
> >
(SelectTag)pageContext.getAttribute(Constants.SELECT_KEY);
> >
> >          if (selectTag == null) {
> >              JspException e = new JspException(
> >
messages.getMessage("optionsCollectionTag.select"));
> >              RequestUtils.saveException(pageContext, e);
> >              throw e;
> >          }
> >
> >          // Acquire the collection containing our options
> >          Object collection = RequestUtils.lookup(pageContext,
> >                  name, property, null);
> >
> >          if (collection == null) {
> >              JspException e = new JspException(
> >
messages.getMessage("optionsCollectionTag.collection"));
> >              RequestUtils.saveException(pageContext, e);
> >              throw e;
> >          }
> >
> >          // Acquire an iterator over the options collection
> >          Iterator iter = getIterator(collection);
> >
> >          StringBuffer sb = new StringBuffer();
> >
> >          // Render the options
> >          while (iter.hasNext()) {
> >
> >              Object bean = iter.next();
> >              Object beanLabel = null;;
> >              Object beanValue = null;
> >
> >              // Get the label for this option
> >              try {
> >                  beanLabel = PropertyUtils.getProperty(bean, label);
> >                  if (beanLabel == null) {
> >                      beanLabel = "";
> >                  }
> >              } catch (IllegalAccessException e) {
> >                  JspException jspe = new JspException(
> >                          messages.getMessage("getter.access", label,
bean));
> >                  RequestUtils.saveException(pageContext, jspe);
> >                  throw jspe;
> >              } catch (InvocationTargetException e) {
> >                  Throwable t = e.getTargetException();
> >                  JspException jspe = new JspException(
> >                          messages.getMessage("getter.result", label,
> >                                  t.toString()));
> >                  RequestUtils.saveException(pageContext, jspe);
> >                  throw jspe;
> >              } catch (NoSuchMethodException e) {
> >                  JspException jspe = new JspException(
> >                          messages.getMessage("getter.method", label,
bean));
> >                  RequestUtils.saveException(pageContext, jspe);
> >                  throw jspe;
> >              }
> >
> >              // Get the value for this option
> >              try {
> >                  beanValue = PropertyUtils.getProperty(bean, value);
> >                  if (beanValue == null) {
> >                      beanValue = "";
> >                  }
> >              } catch (IllegalAccessException e) {
> >                  JspException jspe = new JspException(
> >                          messages.getMessage("getter.access", value,
bean));
> >                  RequestUtils.saveException(pageContext, jspe);
> >                  throw jspe;
> >              } catch (InvocationTargetException e) {
> >                  Throwable t = e.getTargetException();
> >                  JspException jspe = new JspException(
> >                          messages.getMessage("getter.result", value,
> >                                  t.toString()));
> >                  RequestUtils.saveException(pageContext, jspe);
> >                  throw jspe;
> >              } catch (NoSuchMethodException e) {
> >                  JspException jspe = new JspException(
> >                          messages.getMessage("getter.method", value,
bean));
> >                  RequestUtils.saveException(pageContext, jspe);
> >                  throw jspe;
> >              }
> >
> >              String stringLabel = beanLabel.toString();
> >              String stringValue = beanValue.toString();
> >
> >              // Render this option
> >              addOption(sb, stringLabel, stringValue,
> >                      selectTag.isMatched(stringValue));
> >          }
> >
> >          // Render this element to our writer
> >          ResponseUtils.write(pageContext, sb.toString());
> >
> >          return SKIP_BODY;
> >
> >      }
> >
> >
> >      /**
> >       * Release any acquired resources.
> >       */
> >      public void release() {
> >
> >          super.release();
> >          label = null;
> >          name = null;
> >          property = null;
> >          style = null;
> >          styleClass = null;
> >          value = null;
> >
> >      }
> >
> >
> >      // ------------------------------------------------------ Protected
Methods
> >
> >
> >      /**
> >       * Add an option element to the specified StringBuffer based on the
> >       * specified parameters.
> >       *
> >       * @param sb StringBuffer accumulating our results
> >       * @param value Value to be returned to the server for this option
> >       * @param label Value to be shown to the user for this option
> >       * @param matched Should this value be marked as selected?
> >       */
> >      protected void addOption(StringBuffer sb, String label, String
value,
> >                               boolean matched) {
> >
> >          sb.append("<option value=\"");
> >          sb.append(value);
> >          sb.append("\"");
> >          if (matched)
> >              sb.append(" selected=\"selected\"");
> >          if (style != null) {
> >              sb.append(" style=\"");
> >              sb.append(style);
> >              sb.append("\"");
> >          }
> >          if (styleClass != null) {
> >              sb.append(" class=\"");
> >              sb.append(styleClass);
> >              sb.append("\"");
> >          }
> >          sb.append(">");
> >          sb.append(ResponseUtils.filter(label));
> >          sb.append("</option>\r\n");
> >
> >      }
> >
> >
> >      /**
> >       * Return an iterator for the option labels or values, based on our
> >       * configured properties.
> >       *
> >       * @param name Name of the bean attribute (if any)
> >       * @param property Name of the bean property (if any)
> >       *
> >       * @exception JspException if an error occurs
> >       */
> >      protected Iterator getIterator(Object collection)
> >              throws JspException {
> >
> >          if (collection.getClass().isArray())
> >              collection = Arrays.asList((Object[]) collection);
> >
> >          if (collection instanceof Collection)
> >              return (((Collection)collection).iterator());
> >          else if (collection instanceof Iterator)
> >              return ((Iterator)collection);
> >          else if (collection instanceof Map)
> >              return (((Map)collection).entrySet().iterator());
> >          else if (collection instanceof Enumeration)
> >              return(new IteratorAdapter((Enumeration)collection));
> >          else
> >              throw new JspException(
> >
messages.getMessage("optionsCollectionTag.iterator",
> >                      collection.toString()));
> >
> >      }
> >
> >  }
> >
> >
> >
> >  1.6       +10 -1     jakarta-struts/web/exercise-taglib/html-select.jsp
> >
> >  Index: html-select.jsp
> >  ===================================================================
> >  RCS file:
/home/cvs/jakarta-struts/web/exercise-taglib/html-select.jsp,v
> >  retrieving revision 1.5
> >  retrieving revision 1.6
> >  diff -u -r1.5 -r1.6
> >  --- html-select.jsp 21 Feb 2002 05:48:10 -0000 1.5
> >  +++ html-select.jsp 23 Feb 2002 07:10:30 -0000 1.6
> >  @@ -79,10 +79,19 @@
> >     </tr>
> >
> >     <tr>
> >  -    <th align="right">Multiple Select From A Collection:</th>
> >  +    <th align="right">Multiple Select From A Collection (Using
&lt;html:options&gt;):</th>
> >       <td align="left">
> >         <html:select property="collectionSelect" size="10"
multiple="true">
> >           <html:options collection="options" property="value"
labelProperty="label"/>
> >  +      </html:select>
> >  +    </td>
> >  +  </tr>
> >  +
> >  +  <tr>
> >  +    <th align="right">Multiple Select From A Collection (Using
&lt;html:optionsCollection&gt;):</th>
> >  +    <td align="left">
> >  +      <html:select property="beanCollectionSelect" size="10"
multiple="true">
> >  +        <html:optionsCollection name="testbean"
property="beanCollection"/>
> >         </html:select>
> >       </td>
> >     </tr>
> >
> >
> >
> >
> >--
> >To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> >For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
> >
>
>
>
> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to