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

Werner Punz edited comment on MYFACES-4229 at 6/11/18 7:18 AM:
---------------------------------------------------------------

Update.... the spec has slightly distributed info:

The full picture is:

If an {{<update>}} element is found in the response with an identifier 
containing {{javax.faces.ViewState}}:{{<update 
id="<VIEW_ROOT_CONTAINER_CLIENT_ID><SEP>javax.faces.ViewState<SEP><UNIQUE_PER_VIEW_NUMBER>">
 <![CDATA[...]]> </update>}}locate and update the submitting form's 
{{javax.faces.ViewState}} value with the {{CDATA}} contents from the response

Locate and update the {{javax.faces.ViewState}} value for all JSF forms covered 
in the {{render}} target list whose ID starts with the same 
<VIEW_ROOT_CONTAINER_CLIENT_ID> value.

 

I missed the first info originally. Yes indeed we have a regression here and 
the example is correct. a and b need to get the viewstate since both were 
submitting forms.

So ignore my original comment here. I will tackle the fix today in the evening 
after work.

 

I am still not convinced that even in the portlet case a dedicated update of 
just the render targets is correct, but I will raise a spec issue on that one.

 

 

 

 


was (Author: werpu):
Update.... the spec has slightly distributed info:

The full picture is:

If an {{<update>}} element is found in the response with an identifier 
containing {{javax.faces.ViewState}}:{{<update 
id="<VIEW_ROOT_CONTAINER_CLIENT_ID><SEP>javax.faces.ViewState<SEP><UNIQUE_PER_VIEW_NUMBER>">
 <![CDATA[...]]> </update>}}locate and update the submitting form's 
{{javax.faces.ViewState}} value with the {{CDATA}} contents from the response

Locate and update the {{javax.faces.ViewState}} value for all JSF forms covered 
in the {{render}} target list whose ID starts with the same 
<VIEW_ROOT_CONTAINER_CLIENT_ID> value.

 

I missed the first info originally. Yes indeed we have a regression here and 
the example is correct. a and b need to get the viewstate since both were 
submitting forms.

So ignore my original comment here. I will tackle the fix today in the evening 
after work.

 

 

 

 

