CommandButton open new tab with FlashScope parameters

jsf, jsf-2

Solution

Use `target="_blank"` on the form to tell the browser that the synchronous response of the form should be presented in a new (blank) tab/window. You only need to turn off ajax behaviour of the `<p:commandButton>` in order to make it a synchronous request.

<h:form target="_blank">
  <p:commandButton value="open new tab" action="#{myBean.newTab}" ajax="false" />
</h:form>

No changes are necessary in the backing beans, it'll just work as you intented. I would only recommend to use POST-Redirect-GET pattern in the action method.

return "otherView?faces-redirect=true";

Otherwise the new tab would show the URL of the originating page and a F5 would re-invoke the POST. Also, this way the flash scope is also really used as it is been designed for (if you didn't redirect, just storing in request scope was been sufficient).

Update: as per the comments, the view scoped bean in the initial tab/window get killed this way. by returning a `String` navigation case outcome. That's right, if you'd like to keep the view scoped bean alive, replace the navigation case by a `Faces#redirect()` call (assuming that it's indeed OmniFaces which you're using there for `Faces#setFlashAttribute()`). You only need to set `Flash#setRedirect()` to `true` beforehand to instruct the flash scope that a redirect will occur.

public void newTab() throws IOException {
    Faces.setFlashAttribute("foo", bar); 
    Faces.getFlash().setRedirect(true);
    Faces.redirect("otherView.xhtml");
}

Problem

How can I open new tab when user clicks `p:commandButton`? I also want to pass some parameters to new page using FlashScope. Here's the code: ``` <h:form> <p:commandButton value="open new tab" action="#{myBean.newTab}"/> </h:form> public String newTab() { Faces.setFlashAttribute("foo", bar); return "otherView"; } ``` On the otherView page I use `f:event type="preRenderView"` to read Flash parameters. Two notes: - I need to use FlashScope, not URL parameters. - If possible, I don't want to change `newTab()` and `preRenderView()` methods. Thanks for help

Original source

Related problems