You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by Nicu Mercioiu <ir...@gmail.com> on 2007/12/18 18:07:28 UTC

Server state saving and multiple frames

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

Re: Server state saving and multiple frames

Posted by Cristi Toth <cr...@gmail.com>.
Hi,

anyone is invited to contribute with ideas of course,
but I still don't understand what this (multiple-frames state saving) has to
do with dialog handling and conversations!?

On Dec 20, 2007 9:13 AM, Martin Marinschek <ma...@gmail.com>
wrote:

> Hi Nicu,
>
> we should include Mario in this discussion - he implemented a solution
> for this in Orchestra. Also, how about Trinidad, in Trinidad there is
> dialog handling as well, how is this done?
>
> regards,
>
> Martin
>
> On 12/19/07, simon <si...@chello.at> wrote:
> > 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
> >
> >
>
>
> --
>
> http://www.irian.at
>
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
>



-- 
Cristi Toth

-------------
Codebeat
www.codebeat.ro

Re: Server state saving and multiple frames

Posted by Martin Marinschek <ma...@gmail.com>.
Hi Nicu,

we should include Mario in this discussion - he implemented a solution
for this in Orchestra. Also, how about Trinidad, in Trinidad there is
dialog handling as well, how is this done?

regards,

Martin

On 12/19/07, simon <si...@chello.at> wrote:
> 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
>
>


-- 

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Re: Server state saving and multiple frames

Posted by simon <si...@chello.at>.
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