JSF index.xhtml and redirect to faces action
jsf, jsf-2, myfaces, redirect
Solution
You can use JSF `preRenderView` event to redirect to another page in following manner,
In your index.xhtml file
<!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">
<f:view>
<ui:insert name="metadata"/>
<f:event type="preRenderView" listener="#{yourBean.methodInManagedBean}" />
<h:body></h:body>
</f:view>
</html>
In managed bean, 1st way is
public class yourClass{
FacesContext fc = FacesContext.getCurrentInstance();
ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler)fc.getApplication().getNavigationHandler();
public void methodInManagedBean() throws IOException {
nav.performNavigation("list.do");//add your URL here, instead of list.do
}
}
or you can use 2nd way
public class yourClass{
public void methodInManagedBean() throws IOException {
FacesContext.getCurrentInstance().getExternalContext().redirect("list.do");//add your URL here, instead of list.do
}
}
Problem
I think its a good practice to have an index page (in my case index.xhtml). I want to pass some action on index page (for example in struts:`<c:redirect url="list.do" />` and I go to struts action class without any links and buttons) I know if I want to use navigation I should use commandLink-s or buttons). I can write `<h:commandButton>` with onclick javascript function, but I don't feel this is the best option. I'm totally new to JSF (using JSF 2.0) and I need your advice. What are the best practices for redirecting from index page to an action in controller? ///new version ``` <!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"> <f:view> <ui:insert name="metadata"/> <f:viewParam name="action" value="listItems.xtml"/> <f:event type="preRenderView" listener="#{yourBean.methodInManagedBean}" /> <h:body></h:body> </f:view> </html> public class ForwardBean { private String action; // getter, setter public void navigate(PhaseEvent event) { FacesContext facesContext = FacesContext.getCurrentInstance(); String outcome = action; facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome); } } ```