Class UISelectMany
- All Implemented Interfaces:
EditableValueHolder
,PartialStateHolder
,StateHolder
,TransientStateHolder
,ValueHolder
,ComponentSystemEventListener
,FacesListener
,SystemEventListenerHolder
,EventListener
- Direct Known Subclasses:
HtmlSelectManyCheckbox
,HtmlSelectManyListbox
,HtmlSelectManyMenu
public class UISelectMany extends UIInput
UISelectMany is a UIComponent
that
represents the user's choice of a zero or more items from among a discrete set of available options. The user can
modify the selected values. Optionally, the component can be preconfigured with zero or more currently selected
items, by storing them as an array or Collection
in the
value
property of the component.
This component is generally rendered as a select box or a group of checkboxes.
By default, the rendererType
property must be set to "jakarta.faces.Listbox
". This value
can be changed by calling the setRendererType()
method.
The Renderer
for this component must perform the following logic on
getConvertedValue()
:
Obtain the
Converter
using the following algorithm:If the component has an attached
Converter
, use it.If not, look for a
ValueExpression
forvalue
(if any). TheValueExpression
must point to something that is:
An array of primitives (such as
int[]
). Look up the registered by-classConverter
for this primitive type.An array of objects (such as
Integer[]
orString[]
). Look up the registered by-classConverter
for the underlying element type.A
java.util.Collection
. Do not convert the values. Instead, convert the provided set of available options to string, exactly as done during render response, and for any match with the submitted values, add the available option as object to the collection.If for any reason a
Converter
cannot be found, assume the type to be a String array.
Use the selected Converter
(if any) to convert each element in the values array from
the request to the proper type, and store the result of each conversion in a data
structure, called targetForConvertedValues for discussion. Create targetForConvertedValues using
the following algorithm.
-
If the component has a
ValueExpression
forvalue
and the type of the expression is an array, let targetForConvertedValues be a new array of the expected type. -
If the component has a
ValueExpression
forvalue
, let modelType be the type of the value expression. If modelType is aCollection
, do the following to arrive at targetForConvertedValues:-
Ask the component for its attribute under the key "
collectionType
", without the quotes. If there is a value for that key, the value must be a String that is a fully qualified Java class name, or aClass
object, or aValueExpression
that evaluates to a String or aClass
. In all cases, the value serves to identify the concrete type of the class that implementsCollection
. For discussion, this is called collectionType. Let targetForConvertedValues be a new instance ofCollection
implemented by the concrete class specified in collectionType. If, collectionType can not be discovered, or an instance ofCollection
implemented by the concrete class specified in collectionType cannot be created, throw aFacesException
with a correctly localized error message. Note thatFacesException
is thrown instead ofConverterException
because this case would only arise from developer error, rather than end-user error. -
If there is no "
collectionType
" attribute, callgetValue()
on the component. The result will implementCollection
. If the result also implementsCloneable
, let targetForConvertedValues be the result of calling itsclone()
method, then callingclear()
on the clonedCollection
. If unable to clone the value for any reason, log a message and proceed to the next step. -
If modelType is a concrete class, let targetForConvertedValues be a new instance of that class. Otherwise, the concrete type for targetForConvertedValues is taken from the following table. All classes are in the
java.util
package. All collections must be created with an initial capacity equal to the length of the values array from the request.modelType to targetForConvertedValues mapping If modelType is an instance of then targetForConvertedValues must be an instance of SortedSet
TreeSet
Queue
LinkedList
Set
HashSet
anything else ArrayList
-
-
If the component does not have a
ValueExpression
forvalue
, let targetForConvertedValues be an array of typeObject
.
Return targetForConvertedValues after populating it with the converted values.
-
Field Summary
Fields Modifier and Type Field Description static String
COMPONENT_FAMILY
The standard component family for this component.static String
COMPONENT_TYPE
The standard component type for this component.static String
INVALID_MESSAGE_ID
The message identifier of theFacesMessage
to be created if a value not matching the available options is specified.Fields inherited from class jakarta.faces.component.UIInput
ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE, CONVERSION_MESSAGE_ID, EMPTY_STRING_AS_NULL_PARAM_NAME, REQUIRED_MESSAGE_ID, UPDATE_MESSAGE_ID, VALIDATE_EMPTY_FIELDS_PARAM_NAME
Fields inherited from class jakarta.faces.component.UIComponent
ATTRS_WITH_DECLARED_DEFAULT_VALUES, BEANINFO_KEY, bindings, COMPOSITE_COMPONENT_TYPE_KEY, COMPOSITE_FACET_NAME, CURRENT_COMPONENT, CURRENT_COMPOSITE_COMPONENT, FACETS_KEY, HONOR_CURRENT_COMPONENT_ATTRIBUTES_PARAM_NAME, VIEW_LOCATION_KEY
-
Constructor Summary
Constructors Constructor Description UISelectMany()
Create a newUISelectMany
instance with default property values. -
Method Summary
Modifier and Type Method Description protected boolean
compareValues(Object previous, Object value)
Returntrue
if the new value is different from the previous value.String
getFamily()
Return the identifier of the component family to which this component belongs.Object[]
getSelectedValues()
Return the currently selected values, ornull
if there are no currently selected values.ValueBinding
getValueBinding(String name)
Deprecated.this has been replaced bygetValueExpression(java.lang.String)
.jakarta.el.ValueExpression
getValueExpression(String name)
Return anyValueExpression
set forvalue
if aValueExpression
forselectedValues
is requested; otherwise, perform the default superclass processing for this method.void
setSelectedValues(Object[] selectedValues)
Set the currently selected values, ornull
to indicate that there are no currently selected values.void
setValueBinding(String name, ValueBinding binding)
Deprecated.This has been replaced bysetValueExpression(java.lang.String, jakarta.el.ValueExpression)
.void
setValueExpression(String name, jakarta.el.ValueExpression binding)
Store anyValueExpression
specified forselectedValues
undervalue
instead; otherwise, perform the default superclass processing for this method.protected void
validateValue(FacesContext context, Object value)
In addition to the standard validation behavior inherited fromUIInput
, ensure that any specified values are equal to one of the available options.Methods inherited from class jakarta.faces.component.UIInput
addValidator, addValueChangeListener, clearInitialState, decode, getConvertedValue, getConverterMessage, getRequiredMessage, getSubmittedValue, getValidator, getValidatorMessage, getValidators, getValue, getValueChangeListener, getValueChangeListeners, isEmpty, isImmediate, isLocalValueSet, isRequired, isValid, markInitialState, processDecodes, processUpdates, processValidators, removeValidator, removeValueChangeListener, resetValue, restoreState, saveState, setConverterMessage, setImmediate, setLocalValueSet, setRequired, setRequiredMessage, setSubmittedValue, setValid, setValidator, setValidatorMessage, setValue, setValueChangeListener, updateModel, validate
Methods inherited from class jakarta.faces.component.UIOutput
getConverter, getLocalValue, setConverter
Methods inherited from class jakarta.faces.component.UIComponentBase
addClientBehavior, addFacesListener, broadcast, encodeBegin, encodeChildren, encodeEnd, findComponent, getAttributes, getChildCount, getChildren, getClientBehaviors, getClientId, getDefaultEventName, getEventNames, getFacesContext, getFacesListeners, getFacet, getFacetCount, getFacets, getFacetsAndChildren, getId, getListenersForEventClass, getParent, getPassThroughAttributes, getRenderer, getRendererType, getRendersChildren, invokeOnComponent, isRendered, isTransient, processRestoreState, processSaveState, queueEvent, removeFacesListener, restoreAttachedState, saveAttachedState, setId, setParent, setRendered, setRendererType, setTransient, subscribeToEvent, unsubscribeFromEvent
Methods inherited from class jakarta.faces.component.UIComponent
encodeAll, getClientId, getCompositeComponentParent, getContainerClientId, getCurrentComponent, getCurrentCompositeComponent, getNamingContainer, getPassThroughAttributes, getResourceBundleMap, getStateHelper, getStateHelper, getTransientStateHelper, getTransientStateHelper, initialStateMarked, isCompositeComponent, isInView, isVisitable, popComponentFromEL, processEvent, pushComponentToEL, restoreTransientState, saveTransientState, setInView, visitTree
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface jakarta.faces.component.ValueHolder
getConverter, getLocalValue, setConverter
-
Field Details
-
COMPONENT_TYPE
The standard component type for this component.
- See Also:
- Constant Field Values
-
COMPONENT_FAMILY
The standard component family for this component.
- See Also:
- Constant Field Values
-
INVALID_MESSAGE_ID
The message identifier of the
FacesMessage
to be created if a value not matching the available options is specified.- See Also:
- Constant Field Values
-
-
Constructor Details
-
UISelectMany
public UISelectMany()Create a new
UISelectMany
instance with default property values.
-
-
Method Details
-
getFamily
Description copied from class:UIComponent
Return the identifier of the component family to which this component belongs. This identifier, in conjunction with the value of the
rendererType
property, may be used to select the appropriateRenderer
for this component instance. Note this method should NOT returnnull
-
getSelectedValues
Return the currently selected values, or
null
if there are no currently selected values. This is a typesafe alias forgetValue()
.- Returns:
- the selected values, or
null
.
-
setSelectedValues
Set the currently selected values, or
null
to indicate that there are no currently selected values. This is a typesafe alias forsetValue()
.- Parameters:
selectedValues
- The new selected values (if any)
-
getValueBinding
Deprecated.this has been replaced bygetValueExpression(java.lang.String)
.Return any
ValueBinding
set forvalue
if aValueBinding
forselectedValues
is requested; otherwise, perform the default superclass processing for this method.This method relies on the superclass to provide the
ValueExpression
toValueBinding
wrapping.- Overrides:
getValueBinding
in classUIComponentBase
- Parameters:
name
- Name of the attribute or property for which to retrieve aValueBinding
- Returns:
- the value binding, or
null
- Throws:
NullPointerException
- ifname
isnull
-
setValueBinding
Deprecated.This has been replaced bysetValueExpression(java.lang.String, jakarta.el.ValueExpression)
.Store any
ValueBinding
specified forselectedValues
undervalue
instead; otherwise, perform the default superclass processing for this method.This method relies on the superclass to wrap the argument
ValueBinding
in aValueExpression
.- Overrides:
setValueBinding
in classUIComponentBase
- Parameters:
name
- Name of the attribute or property for which to set aValueBinding
binding
- TheValueBinding
to set, ornull
to remove any currently setValueBinding
- Throws:
NullPointerException
- ifname
isnull
-
getValueExpression
Return any
ValueExpression
set forvalue
if aValueExpression
forselectedValues
is requested; otherwise, perform the default superclass processing for this method.- Overrides:
getValueExpression
in classUIComponent
- Parameters:
name
- Name of the attribute or property for which to retrieve aValueExpression
- Returns:
- the value expression, or
null
. - Throws:
NullPointerException
- ifname
isnull
- Since:
- 1.2
-
setValueExpression
Store any
ValueExpression
specified forselectedValues
undervalue
instead; otherwise, perform the default superclass processing for this method.- Overrides:
setValueExpression
in classUIComponent
- Parameters:
name
- Name of the attribute or property for which to set aValueExpression
binding
- TheValueExpression
to set, ornull
to remove any currently setValueExpression
- Throws:
NullPointerException
- ifname
isnull
- Since:
- 1.2
-
compareValues
Return
true
if the new value is different from the previous value. Value comparison must not be sensitive to element order.- Overrides:
compareValues
in classUIInput
- Parameters:
previous
- old value of this componentvalue
- new value of this component- Returns:
true
if the new value is different from the previous value,false
otherwise.
-
validateValue
In addition to the standard validation behavior inherited from
UIInput
, ensure that any specified values are equal to one of the available options. Before comparing each option, coerce the option value type to the type of this component's value following the Expression Language coercion rules. If the specified value is not equal to any of the options, enqueue an error message and set thevalid
property tofalse
.This method must explicitly support a value argument that is a single value or a value argument that is a
Collection
or Array of values.If
UIInput.isRequired()
returnstrue
, and the current value is equal to the value of an innerUISelectItem
whoseUISelectItem.isNoSelectionOption()
method returnstrue
, enqueue an error message and set thevalid
property tofalse
.- Overrides:
validateValue
in classUIInput
- Parameters:
context
- TheFacesContext
for the current requestvalue
- The converted value to test for membership.- Throws:
NullPointerException
- ifcontext
isnull
-