Search code examples
jsfjsf-2faces-config

navigation rule description not functioning properly in faces-config.xml


Any reason why the displaypage.xhtml does not redirect to the frontpage.xhtml when the "GoBack" button is hit? The browser redirects from the frontpage.xhtml to the displaypage.xhtml but not the other way round.

Thanks

frontpage.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

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

<ui:composition template="WEB-INF/templates/origin.xhtml">
    <ui:define name="content">
        <f:view>
            <h:form>
                <h:panelGrid>
                    <h:inputText value="#{user.name}" required = "true"/>
                </h:panelGrid>
                <h:commandButton

                    action="#{user.testcase2()}"
                    value="Search"></h:commandButton>
            </h:form>
            </f:view>


    </ui:define>
</ui:composition>
</html>

displaypage.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

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

<ui:composition template="/WEB-INF/templates/origin.xhtml">
    <ui:define name="content">
       <h:panelGrid>
        <h:outputText value="#{user.testclass.inputName}"/>
        <h:commandButton id="back" value="GoBack" action="frontpage"/>
       </h:panelGrid>
    </ui:define>
</ui:composition>
</html>

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

    <navigation-rule>
        <from-view-id>/frontpage.xhtml</from-view-id>
        <navigation-case>
            <from-action>#{user.testcase2()}</from-action>
            <from-outcome>test2</from-outcome>
           <to-view-id>/displaypage.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
         </navigation-rule>
   <navigation-rule>
    <from-view-id>/displaypage.xhtml</from-view-id>
            <navigation-case>
                <from-outcome>frontpage</from-outcome>
                <to-view-id>/frontpage.xhtml</to-view-id>
                <redirect/>
        </navigation-case>
    </navigation-rule>
</faces-config>

Solution

  • The <h:commandButton> tag must be covered by <h:form> tag to be active, and especially if the action attribute of <h:commandButton> contain a dynamic navigation ( e.g: action=#{user.testcase2()} ) .

    Else, if this last tag has just a static navigation, (string e.g: action="frontpage" ), then just use the <h:button> as M. @BalusC said, because it doesn't support dynamic navigation.