Class UIData
- All Implemented Interfaces:
NamingContainer
,PartialStateHolder
,StateHolder
,TransientStateHolder
,UniqueIdVendor
,ComponentSystemEventListener
,FacesListener
,SystemEventListenerHolder
,EventListener
- Direct Known Subclasses:
HtmlDataTable
UIData is a
UIComponent
that supports data binding to a collection of data objects represented by a DataModel
instance, which is the current value of this component itself (typically established via a ValueExpression
).
During iterative processing over the rows of data in the data model, the object for the current row is exposed as a
request attribute under the key specified by the var
property.
Only children of type UIColumn
should be processed by renderers associated with this component.
By default, the rendererType
property is set to jakarta.faces.Table
. This value can be
changed by calling the setRendererType()
method.
-
Field Summary
Modifier and TypeFieldDescriptionstatic final String
The standard component family for this component.static final String
The standard component type for this component.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
Fields inherited from interface jakarta.faces.component.NamingContainer
SEPARATOR_CHAR
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
broadcast
(FacesEvent event) Override the defaultUIComponentBase.broadcast(jakarta.faces.event.FacesEvent)
processing to unwrap any wrappedFacesEvent
and reset the current row index, before the event is actually broadcast.createUniqueId
(FacesContext context, String seed) Generate an identifier for a component.void
encodeBegin
(FacesContext context) In addition to the default behavior, ensure that any saved per-row state for our child input components is discarded unless it is needed to rerender the current page with errors.getClientId
(FacesContext context) Return a client identifier for this component that includes the current value of therowIndex
property, if it is not set to -1.protected DataModel
Return the internalDataModel
object representing the data objects that we will iterate over in this component's rendering.Return the identifier of the component family to which this component belongs.int
getFirst()
Return the zero-relative row number of the first row to be displayed.Return the footer facet of this component (if any).Return the header facet of this component (if any).int
Return the number of rows in the underlying data model.Return the data object representing the data for the currently selected row index, if any.int
Return the zero-relative index of the currently selected row.int
getRows()
Return the number of rows to be displayed, or zero for all remaining rows in the table.getValue()
Return the value of the UIData.getVar()
Return the request-scope attribute under which the data object for the current row will be exposed when iterating.boolean
invokeOnComponent
(FacesContext context, String clientId, ContextCallback callback) Override behavior fromUIComponentBase.invokeOnComponent(jakarta.faces.context.FacesContext, java.lang.String, jakarta.faces.component.ContextCallback)
to provide special care for positioning the data properly before finding the component and invoking the callback on it.boolean
Return a flag indicating whether there isrowData
available at the currentrowIndex
.boolean
Return the value of therowStatePreserved
JavaBeans property.void
Override the base class method to take special action if the method is being invoked whenStateManager.IS_BUILDING_INITIAL_STATE
is true and therowStatePreserved
JavaBeans property for this instance istrue
.void
processDecodes
(FacesContext context) Override the defaultUIComponentBase.processDecodes(jakarta.faces.context.FacesContext)
processing to perform the following steps.void
processUpdates
(FacesContext context) Override the defaultUIComponentBase.processUpdates(jakarta.faces.context.FacesContext)
processing to perform the following steps.void
processValidators
(FacesContext context) Override the defaultUIComponentBase.processValidators(jakarta.faces.context.FacesContext)
processing to perform the following steps.void
queueEvent
(FacesEvent event) Override the defaultUIComponentBase.queueEvent(jakarta.faces.event.FacesEvent)
processing to wrap any queued events in a wrapper so that we can reset the current row index inbroadcast()
.void
restoreState
(FacesContext context, Object state) Perform any processing required to restore the state from the entries in the state Object.saveState
(FacesContext context) Gets the state of the instance as aSerializable
Object.protected void
setDataModel
(DataModel dataModel) Set the internal DataModel.void
setFirst
(int first) Set the zero-relative row number of the first row to be displayed.void
setFooter
(UIComponent footer) Set the footer facet of this component.void
setHeader
(UIComponent header) Set the header facet of this component.void
setRowIndex
(int rowIndex) Set the zero relative index of the current row, or -1 to indicate that no row is currently selected, by implementing the following algorithm.void
setRows
(int rows) Set the number of rows to be displayed, or zero for all remaining rows in the table.void
setRowStatePreserved
(boolean preserveComponentState) If this property is set totrue
, theUIData
must take steps to ensure that modifications to its iterated children will be preserved on a per-row basis.void
Set the value of theUIData
.void
setValueBinding
(String name, ValueBinding binding) Deprecated.void
setValueExpression
(String name, ValueExpression binding) Set theValueExpression
used to calculate the value for the specified attribute or property name, if any.void
Set the request-scope attribute under which the data object for the current row wil be exposed when iterating.boolean
visitTree
(VisitContext context, VisitCallback callback) Override the behavior inUIComponent.visitTree(jakarta.faces.component.visit.VisitContext, jakarta.faces.component.visit.VisitCallback)
to handle iteration correctly.Methods inherited from class jakarta.faces.component.UIComponentBase
addClientBehavior, addFacesListener, clearInitialState, decode, encodeChildren, encodeEnd, findComponent, getAttributes, getChildCount, getChildren, getClientBehaviors, getDefaultEventName, getEventNames, getFacesContext, getFacesListeners, getFacet, getFacetCount, getFacets, getFacetsAndChildren, getId, getListenersForEventClass, getParent, getPassThroughAttributes, getRenderer, getRendererType, getRendersChildren, getValueBinding, isRendered, isTransient, processRestoreState, processSaveState, 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, getValueExpression, initialStateMarked, isCompositeComponent, isInView, isVisitable, popComponentFromEL, processEvent, pushComponentToEL, restoreTransientState, saveTransientState, setInView
-
Field Details
-
COMPONENT_TYPE
The standard component type for this component.
- See Also:
-
COMPONENT_FAMILY
The standard component family for this component.
- See Also:
-
-
Constructor Details
-
UIData
public UIData()Create a new
UIData
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
- Specified by:
getFamily
in classUIComponent
- Returns:
- the component family (not null).
-
getFirst
public int getFirst()Return the zero-relative row number of the first row to be displayed.
- Returns:
- the row number.
-
setFirst
public void setFirst(int first) Set the zero-relative row number of the first row to be displayed.
- Parameters:
first
- New first row number- Throws:
IllegalArgumentException
- iffirst
is negative
-
getHeader
Return the header facet of this component (if any). A convenience method for
getFacet("header")
.- Returns:
- the header facet.
-
setHeader
Set the header facet of this component. A convenience method for
getFacets().put("header", header)
.- Parameters:
header
- the new header facet- Throws:
NullPointerException
- ifheader
isnull
-
isRowAvailable
public boolean isRowAvailable()Return a flag indicating whether there is
rowData
available at the currentrowIndex
. If nowrappedData
is available, returnfalse
.- Returns:
- whether the row is available.
- Throws:
FacesException
- if an error occurs getting the row availability
-
getRowCount
public int getRowCount()Return the number of rows in the underlying data model. If the number of available rows is unknown, return -1.
- Returns:
- the row count.
- Throws:
FacesException
- if an error occurs getting the row count
-
getRowData
Return the data object representing the data for the currently selected row index, if any.
- Returns:
- the row data.
- Throws:
FacesException
- if an error occurs getting the row dataIllegalArgumentException
- if now row data is available at the currently specified row index
-
getRowIndex
public int getRowIndex()Return the zero-relative index of the currently selected row. If we are not currently positioned on a row, return -1. This property is not enabled for value binding expressions.
- Returns:
- the row index.
- Throws:
FacesException
- if an error occurs getting the row index
-
setRowIndex
public void setRowIndex(int rowIndex) Set the zero relative index of the current row, or -1 to indicate that no row is currently selected, by implementing the following algorithm. It is possible to set the row index at a value for which the underlying data collection does not contain any row data. Therefore, callers may use the
isRowAvailable()
method to detect whether row data will be available for use by thegetRowData()
method.To support transient state among descendents, please consult the specification for
setRowStatePreserved(boolean)
, which details the requirements forsetRowIndex()
when therowStatePreserved
JavaBeans property is set totrue
.- Save current state information for all descendant components (as described below).
- Store the new row index, and pass it on to the
DataModel
associated with thisUIData
instance. - If the new
rowIndex
value is -1:- If the
var
property is not null, remove the corresponding request scope attribute (if any). - Reset the state information for all descendant components (as described below).
- If the
- If the new
rowIndex
value is not -1:- If the
var
property is not null, callgetRowData()
and expose the resulting data object as a request scope attribute whose key is thevar
property value. - Reset the state information for all descendant components (as described below).
- If the
To save current state information for all descendant components,
UIData
must maintain per-row information for each descendant as follows:- If the descendant is an instance of
EditableValueHolder
, save the state of itslocalValue
property. - If the descendant is an instance of
EditableValueHolder
, save the state of thelocalValueSet
property. - If the descendant is an instance of
EditableValueHolder
, save the state of thevalid
property. - If the descendant is an instance of
EditableValueHolder
, save the state of thesubmittedValue
property.
To restore current state information for all descendant components,
UIData
must reference its previously stored information for the currentrowIndex
and call setters for each descendant as follows:- If the descendant is an instance of
EditableValueHolder
, restore thevalue
property. - If the descendant is an instance of
EditableValueHolder
, restore the state of thelocalValueSet
property. - If the descendant is an instance of
EditableValueHolder
, restore the state of thevalid
property. - If the descendant is an instance of
EditableValueHolder
, restore the state of thesubmittedValue
property.
- Parameters:
rowIndex
- The new row index value, or -1 for no associated row- Throws:
FacesException
- if an error occurs setting the row indexIllegalArgumentException
- ifrowIndex
is less than -1
-
getRows
public int getRows()Return the number of rows to be displayed, or zero for all remaining rows in the table. The default value of this property is zero.
- Returns:
- the number of rows.
-
setRows
public void setRows(int rows) Set the number of rows to be displayed, or zero for all remaining rows in the table.
- Parameters:
rows
- New number of rows- Throws:
IllegalArgumentException
- ifrows
is negative
-
getVar
Return the request-scope attribute under which the data object for the current row will be exposed when iterating. This property is not enabled for value binding expressions.
- Returns:
- he request-scope attribute.
-
setVar
Set the request-scope attribute under which the data object for the current row wil be exposed when iterating.
- Parameters:
var
- The new request-scope attribute name
-
isRowStatePreserved
public boolean isRowStatePreserved()Return the value of the
rowStatePreserved
JavaBeans property. SeesetRowStatePreserved(boolean)
.- Returns:
- the value of the
rowStatePreserved
. - Since:
- 2.1
-
setRowStatePreserved
public void setRowStatePreserved(boolean preserveComponentState) If this property is set to
true
, theUIData
must take steps to ensure that modifications to its iterated children will be preserved on a per-row basis. This allows applications to modify component properties, such as the style-class, for a specific row, rather than having such modifications apply to all rows.To accomplish this,
UIData
must callStateHolder.saveState(jakarta.faces.context.FacesContext)
andTransientStateHolder.saveTransientState(jakarta.faces.context.FacesContext)
on its children to capture their state on exiting each row. When re-entering the row,StateHolder.restoreState(jakarta.faces.context.FacesContext, java.lang.Object)
andTransientStateHolder.restoreTransientState(jakarta.faces.context.FacesContext, java.lang.Object)
must be called in order to reinitialize the children to the correct state for the new row. All of this action must take place during the processing ofsetRowIndex(int)
.Users should consider enabling this feature for cases where it is necessary to modify properties of
UIData
's children in a row-specific way. Note, however, that row-level state saving/restoring does add overhead. As such, this feature should be used judiciously.- Parameters:
preserveComponentState
- the flag if the state should be preserved.- Since:
- 2.1
-
getValue
Return the value of the UIData. This value must either be be of type
DataModel
, or a type that can be adapted into aDataModel
.UIData
will automatically adapt the following types:- Arrays
java.util.List
java.sql.ResultSet
jakarta.servlet.jsp.jstl.sql.Result
java.util.Collection
All other types will be adapted using the
ScalarDataModel
class, which will treat the object as a single row of data.- Returns:
- the object for the value.
-
setValue
Set the value of the
UIData
. This value must either be be of typeDataModel
, or a type that can be adapted into aDataModel
.- Parameters:
value
- the new value
-
setValueBinding
Deprecated.This has been replaced bysetValueExpression(java.lang.String, jakarta.el.ValueExpression)
.If "name" is something other than "value", "var", or "rowIndex", rely on the superclass conversion from
ValueBinding
toValueExpression
.- 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:
IllegalArgumentException
- ifname
is one ofid
,parent
,var
, orrowIndex
NullPointerException
- ifname
isnull
-
setValueExpression
Set the
ValueExpression
used to calculate the value for the specified attribute or property name, if any. In addition, if aValueExpression
is set for thevalue
property, remove any synthesizedDataModel
for the data previously bound to this component.- 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:
IllegalArgumentException
- ifname
is one ofid
,parent
,var
, orrowIndex
NullPointerException
- ifname
isnull
- Since:
- 1.2
-
getClientId
Return a client identifier for this component that includes the current value of the
rowIndex
property, if it is not set to -1. This implies that multiple calls togetClientId()
may return different results, but ensures that child components can themselves generate row-specific client identifiers (sinceUIData
is aNamingContainer
).- Overrides:
getClientId
in classUIComponentBase
- Parameters:
context
- TheFacesContext
for the current request- Returns:
- the client id.
- Throws:
NullPointerException
- ifcontext
isnull
-
invokeOnComponent
public boolean invokeOnComponent(FacesContext context, String clientId, ContextCallback callback) throws FacesException Override behavior from
UIComponentBase.invokeOnComponent(jakarta.faces.context.FacesContext, java.lang.String, jakarta.faces.component.ContextCallback)
to provide special care for positioning the data properly before finding the component and invoking the callback on it. If the argumentclientId
is equal tothis.getClientId()
simply invoke thecontextCallback
, passing thecontext
argument and this as arguments, and returntrue.
If the argumentclientId
is not equal tothis.getClientId()
, inspect each of the facet children of thisUIData
instance and for each one, compare itsclientId
with the argumentclientId
. If there is a match, invoke thecontextCallback
, passing thecontext
argument and this as arguments, and returntrue
. Otherwise, attempt to extract a rowIndex from theclientId
. For example, if the argumentclientId
wasform:data:3:customerHeader
the rowIndex would be3
. Let this value be callednewIndex
. The current rowIndex of this instance must be saved aside and restored before returning in all cases, regardless of the outcome of the search or if any exceptions are thrown in the process.The implementation of this method must never return
true
if setting the rowIndex of this instance to be equal tonewIndex
causes this instance to returnfalse
fromisRowAvailable()
.- Overrides:
invokeOnComponent
in classUIComponentBase
- Parameters:
context
- theFacesContext
for the current requestclientId
- the client identifier of the component to be passed to the argument callback.callback
- an implementation of the Callback interface.- Returns:
true
if the a component with the givenclientId
is found, the callback method was successfully invoked passing that component as an argument, and no Exception was thrown. Returnsfalse
if no component with the givenclientId
is found.- Throws:
NullPointerException
- if any of the arguments are nullFacesException
- if the argument Callback throws an Exception, it is wrapped in aFacesException
and re-thrown. Also throwsFacesException
if any exception is thrown when deriving the rowIndex from the argumentclientId
.- Since:
- 1.2
-
queueEvent
Override the default
UIComponentBase.queueEvent(jakarta.faces.event.FacesEvent)
processing to wrap any queued events in a wrapper so that we can reset the current row index inbroadcast()
.- Overrides:
queueEvent
in classUIComponentBase
- Parameters:
event
-FacesEvent
to be queued- Throws:
IllegalStateException
- if this component is not a descendant of aUIViewRoot
NullPointerException
- ifevent
isnull
-
broadcast
Override the default
UIComponentBase.broadcast(jakarta.faces.event.FacesEvent)
processing to unwrap any wrappedFacesEvent
and reset the current row index, before the event is actually broadcast. For events that we did not wrap (inqueueEvent()
), default processing will occur.- Overrides:
broadcast
in classUIComponentBase
- Parameters:
event
- TheFacesEvent
to be broadcast- Throws:
AbortProcessingException
- Signal the Jakarta Server Faces implementation that no further processing on the current event should be performedIllegalArgumentException
- if the implementation class of thisFacesEvent
is not supported by this componentNullPointerException
- ifevent
isnull
-
encodeBegin
In addition to the default behavior, ensure that any saved per-row state for our child input components is discarded unless it is needed to rerender the current page with errors.
- Overrides:
encodeBegin
in classUIComponentBase
- Parameters:
context
- FacesContext for the current request- Throws:
IOException
- if an input/output error occurs while renderingNullPointerException
- ifcontext
isnull
-
processDecodes
Override the default
UIComponentBase.processDecodes(jakarta.faces.context.FacesContext)
processing to perform the following steps.- If the
rendered
property of thisUIComponent
isfalse
, skip further processing. - Set the current
rowIndex
to -1. - Call the
processDecodes()
method of all facets of thisUIData
, in the order determined by a call togetFacets().keySet().iterator()
. - Call the
processDecodes()
method of all facets of theUIColumn
children of thisUIData
. - Iterate over the set of rows that were included when this component was rendered (i.e. those defined by the
first
androws
properties), performing the following processing for each row: - Set the current
rowIndex
to -1. - Call the
decode()
method of this component. - If a
RuntimeException
is thrown during decode processing, callFacesContext.renderResponse()
and re-throw the exception.
- Overrides:
processDecodes
in classUIComponentBase
- Parameters:
context
-FacesContext
for the current request- Throws:
NullPointerException
- ifcontext
isnull
- If the
-
processValidators
Override the default
UIComponentBase.processValidators(jakarta.faces.context.FacesContext)
processing to perform the following steps.- If the
rendered
property of thisUIComponent
isfalse
, skip further processing. - Set the current
rowIndex
to -1. - Call the
processValidators()
method of all facets of thisUIData
, in the order determined by a call togetFacets().keySet().iterator()
. - Call the
processValidators()
method of all facets of theUIColumn
children of thisUIData
. - Iterate over the set of rows that were included when this component was rendered (i.e. those defined by the
first
androws
properties), performing the following processing for each row: - Set the current
rowIndex
to -1.
- Overrides:
processValidators
in classUIComponentBase
- Parameters:
context
-FacesContext
for the current request- Throws:
NullPointerException
- ifcontext
isnull
- See Also:
- If the
-
processUpdates
Override the default
UIComponentBase.processUpdates(jakarta.faces.context.FacesContext)
processing to perform the following steps.- If the
rendered
property of thisUIComponent
isfalse
, skip further processing. - Set the current
rowIndex
to -1. - Call the
processUpdates()
method of all facets of thisUIData
, in the order determined by a call togetFacets().keySet().iterator()
. - Call the
processUpdates()
method of all facets of theUIColumn
children of thisUIData
. - Iterate over the set of rows that were included when this component was rendered (i.e. those defined by the
first
androws
properties), performing the following processing for each row: - Set the current
rowIndex
to -1.
- Overrides:
processUpdates
in classUIComponentBase
- Parameters:
context
-FacesContext
for the current request- Throws:
NullPointerException
- ifcontext
isnull
- If the
-
createUniqueId
Description copied from interface:UniqueIdVendor
Generate an identifier for a component. The identifier will be prefixed with UNIQUE_ID_PREFIX, and will be unique within this component-container. Optionally, a unique seed value can be supplied by component creators which should be included in the generated unique id.
- Specified by:
createUniqueId
in interfaceUniqueIdVendor
- Parameters:
context
- FacesContextseed
- an optional seed value - e.g. based on the position of the component in the VDL-template- Returns:
- a unique-id in this component-container
-
visitTree
Override the behavior in
UIComponent.visitTree(jakarta.faces.component.visit.VisitContext, jakarta.faces.component.visit.VisitCallback)
to handle iteration correctly.If the
UIComponent.isVisitable(jakarta.faces.component.visit.VisitContext)
method of this instance returnsfalse
, take no action and return.Call
UIComponent.pushComponentToEL(jakarta.faces.context.FacesContext, jakarta.faces.component.UIComponent)
and invoke the visit callback on thisUIData
instance as described inUIComponent.visitTree(jakarta.faces.component.visit.VisitContext, jakarta.faces.component.visit.VisitCallback)
. Let the result of the invoctaion be visitResult. If visitResult isVisitResult.COMPLETE
, take no further action and returntrue
. Otherwise, determine if we need to visit our children. The default implementation callsVisitContext.getSubtreeIdsToVisit(jakarta.faces.component.UIComponent)
passingthis
as the argument. If the result of that call is non-empty, let doVisitChildren betrue
. If doVisitChildren istrue
and visitResult isVisitResult.ACCEPT
, take the following action.-
If this component has facets, call
UIComponent.getFacets()
on this instance and invoke thevalues()
method. For eachUIComponent
in the returnedMap
, callUIComponent.visitTree(jakarta.faces.component.visit.VisitContext, jakarta.faces.component.visit.VisitCallback)
. -
If this component has children, for each
UIColumn
child:Call
VisitContext.invokeVisitCallback(jakarta.faces.component.UIComponent, jakarta.faces.component.visit.VisitCallback)
on thatUIColumn
instance. If such a call returnstrue
, terminate visiting and returntrue
from this method.If the child
UIColumn
has facets, callUIComponent.visitTree(jakarta.faces.component.visit.VisitContext, jakarta.faces.component.visit.VisitCallback)
on each one.Take no action on non-
UIColumn
children. -
Save aside the result of a call to
getRowIndex()
.For each child component of this
UIData
that is also an instance ofUIColumn
,Iterate over the rows.
-
Let rowsToProcess be the return from
getRows()
. -
Let rowIndex be the return from
getFirst()
- 1. -
While the number of rows processed is less than rowsToProcess, take the following actions.
Call
setRowIndex(int)
, passing the current row index.If
isRowAvailable()
returnsfalse
, take no further action and returnfalse
.Call
UIComponent.visitTree(jakarta.faces.component.visit.VisitContext, jakarta.faces.component.visit.VisitCallback)
on each of the children of thisUIColumn
instance.
-
Call
UIComponent.popComponentFromEL(jakarta.faces.context.FacesContext)
and restore the saved row index with a call tosetRowIndex(int)
.Return
false
to allow the visiting to continue.- Overrides:
visitTree
in classUIComponent
- Parameters:
context
- theVisitContext
that provides context for performing the visit.callback
- the callback to be invoked for each node encountered in the visit.- Returns:
- component implementations may return
true
to indicate that the tree visit is complete (eg. all components that need to be visited have been visited). This results in the tree visit being short-circuited such that no more components are visited.
-
-
setValueExpression(java.lang.String, jakarta.el.ValueExpression)
.