[ 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)