JSF “from-action” navigation rule example
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 :
- When button with action=”#{pageController.processPage1}” is clicked, it will return the “success” outcome and move to page1.xhtml
- When button with action=”#{pageController.processPage2}” is clicked, it will return the “success” outcome and move to page2.xhtml
Download Source Code
Download it – JSF-2-From-Action-Navigation-Example.zip (11KB)
their is no jsp page named success so from java bean why should we return success directly we can return page1 for 1st method and page2 for 2nd method that easy
My jsf project should also support url something like https://www.mkyong.com/{param}, can you please help me how to handle this.
thank you for your explanation
i have one question please:
should we put session scope for managed bean ?
#{userMBean.processPage1}
success1
/page1.xhtml
#{userMBean.processPage2}
success2
/page2.xhtml
https://mkyong.com/jsf2/how-to-delete-row-in-jsf-datatable/
delete button is not working.
It is saying method not found.
Please send an e-mail to me regarding the solution to this problem.
Thank You
It would be nice to know what to return on failure. Is it “fail” or “failure”? Maybe the example could be updated to include that.:)
It does not really matter. It is up to you. You can return arbitrary string from managed bean, e.g. “hello”, “goodbye”. Then you put into navigation-rule something like:
Have one more look to the tutorial.
I have a problem. When I click button and I get the message on the same page:
Unable to find matching navigation case with from-view-id ‘/index.xhtml’ for action ‘#{pageController.processPage2}’ with outcome ‘success’
Sorry, I have problem in my code. Your code is ok.
Great Work..
Hi MKyong
Tutorial and the explanation is so good. But I am unable to find the replies for the questions posted. I think it will be very useful if discussions are answered.So who reads the tutorial will get perfect knowledge. One of the best tutorial i read…
Really Great Work….
Can i able to call a java method in navigation attribute?
Because i need to open a screen in the tab controller.
pls assist me..
Yes!! Just what I was looking for, it worked like a charm!!
Thanks so much, I just needed to set some values to some variables before navigating through pages.
I changed my code, and the very first time I tried it, it worked 🙂
Cheers!!
no navigation case match for view id action bean and outcome sucess
Thank you very much
Hi Mkyong,
I have following Dir structure
For admin pages
Hai mkyong,
when i clicked page1 it shows success and same t0 page2…how to get the content of the pages
not working … some problem in this…..
mr mkyong … i’m using from-action not form-action ….. but still it gives an error
Unable to find matching navigation case with from-view-id ‘/index.xhtml’ for action ‘#{myBean.move3}’ with outcome ‘success’
Hi,
I tried the example in Tomcat 7 but I got the error:
GRAVE: Critical error during deployment:
java.lang.LinkageError: loader constraint violation: when resolving interface method “javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;” the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, com/sun/faces/config/ConfigureListener, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature
HI DEAR MKYONG…
I HAVE THIS PROBLEM……I NEED THAT When button with action=”#{“”}” is clicked, it will return the “success” outcome and move to “”.xhtml BUT THE ECLIPSE THROWS ME THE NEXT EXCEPTION:
Caused by: javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: /ICEfacesPage1.xhtml @48,81 action=”#{usuario.getSubmit()}”: Método no hallado: [email protected]()
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:92)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
… 23 more
I NEED HELP MY FRIEND……
There is a very little mistake in this tutorial. The tag is called FROM-ACTION and not FORM-ACTION. And I’m just saying that because I liked very much this tutorial and would like to make it better.
Hi Cesar,
haha…my bad, a stupid typo mistake. Article is updated and truly appreciated your help.
Please change the link FROM-ACTION and not FORM-ACTION
https://mkyong.com/jsf2/jsf-form-action-navigation-rule-example/
Hi Yong,
When I am working in JSF2.x then why we are going navigation rule using from-action tag while we can handle this situation by return two different strings from both methods..e.g
public String processPage1(){
return “page1”;
}
public String processPage2(){
return “page2”;
}
I am just wondering why do we need this From-Action Navigation Rule.? Can this scenario be implemented by just using implicit navigation??
In a scenario when we have 2 buttons in the same Form and want to redirect it to 2 saparate page .. then why not have the 2 saparate from-outcome value as “success1” and “success2” and then have there to-viewId as page1.xhtml and “page2.xhtml”
Could any one explain why this from-action would be required??
Hi Mk
in one page i have 3 Links each links is in separate form, but putting this am not able to navigate from one page another after specifying the navigation rule, can you please tel me why is this not navigating..
navigation Rule as:-
/people/list.xhtml
res
/resource/list.xhtml
customers
/customers/list.xhtml
the same way i have written other links also,
This example is bull shit.