The use of navigation cases in JSF is somewhat subjective. This article will briefly discuss the differences, advantages, and disadvantages between implicit vs explicit navigation

Explicit Navigation

Navigation prior to JSF 2.0 required the use of explicit navigation cases. This means you would have to place all navigation rules in a “faces-config.xml” file. Take for example the following navigation rule:

<navigation-rule> <from-view-id>step1.xhtml</from-view-id> <navigation-case> <from-outcome>goToStep2</from-outcome> <to-view-id>step2.xhtml</to-view-id> </navigation-case> </navigation-rule>

This example above could be used in JSF 1.2 to redirect from step1.xhtml to step2.xhtml. While the following implementation is simple, it fails to address many issues that can arise when developing larger applications.

What are the drawbacks of explicit navigation?

Changing of file names can result in outcomes going to pages that do not exist A larger overhead especially if your application has complex conditions. This is due to it having to parse the XML to match the result from the action method Using JSF 1.2 meant navigation rules use a POST for page to page navigation which makes for a horrible user experience. Pages would not be bookmarkable; thus have bad SEO. Note: JSF 2.0 you can specify the <redirect /> attribute to a navigation-case to force a page redirect.

What are the benefits?

Only one location to find all your rules for navigation; no hunting through backing beans. IDE has tools to draw the rules in a GUI. Gives you a visual of your available workflow.

Implicit Navigation

This advancement in JSF 2 made it so there was no need to declar navigation rules. Instead the outcome can be placed in the action attribute. JSF has the logic to find the correct view id. There are 2 ways to use implicit navigation.

Specifying a outcome in a JSF page

This solution is straight forward, you can specify the page name you wish to navigate to. The “xhtml” extension will automatically be appended.

<h:commandButton action="step2?faces-redirect=true" value="Navigate to step2.xhtml" />

Another option would be to use a h:link would use a get request to invoke a redirect

<h:link outcome="step2" value="navigate to step2"/>

Specifying a outcome in a Backing Bean

The JSF page calls a backing bean that has a outcome.

<h:commandButton action="#{backingBean.navigateStep2}" value="Navigate to step2.xhtml" />

Backing bean has a method which returns a string which is the outcome.

@ManagedBean @ViewScoped public class BackingBean implements Serializable { public String navigateStep2(){ return "step2?faces-redirect=true"; } }

What are the drawbacks of implicit navigation?

Your business objects / backing bean logic becomes tied together, and can get messy Moving pages around can cause a lot of maintenance to update implicit routes.

What are the benefits?