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><html:select></code> element, either in
conjunction
> > with or instead of one or more
<code><html:option></code>
> > - elements.</p>
> > + or <code><html:optionsCollection></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><option></code>
elements,
> > + representing possible choices for a
<code><select></code>
> > + element. This tag can be used multiple times within a
single
> > + <code><html:select></code> element, either in
conjunction
> > + with or instead of one or more
<code><html:option></code>
> > + or <code><html:options></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><html:options></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 <input> 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 <select> 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
<html:options>):</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
<html:optionsCollection>):</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]>