I want to present validation messages and messages from backing bean in
component. In my JSF page I have following dialog defined:
You can use the visible
attribute of <p:dialog>
to specify whether the dialog should show up by default or not. You can check by FacesContext#isValidationFailed() if there's a validation failure or not.
So, in a nutshell:
<p:dialog id="msgDialog" widgetVar="messageDialog" modal="true" appendToBody="true"
visible="#{facesContext.validationFailed}">
<p:messages id="messagesInDialog" />
<p:button value="OK" onclick="messageDialog.hide()" />
</p:dialog>
(note that I simplified the unnecessary h:form
and p:commandButton
by a p:button
)
Which is then to be updated by:
<p:commandButton value="submit" update=":msgDialog" />
Or by just placing it inside a <p:outputPanel autoUpdate="true">
so that it auto-updates itself on every ajax request without the need to specify it in every update
attribute:
<p:outputPanel autoUpdate="true">
<p:dialog id="msgDialog" widgetVar="messageDialog" modal="true" appendToBody="true"
visible="#{facesContext.validationFailed}">
<p:messages id="messagesInDialog" />
<p:button value="OK" onclick="messageDialog.hide()" />
</p:dialog>
</p:outputPanel>
Unrelated to the concrete problem, to cover non-validation messages, such as those global messages which you add in the action method, rather check instead if FacesContext#getMessageList() is not empty.
<p:dialog ... visible="#{not empty facesContext.messageList}">
This will then show the dialog when there is any message. This way that RequestContext#execute()
call is unnecessary.