In JSF navigation rule, you may encounter a situation where two separate actions return a same “outcome” in a single page. In this case, you can use “from-action” element to differentiate the two navigation cases. See following example :

1. Managed Bean

A managed bean, with two actions which return a same outcome – “success”.

PageController.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
 
@ManagedBean
@SessionScoped
public class PageController implements Serializable {
 
	private static final long serialVersionUID = 1L;
 
	public String processPage1(){
		return "success";
	}
 
	public String processPage2(){
		return "success";
	}
}

2. JSF Page

A JSF page, with 2 buttons linked to the above PageController‘s methods.

start.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!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:h="http://java.sun.com/jsf/html">
 
    <h:body>
    <h2>This is start.xhtml</h2>
 
      <h:form>
    	<h:commandButton action="#{pageController.processPage1}" value="Page1" />
    	<h:commandButton action="#{pageController.processPage2}" value="Page2" />
      </h:form>
 
    </h:body>
</html>

Both actions will return the same “success” outcome, how JSF determine where to go?

3. Navigation Rule

To solve it, defines following navigation rules in the “faces-config.xml“, and use the “from-action” element to differentiate the same “outcome” navigation cases.

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>start.xhtml</from-view-id>
	<navigation-case>
		<from-action>#{pageController.processPage1}</from-action>
		<from-outcome>success</from-outcome>
		<to-view-id>page1.xhtml</to-view-id>
	</navigation-case>
	<navigation-case>
		<from-action>#{pageController.processPage2}</from-action>
		<from-outcome>success</from-outcome>
		<to-view-id>page2.xhtml</to-view-id>
	</navigation-case>
    </navigation-rule>	
</faces-config>

4. Demo

In above case, the button works like this :

  1. When button with action=”#{pageController.processPage1}” is clicked, it will return the “success” outcome and move to page1.xhtml
  2. When button with action=”#{pageController.processPage2}” is clicked, it will return the “success” outcome and move to page2.xhtml

Download Source Code

Note : You can find more similar articles at - JSF 2 Tutorials