Yannick Le Teigner wrote:
Hello,

I am trying to remove as many beans as possible from the session scope, and I am facing some difficulties with drilldown pages.

Let's say I have a page listing some users in a dataTable. Clicking on a user (commandLink), will bring you to a page where you can edit some parameters about this user.

Up until today the selected user was placed in session scope.

Now, after changing the scope to request in faces-config, if I try to put the user in the request map during the INVOKE_APPLICATION phase (when the action of my commandLink is called), then another user (empty this one) gets created during the RENDER_RESPONSE phase. The edit page displays an empty user.

If I use the t:saveState component (putting one on the listing page, and one on the edit page), the one on the listing page is created empty, and it is re-created as empty on the edit page...

The code in the action of my commandLink is something along the lines:
FacesContext ctx = FacesContext.getCurrentInstance();
ctx.getExternalContext().getRequestMap().put("#{User}", new User(id));


Anyone knows the correct way of handling this?

<t:saveState> is the correct tag to use when you want to avoid session-scoped managed beans.

I don't know why you have that command-link code; nothing like this is necessary to use t:saveState. If you wish to preserve the state of an entire managed bean, then do:

Master page:
  <t:saveState value="#{myBackingBean}"/>

Detail page:
  <t:saveState value="#{myBackingBean}"/>

On first visit to the master page, there is no saved state to restore, so a default instance of that bean is created. When the page is serialized after rendering, the bean's state is stored.

When either the master or detail page is visited thereafter, the saved object is recreated from the saved state, and #{myBackingBean} is set to be a reference to the restored object.

You can also save just specific fields of a bean via:
  <t:saveState value="#{myBackingBean.someProperty}"/>

Regards,

Simon

Reply via email to