## HTML_BASIC render-kit
component-family: javax.faces.SelectMany renderer-type: javax.faces.Listbox

Render an HTML option list.

Decode Behavior

This section documents the decode behavior for all renderers that handle `UISelectMany` or `UISelectOne` components.

Decode Behavior for `UISelectMany` components

Obtain the `Map` from the "requestParameterValuesMap" property of the `ExternalContext`. If the `Map` contains an entry for the "clientId" of the component, pass the value of the entry, cast to a `String []`, to the `setSubmittedValue()` method of the component, which must be an `EditableValueHolder`. If the `Map` does not contain an entry, create an empty `String` array and call `setSubmittedValue()` with it.

Please check the javadoc for UISelectMany.getConvertedValue() for additional requirements for renderers that render this kind of component.

Decode Behavior for `UISelectOne` components

Obtain the `Map` from the "requestParameterMap" property of the `ExternalContext`. If there is a `Map` entry for the "clientId" property of the component, pass it to the `setSubmittedValue()` method of the component. If the `Map` does not contain an entry, call `setSubmittedValue()` passing an empty `String` as the argument.

Encode Behavior

Render an HTML "select" element. Render the clientId of the component as the value of the "name" attribute. If the "styleClass" attribute is specified, render its value as the value of the "class" attribute on the "select" element. If the component is a `UISelectMany` instance, render "multiple" as the value of the "multiple" attribute. If the "size" attribute is specified, render its value as the value of the "size" attribute. Otherwise use the number of items as the value of the "size" attribute.

Rendering the "option" elements

The only valid children of this component are `UISelectItem` or `UISelectItems` instances. Iterate over the children of this component, and accrue a list of `javax.faces.model.SelectItem` instances. If the current child is a `SelectItem` whose `noSelctionProperty` is `true`, and the `UISelectOne` or `UISelectMany` parent of this option has one or more selected values that are not the "no selection" `SelectItem`, and the component has a "hideNoSelectionLabel" attribute whose value is `true`, then the current option, which is the "no selection" option, must not be rendered. If the current child is a `UISelectItem` create a `SelectItem`instance from its `itemValue, itemLabel`, `itemEscaped`, and `itemDescription` properties, add it to the list. If the current child is a `UISelectItems` instance, call its `getValue()` method. If the result is a `SelectItem` bean, add it to the list. If the result is an array of `SelectItem` beans, add each one to the list. If the result is a `Collection` of `SelectItem` beans, add each one to the list. If the result is a `Map`, create a `SelectItem` bean for each entry in the `Map` using the key as the label, the value as the value, and `null` as the description.

Iterate over the list of `SelectItem` beans. If the current element is a `SelectItemGroup`, render an "optgroup" element with a "label" attribute, the value of which is the "label" property from the current element, then call `getSelectItems()` and render each element as below. If the current element is not a `SelectItemGroup`, render an "option" element. Follow the conversion rules in the spec to obtain a renderable `String` from the "value" property of the current element, render that as the value of the "value" atribute. Now it is time to see if the current element is the selected value. Call its `getSubmittedValue()` method, casting the result to an `Object []`, otherwise the component must be a `UISelectOne` instance, call its `getSubmittedValue()` method and create an `Object []` around the result. Determine the type of the resultant array, if the resultant array is non-null, otherwise the type is `String`. Coerce the current item value to this type following the Expression Language coercion rules. If the resultant array is non-null, we look in the array for a value that, when we pass the renderable value to its `equals()` method, it returns `true`, meaning the current element is selected. If the resultant array is `null`, if the component is a `UISelectMany`, call its `getValue()` method. If the result is a `List` obtain the values in the list as an array. Otherwise, the component must be a `UISelectOne` instance. Call its `getValue()` method, which must be an Object array. Look for an element in the resultant array that, 1. when we pass the renderable value to its `equals()` method, it returns `true` , or 2. if the renderable value is null, and there is a null element in the array, also conclude that the current element is selected. Otherwise the current element is not selected. Now, if the current value is selected, write out an HTML boolean property "selected". If the current SelectItem.isDisabled() returns true, render "disabled" as the value of the "disabled" attribute. If the value of the `escape` property is true, use the `writeText()` method of `ResponseWriter` to write out the value of the `label` property. Otherwise, use the `write()` method of the `ResponseWriter` to do so.

