[ 
https://issues.apache.org/jira/browse/MYFACES-3881?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13968186#comment-13968186
 ] 

Rene O commented on MYFACES-3881:
---------------------------------

I have found a workaround for my current usecase:
My idea is similar to client mode (javax.faces.CLIENT_WINDOW_MODE -> client), 
but doesn't use requestparam 'mfRid'.

Implementation:
- using of deltaspikes @WindowScoped for my beans (@ViewScoped doesn't work 
here)
- using of special viewAction

{code:title=web.xml}
        <context-param>
                <param-name>javax.faces.CLIENT_WINDOW_MODE</param-name>
                <param-value>url</param-value>
        </context-param>
{code}

{code:title=mypage.xhtml}
        <f:metadata>
                <f:viewAction action="#{initCtr.initApplication()}"/>
        </f:metadata>
{code}  
        
        
{code:title=InitCtr.java}
        public void initApplication(){
                FacesContext ctx = FacesContext.getCurrentInstance();
                ExternalContext exCtx = ctx.getExternalContext();

                String windowid = exCtx.getClientWindow().getId();
                System.out.println("windowid: "+windowid);

                //get current requestparams
                Map<String,String> reqparams = exCtx.getRequestParameterMap();

                //only redirect if no jfwid exists yet or an old unknown jfwid 
is used within the browser
                if(!reqparams.containsKey("jfwid") || 
!windowid.equals(reqparams.get("jfwid"))){
                        try {
                                StringBuilder sb = new StringBuilder();
                                sb.append("?");

                                //append all requestparams
                                for (Map.Entry<String,String> entry : 
reqparams.entrySet()) {
                                        
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                                }

                                //append jfwid to be able to decide if a new 
'windowsession' is needed or not
                                
sb.append("jfwid=").append(exCtx.getClientWindow().getId());

                                //redirect to same page with new added jfwid 
param
                                
exCtx.redirect(exCtx.getRequestContextPath()+exCtx.getRequestServletPath()+sb.toString());
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
        }
{code}
A new showcase (jsftest22_new.zip) is attached: 
http://localhost:8080/jsftest22/mypage.jsf

> CLIENT_WINDOW_MODE generates new windowid even if one exists
> ------------------------------------------------------------
>
>                 Key: MYFACES-3881
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3881
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 2.2.2
>         Environment: java 7, tomcat 7.0.50
>            Reporter: Rene O
>         Attachments: jsftest22.zip, jsftest22_new.zip
>
>
> If you use @ViewScoped beans and activate CLIENT_WINDOW_MODE (url or client) 
> a page refresh generates a new windowid although the application in the 
> current browser window already has a windowid.
> I think a new windowid should only be generated, if no windowid exists, e.g. 
> open new window or tab with the same url.
> <context-param>
>    <param-name>javax.faces.CLIENT_WINDOW_MODE</param-name>
>    <param-value>url</param-value>
>    <!--client doesn't work too-->
> </context-param>
> A testcase is attached.
> call url: http://localhost:8080/jsftest22/mypage.jsf
> Fill some values into field
> Press F5 to refresh the page
> => new windowid is generated => inputdata is lost, because a new @ViewScoped 
> bean was created



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to