Hi Nicu, I haven't got time to look at this closely, but IMO siomething like this is definitely needed in MyFaces. A user with multiple windows is certainly going to have trouble at the moment.
I think a modification to the view pool to include a "window id" (or "frame id") is definitely a good idea. The second part of the problem still remains: how to associate a different id with each window/frame. Checking CommandLink components for a "target" attribute is clever; it doesn't solve all the cases but does solve some. Regards, Simon On Tue, 2007-12-18 at 19:07 +0200, Nicu Mercioiu wrote: > Hi, > > There is a problem in JSF when more than one window are opened > in an application. > There are only a maximum number of NUMBER_OF_VIEWS_IN_SESSION view > states saved at one moment (when server side state saving is enabled). > If you have 2 windows opened and you navigate on one of them for > NUMBER_OF_VIEWS_IN_SESSION times, you will lose the other window's > state. > > I've been facing this problem while developing a project so I've > implemented a solution for it. > > The solution is having a number of view states saved for each > opened window at one moment. > For determining when a new window (frame) is opened, the target of the > submitting component (or its enclosing form) is used. > This is obtained in the HtmlLinkRendererBase's and > HtmlButtonRendererBase's decode methods and it is set in the > RequestMap. > Using the "submitted" target, the JspStateManagerImpl figures out > whether a new frame was opened. > If so, a new frame id is generated. > In the renderResponse phase, the frameId is encoded in the > javax.faces.ViewState field > and is used along with the viewId to save the state in a > SerializedViewCollection. > In the restore view phase the frameId is decoded from the > javax.faces.ViewState field > and is used along with the viewId to restore the corresponding state > from the SerializedViewCollection. > > In SerializedViewCollection instead of a list of recently used > views, now a list is kept for each frameId. > The following context params are defined for configuring this. > NUMBER_OF_FRAMES_IN_SESSION (max frames stored) > NUMBER_OF_VIEWS_IN_FRAME (max views stored per frame) > These replace the old: NUMBER_OF_VIEWS_IN_SESSION context-param. > > > What is your opinion on this solution? > > Of course this solution only works with MyFaces Tomahawk's > commandLink and commandButton. > Ohter component sets that do not use a custom stateManager might use > this feature > if they will just modify the renderers of command components to set > the target attribute in the requestMap. > > An extra feature would be to enable this for outputLinks (plain > old links) and for JS (openWindow). > The solution for this is quite simple, just add a GET parameter named > 'target' and set the value the same as the target attribute. > In the JspStateManagerImpl this value is obtained from the > requestParameterMap and used the same as in the other case. > Do you think this would be useful too? > > Regards, > Nicu