This renderer is responsible for rendering its children.

### Note:

Attributes with a `pass-through` value of `true` are not interpreted by the renderer and are passed straight through to the rendered markup, without checking for validity. Attributes with a `pass-through` value of `false` are interpreted by the renderer, and may or may not be checked for validity by the renderer.

Attributes
attribute-name | pass-through | attribute-class | description | default-value
--- | --- | --- | --- | ---
`accesskey` | true | `java.lang.String` | Access key that, when pressed, transfers focus to this element. | undefined |
`collectionType` | false | `java.lang.String` | Optional attribute that is a literal string that is the fully qualified class name of a concrete class that implements `java.util.Collection`, or an EL expression that evaluates to either 1. such a String, or 2. the `Class` object itself. | undefined |
`dir` | true | `java.lang.String` | Direction indication for text that does not inherit directionality. Valid values are "LTR" (left-to-right) and "RTL" (right-to-left). | undefined |
`disabled` | false | `boolean` | Flag indicating that this element must never receive focus or be included in a subsequent submit. A value of false causes no attribute to be rendered, while a value of true causes the attribute to be rendered as disabled="disabled". | undefined |
`disabledClass` | false | `java.lang.String` | CSS style class to apply to the rendered label on disabled options. | undefined |
`enabledClass` | false | `java.lang.String` | CSS style class to apply to the rendered label on enabled options. | undefined |
`hideNoSelectionOption` | false | `boolean` | Flag indicating that, if this component is activated by the user, The "no selection option", if any, must be hidden. | undefined |
`lang` | true | `java.lang.String` | Code describing the language used in the generated markup for this component. | undefined |
`onblur` | true | `java.lang.String` | Javascript code executed when this element loses focus. | undefined |
`onchange` | false | `java.lang.String` | Javascript code executed when this element loses focus and its value has been modified since gaining focus. | undefined |
`onclick` | true | `java.lang.String` | Javascript code executed when a pointer button is clicked over this element. | undefined |
`ondblclick` | true | `java.lang.String` | Javascript code executed when a pointer button is double clicked over this element. | undefined |
`onfocus` | true | `java.lang.String` | Javascript code executed when this element receives focus. | undefined |
`onkeydown` | true | `java.lang.String` | Javascript code executed when a key is pressed down over this element. | undefined |
`onkeypress` | true | `java.lang.String` | Javascript code executed when a key is pressed and released over this element. | undefined |
`onkeyup` | true | `java.lang.String` | Javascript code executed when a key is released over this element. | undefined |
`onmousedown` | true | `java.lang.String` | Javascript code executed when a pointer button is pressed down over this element. | undefined |
`onmousemove` | true | `java.lang.String` | Javascript code executed when a pointer button is moved within this element. | undefined |
`onmouseout` | true | `java.lang.String` | Javascript code executed when a pointer button is moved away from this element. | undefined |
`onmouseover` | true | `java.lang.String` | Javascript code executed when a pointer button is moved onto this element. | undefined |
`onmouseup` | true | `java.lang.String` | Javascript code executed when a pointer button is released over this element. | undefined |
`onselect` | true | `java.lang.String` | Javascript code executed when text within this element is selected by the user. | undefined |
`readonly` | false | `boolean` | Flag indicating that this component will prohibit changes by the user. The element may receive focus unless it has also been disabled. A value of false causes no attribute to be rendered, while a value of true causes the attribute to be rendered as readonly="readonly". | undefined |
`size` | false | `int` | Number of available options to be shown at all times. If not specified, all available options are shown. | undefined |
`style` | true | `java.lang.String` | CSS style(s) to be applied when this component is rendered. | undefined |
`styleClass` | false | `java.lang.String` | Space-separated list of CSS style class(es) to be applied when this element is rendered. This value must be passed through as the "class" attribute on generated markup. | undefined |
`tabindex` | true | `java.lang.String` | Position of this element in the tabbing order for the current document. This value must be an integer between 0 and 32767. | undefined |
`title` | true | `java.lang.String` | Advisory title information about markup elements generated for this component. | undefined |

Copyright (c) 2003-2010 Oracle America, Inc. All Rights Reserved.