I've built a custom HtmlDataTable/UIColumns composite component.
My problem is that I'm initializing the programmically-created UIData
facet/children in my constructor, and this appears to be the wrong
approach.
This works fine on the initial display of the component. However,
after the component is restored, it then has two copies of each
facet/child, one from the constructor, and one from the restoreState.
This causes processRestoreState to die horribly.
What's the correct way to set up children/facets? Or to put it
another way, what's the correct way to detect that the component is
being constructed in an "initial request?"
The Kito Mann "JSF in Action" book has this being done in the
constructor for UIHeadlineViewer, but while I love the layout and
concepts in this book, the example code seems as if it's never been
executed.
I noticed that HtmlTree has this code in encodeBegin, and I'm
wondering if this is the recommended way to detect the initial request
state or just some integrity-checking.
Thanks!
-Mike
public void encodeBegin(FacesContext context) throws IOException
{
/// [...]
if (!itemStatesRestored)
{
UIViewRoot previousRoot = (UIViewRoot)
context.getExternalContext().getRequestMap().get(PREVIOUS_VIEW_ROOT);
if (previousRoot != null)
{
restoreItemStates(context, previousRoot);
} else
{
//no previous root, means no decode was done
//--> a new request
}
}
super.encodeBegin(context);
}