> Regression in Spec Issue 790: Cross form submit
> -----------------------------------------------
>
>                 Key: MYFACES-4229
>                 URL: https://issues.apache.org/jira/browse/MYFACES-4229
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-372
>    Affects Versions: 2.3.1
>            Reporter: Eduardo Breijo
>            Assignee: Werner Punz
>            Priority: Major
>             Fix For: 2.3.2
>
>         Attachments: JSF23Spec790.war
>
>
> After releasing MyFaces 2.3.1, I noticed a regression in cross form submit 
> from Spec Issue 790: 
> [https://github.com/javaee/javaserverfaces-spec/issues/790]
> HTML sample code:
> {code:java}
> <h:form id="a"> 
> <h:outputText value="This is 'form a' " /> 
> <h:outputLabel for="input1" value="Enter a new value for input1: " /> 
> <h:inputText id="input1" value="#{simpleBean.input}" /> 
> <h:commandButton id="submitButton1" value="Click here to execute 'form a' and 
> 'form b' but re-render 'form b'"> 
> <f:ajax execute="a :b" render=":b" /> 
> </h:commandButton> 
> </h:form> 
> <h:form id="b"> 
> <h:outputText value="This is 'form b' " /> 
> <h:outputLabel for="input2" value="Enter a new value for input2: " /> 
> <h:inputText id="input2" value="#{simpleBean.input}" /> 
> <h:commandLink id="commandLink1" value="Click here to execute 'form a' and 
> 'form b'  but re-render 'form a'"> 
> <f:ajax execute="b :a" render=":a" /> 
> </h:commandLink> 
> </h:form>
> {code}
>  
> The issue is that on MyFaces 2.3.1 the hidden input javax.faces.ViewState is 
> being removed from form "b" after we submit form "a" and viceversa. As a 
> result, cross form submit is not working as expected, you either have to 
> refresh the page before executing submit on the second form or you have to 
> execute submit twice so the update is reflected in the other form.
> Rendered page on MyFaces 2.3.0
> {code:java}
> <form id="a" name="a" method="post" action="/JSF23Spec790/test1.xhtml" 
> enctype="application/x-www-form-urlencoded"> This is 'form a' 
> <label for="a:input1"> Enter a new value for input1: </label> 
> <input id="a:input1" name="a:input1" type="text" value="test"/> 
> <input id="a:submitButton1" name="a:submitButton1" type="submit" value="Click 
> here to execute 'form a' and 'form b' but re-render 'form b'" 
> onclick="jsf.util.chain(this, event,'jsf.ajax.request(this,event,{execute:\'a 
> b \',render:\'b \',\'javax.faces.behavior.event\':\'action\'})'); return 
> false;"/> 
> <input type="hidden" name="a_SUBMIT" value="1"/> 
> <input type="hidden" name="javax.faces.ViewState" 
> id="j_id__v_0:javax.faces.ViewState:1" 
> value="RjhDMEFGQUMwNDI4NTUwRDAwMDAwMDAx" autocomplete="off"/> 
> </form> 
> <form id="b" name="b" method="post" action="/JSF23Spec790/test1.xhtml" 
> enctype="application/x-www-form-urlencoded"> This is 'form b' 
> <label for="b:input2"> Enter a new value for input2: </label> 
> <input id="b:input2" name="b:input2" type="text" value="test"/> 
> <a href="#" onclick="jsf.util.chain(this, 
> event,'jsf.ajax.request(this,event,{execute:\'b a \',render:\'a 
> \',\'javax.faces.behavior.event\':\'action\'})'); return false;" 
> id="b:commandLink1" name="b:commandLink1"> Click here to execute 'form a' and 
> 'form b' but re-render 'form a' </a> 
> <input type="hidden" name="b_SUBMIT" value="1"/> 
> <input type="hidden" id="javax.faces.ViewState:0" 
> name="javax.faces.ViewState" value="RjhDMEFGQUMwNDI4NTUwRDAwMDAwMDAx"/> 
> </form>
> {code}
>  
> Rendered page on MyFaces 2.3.1
> {code:java}
> <form id="a" name="a" method="post" action="/JSF23Spec790/test1.xhtml" 
> enctype="application/x-www-form-urlencoded"> This is 'form a' 
> <label for="a:input1"> Enter a new value for input1: </label> 
> <input id="a:input1" name="a:input1" type="text" value="test"/> 
> <input id="a:submitButton1" name="a:submitButton1" type="submit" value="Click 
> here to execute 'form a' and 'form b' but re-render 'form b'" 
> onclick="jsf.util.chain(this, event,'jsf.ajax.request(this,event,{execute:\'a 
> b \',render:\'b \',\'javax.faces.behavior.event\':\'action\'})'); return 
> false;"/> 
> <input type="hidden" name="a_SUBMIT" value="1"/> 
> <input type="hidden" name="javax.faces.ViewState" 
> id="j_id__v_0:javax.faces.ViewState:1" 
> value="RjY3MjAyMTY3N0U2ODE3RDAwMDAwMDAx" autocomplete="off"/> 
> </form> 
> <form id="b" name="b" method="post" action="/JSF23Spec790/test1.xhtml" 
> enctype="application/x-www-form-urlencoded"> This is 'form b' 
> <label for="b:input2"> Enter a new value for input2: </label> 
> <input id="b:input2" name="b:input2" type="text" value="test"/> 
> <a href="#" onclick="jsf.util.chain(this, 
> event,'jsf.ajax.request(this,event,{execute:\'b a \',render:\'a 
> \',\'javax.faces.behavior.event\':\'action\'})'); return false;" 
> id="b:commandLink1" name="b:commandLink1"> Click here to execute 'form a' and 
> 'form b' but re-render 'form a' </a> 
> <input type="hidden" name="b_SUBMIT" value="1"/> 
> </form>
> {code}
>  
> I have provided a sample app that shows the issue when MyFaces 2.3.1 is used.
>  # Just deploy the app on Tomcat and drive a request to: 
> [http://localhost:8080/JSF23Spec790/test1.xhtml]
>  # Enter a text in input1 and click submit button next to the input. Check 
> the rendered page.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to