Nicklas Karlsson wrote:
Hello,

I'm a JSF-noob(tm) and fresh convert from Struts so there might be something with the lifecycle I don't understund but...

I'm trying to make a DB-configurable application using a phase listener that iterates over all the components in the tree and applies attributes, validators etc to them the id can be found in a map of description objects (or hide the component if the user doesn't have access to it)

I can't however make the changes take effect when running the page for the first time. I attached the listener to all phases and the debug code shows that it is doing a setRendered(false) for a component but it still shows up! When I navigate back to the page the component disappears. Something with phases being skipped when there is nothing to restore? If so, is there a way to get around this (by using some other "for every page" method)?

Are you using JSP with JSF?

Assuming you are, the flow goes something like this:
* request received from browser
* "before restore view" phase listener executed
* JSF detects that no component tree currently exists for this view
* "after restore view" phase listener executed
* processing skips straight to the render phase (no component tree
  exists, so there are no components that need to fetch data from
  the posted request, and therefore no validation or model update or
  value-change processing can possibly occur).
* "before render" phase listener executed (still no component tree)
* the JSP page is executed. As each JSF tag is encountered, a
  component object is created, then its properties set, then it is
  added to the view tree, and then that component is immediately
  rendered.
* "after render" phase listener executed.

I therefore don't see any way your approach is going to work; on first view of a page there is no phase where all the components exist but they have not been rendered.

You might be able to get this approach working with Facelets instead of
JSP; Facelets always ensures that even on the first view of a page, the component tree is built first before rendering starts.

I can't for the moment think of any alternate approach that work work using JSP/JSF. You might want to check out the "role" features of the tomahawk components, though: this allows components to be disabled or not rendered depending upon whether a user is in a certain "role".


Regards,

Simon

Reply via email to