Seam, Richfaces and the Back-Button
israel.bgf Jul 29, 2009 10:28 AMHi, i'm having an strange issue with the back button. If i do a lot of post-backs using ajax components from richfaces, and go to another page (from a navigation rule/outcome), on that new page if i press the browser back-button the old page is "apparently" in a fresh state, but after the first post-back it retrieves its "true" state.
The same thing doesn't happen using plain JSF components. I did a test case to show it:
Ajax Page A
<?xml version="1.0" encoding="ISO-8859-1" ?> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j" xmlns:s="http://jboss.com/products/seam/taglib" template="/resources/facelets/templates/base.xhtml"> <a4j:outputPanel id="panel" ajaxRendered="true"> #{pageA.bigString == '' ? 'Empty string!' : 'Its a BIG! string!'} </a4j:outputPanel> <br/> <a4j:form id="formulario"> <h:outputText value="#{pageA.bigString}"/> <br/> <h:inputText value="#{pageA.value}"/> <a4j:commandButton value="Append" action="#{pageA.appendString}" reRender="formulario"/> </a4j:form> <br/> <a4j:form> <h:commandLink value="Go to page B" action="/pages/pageB.xhtml"/> </a4j:form> </ui:composition>
Normal Page A
<?xml version="1.0" encoding="ISO-8859-1" ?> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j" xmlns:s="http://jboss.com/products/seam/taglib" template="/resources/facelets/templates/base.xhtml"> #{pageA.bigString == '' ? 'Empty string!' : 'Its a BIG! string!'} <br/> <h:form id="formulario"> <h:outputText value="#{pageA.bigString}"/> <br/> <h:inputText value="#{pageA.value}"/> <h:commandButton value="Append" action="#{pageA.appendString}"/> </h:form> <br/> <h:form> <h:commandLink value="Go to page B" action="/pages/pageB.xhtml"/> </h:form> </ui:composition>
Page B (Just to transit)
<?xml version="1.0" encoding="ISO-8859-1" ?> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j" xmlns:s="http://jboss.com/products/seam/taglib" template="/resources/facelets/templates/base.xhtml"> Page B </ui:composition>
And the test backing bean:
package br.com.techpeople.template.view; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; @Name("pageA") @Scope(ScopeType.PAGE) public class PageA { private String bigString = ""; private String value; public void appendString(){ bigString += value; } public void setValue(String value) { this.value = value; } public String getValue() { return value; } public void setBigString(String bigString) { this.bigString = bigString; } public String getBigString() { return bigString; } }
The test is pretty simple, the backing bean just append the initial string. There is a different message if the bigString != null. After adding some strings, go to the next page, and after come back with the broser back-button. If you are using the "normal" page everthing works as expected, if you are using the ajax one the old page looks like a "new" one, but if you add a new string the page get the old state again.
It's a pretty simple test to do, just remember to replace the template attribute.
Is it a Seam bug, Richfaces bug, or is it an expected behavior? And how could i make my ajax application get the "normal" application behavior?
Thks,
Israel