JsfGetRequests

From MPDLMediaWiki
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();
       
   }