JsfGetRequests
Jump to navigation
Jump to search
The following steps have to be taken to make a JSF page basically RESTful, that is
- calling the page via a HTTP GET request is possible
- modifying the parameters in the URL is possible
- bookmarking this page is possible
What this procedure does not change is the behaviour of the JSF links. This means that a "Open link in a new window" is still not possible.
Usually, no changes in the JSPs/JSPFs are needed. Assuming you have the following
- a source page with a form
- a java bean for the source page containing an action method
- a target page
- a java bean for the target page containing an action method
- a session- or request-scoped backing bean holding the parameters
Modify source bean action method to evaluate parameters and redirect to target page[edit]
// action method invoked by action link
public String doSomething()
{
// some parameters
String foo = this.fooInput.getSubmittedValue();
boolean bar = "true".equals(this.barInput.getSubmittedValue());
// change from
// return this.getTargetBean().doMore();
// to
FacesContext
.getCurrentInstance()
.getExternalContext()
.redirect("myTargetPage.jsp?foo=" + urlEscape(foo) + "&bar=" + bar);
return "";
}
Define parameters in target page bean[edit]
This can look something like this:
public class MyPage extends AbstractPageBean
{
//...
public final static String URL_PARAM_FOO = "foo";
public final static String URL_PARAM_BAR = "bar";
//...
}
Catch Parameters in target page bean init method , add to session/request bean and execute action method[edit]
Like this:
public void init()
{
// Perform initializations inherited from our superclass
super.init();
//...
// get http request
HttpServletRequest request = (HttpServletRequest)FacesContext
.getCurrentInstance().getExternalContext().getRequest();
// get parameters
String foo = request.getParameter(targetPage.URL_PARAM_FOO);
boolean bar = ("true".equals(request.getParameter(targetPage.URL_PARAM_BAR)));
// fill backing bean
mySessionBean.setFoo(foo);
mySessionBean.setBar(bar);
//...
// call action method
this.processForm();
}