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/TestBean.java Index: TestBean.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exercise/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/exercise/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/exercise/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.properties Index: LocalStrings.properties =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LocalStrings.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]>