0

does anybody know how to use RequestScoped bean together with rendered attribute in jsf? The rendered attribute is evaluated before applyValues phase and therefore is not correctly evaluated. I don't want to preserve any state. The example could be an outputPanel with a datatable and a button. The datatable gets a list of values. The wrapping outputPanel has the rendered attribute like:

<p:outputPanel rendered="#{not empty requestScopedBean.dataList}">
    <p:datatable value="#{requestScopedBean.dataList}">
        ...
    </p:datatable>

    <p:commandButton action="#{requestScopedBean.someAction}" />
</p:outputPanel>

After loading the page and clicking on the button, nothing happens, because the view is restored and expressions are evaluated - the bean does have an empty datalist and therefore the panel should not be rendered. This causes that the action method is not even called - because the button doesn't exist.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
Filip Majernik
  • 7,700
  • 13
  • 45
  • 53
  • This is not the first time that one has to remove [java] tag from your [jsf] question. Can you please take that as a hint to not add the [java] tag to a future [jsf] question anymore? Thank you :) – BalusC Oct 01 '15 at 11:54

1 Answers1

2

If you're not interested in having a filled data table at that moment, just add an extra check in rendered attribute if the command button of interest has been invoked. You can do that by checking the presence of button's client ID in request parameter map.

<p:outputPanel rendered="#{not empty requestScopedBean.dataList or not empty param[someButton.clientId]}">
    ...

    <p:commandButton binding="#{someButton}" ... />
</p:outputPanel>

See also:

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • Yes. This does the trick. But on a page with more controls this would get pretty huge and unreadeable, not to mention hard to maintain. Isn't it then a rule that properties of RequestScoped beans should never be used in rendered, disabled, etc... attributes? – Filip Majernik Oct 01 '15 at 13:43
  • Nope, it's part of JSF's safeguard against tampered requests. The technical correct solution is using a view scoped bean instead of a request scoped bean. – BalusC Oct 01 '15 at 13:51
  • What is then the correct way to have a search page with search results that I don't want to ever expire? I mean, to have search results displayed somewhere and update a block of page on click on one of the results. I don't need to preserve the list of results anywhere on server, they are displayed just once. And on click on one of them I would like to load additional info and show in a different block of a page. – Filip Majernik Oct 01 '15 at 14:54
  • 1
    Don't use a stateful view then. Conditionally show/hide at client level. E.g. `
    ` with `.hidden { display: none; }`.
    – BalusC Oct 01 '15 at 15:05