We have done a similiar thing, there is a custom navigation handler which manages the navigation in our application. There are special action names and for the back operation the name is "@back@", the navigation handler also uses a navigation data holder, which tracks the pages visited using a stack. When a return action named @back@ is realized, the last view stored is popped from stack and navigation occurs afterwards.
regards,
Cagatay Civici
Hi,
I am thinking of providing a 'back' button on all my pages. Below is a sketch on how I intended to do it, but before embarking on it I would like to know whether anybody has done similar and to hear from you Gurus whether my approach is workable.
1) I have a stack<backingBean, nagivgationResult> to store the pages being visited and the associated backing bean.
The stack will be limited to store (say) the last 10 pages visited, so it won't grow continuously. I think a circular list could probably be used for this.
2) A phase listener will push the current page's backing bean and navigation to the stack; it will happen at the AFTER RENDER_RESPONSE phase.
3) The 'back' button will pop the stack – restores the backing bean and navigates back to the page concerned.
4) Some pages can be marked to not to participate in this scheme.
I am assuming a) the beans are in request scope, b) there is only one backing bean per page.
For session scope beans I would have to serialize the bean.
Please – any comments?
Best regards,
Yee
// getting an restoring a manage bean
public static Object getManagedBean(String beanName) {
Object o = getValueBinding( "#{" + beanName + "}" ).getValue(FacesContext.getCurrentInstance());
return o;
}
public static void setManageBean(String beanName, Object bean) {
getValueBinding( "#{" + beanName + "}" ).setValue(FacesContext.getCurrentInstance(), bean);
}
// some helper methods
private static Application getApplication() {
ApplicationFactory appFactory = (ApplicationFactory)FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
return appFactory.getApplication();
}
private static ValueBinding getValueBinding(String el) {
return getApplication().createValueBinding(el);
}
private static Object getElValue(String el) {
return getValueBinding(el).getValue(FacesContext.getCurrentInstance());
}