JSF adding query parameters

msharma picture msharma · Dec 31, 2009 · Viewed 14k times · Source

I am using JSF and I have a backing bean method which does some processing and sets a variable 'outcome' which then decides the next page to navigate to depending on the faces-config.xml navigation rules.

What I want to do is add parameters to the URL (in the backing bean?) when the next page is navigated to. However in the Handler where the backing bean method is, there is no reference to the HttpRequest object. This is an existing handler which has been around for a long time, so I am wondering how I can do

request.setAttribute("name", value);

Is there a different approach available for JSF? Any help much appreciated.


HI BalusC,

I am trying to implement what you explained below, however I am running into a problem. This is what I have:

StringBuffer url = ( (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURL();
    url.append( "?serialNumber=");
    url.append(regBean.getSerialNumber());
try{                     FacesContext.getCurrentInstance().getExternalContext().redirect(url.toString());
}catch (Exception ex){
    ex.printStackTrace();
}

There is no exception generated however I get a 500 Http error "the server has encountered an unknown error." The log shows a little more detail but not enough to be helpful:

ERROR [lifecycle] JSF1054: (Phase ID: INVOKE_APPLICATION 5, View ID: /registration/productValidation.jsp) Exception thrown during phase execution: javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@591dae] 11:19:12,186 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:421) at com.sun.faces.application.NavigationHandlerImpl.handleNavigation(NavigationHandlerImpl.java:181) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:130) at javax.faces.component.UICommand.broadcast(UICommand.java:387) at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321) at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253) at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)

Any ideas at all will be very much appreciated. Thanks!


Ok, thanks for your comments, I changed some stuff around and now I have:

FacesContext.getCurrentInstance().getExternalContext().redirect("mypage.jsp?serialNumber=555555");

Upon debugging I can see that the redirect is working since on mypage.htm I am displaying some headers from a resourcebundle (properties file) so when it tried to get the header to display it is encountering a NullPointer on the line below:

FacesContext context = FacesContext.getCurrentInstance();

context is null, so the log shows NullPointer error but the url of the page is correct I can see the address bar showing http://..../mypage.jsp?serialNum=5555 just as expected! It appears its having trouble just displaying the contents of the page. So close yet so far ;-(

Answer

BalusC picture BalusC · Dec 31, 2009

You need to fire ExternalContext#redirect() in the bean action method yourself.

public void submit() {
    String url = "page.jsp?name1=value1&name2=value2";
    FacesContext.getCurrentInstance().getExternalContext().redirect(url);
}

If your IDE validator is jerking about the void action method, then you can just ignore it or declare it back to String and put return null; at end of method block.

If you want to set the particular parameters back in some bean in the subsequent request, then you can set them as managed properties in faces-config.xml by #{param.name1} and #{param.name2}.

That said, request attributes should not be confused with request parameters. The request attributes are attached to the current request in the server side only. They are in no way passed to the next request. There you use request parameters for which you can either attach to the redirect URL or include as hidden parameters in a POST form in the response page.

Further, it might be useful to know that you can get a handle of the HttpServletRequest in JSF by ExternalContext#getRequest(). You should however try to avoid to go that far with hauling the "raw" Servlet API from under the JSF hoods. Make use of JSF-provided facilities as many as possible.