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]>