Uploaded image for project: 'MyFaces Core'
  1. MyFaces Core
  2. MYFACES-4229

Regression in Spec Issue 790: Cross form submit

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.3.1
    • 2.3.2
    • JSR-372
    • None

    Description

      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:

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

       

      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

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

       

      Rendered page on MyFaces 2.3.1

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

       

      I have provided a sample app that shows the issue when MyFaces 2.3.1 is used.

      1. Just deploy the app on Tomcat and drive a request to: http://localhost:8080/JSF23Spec790/test1.xhtml
      2. Enter a text in input1 and click submit button next to the input. Check the rendered page.

      Attachments

        1. JSF23Spec790.war
          7.98 MB
          Eduardo Breijo

        Activity

          People

            werpu Werner Punz
            eduardobreijo Eduardo Breijo
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: