I have a problem with the h:messages tag in JSF that simply does not show any messages. In the Glassfish log are no errors when I click the button. The setup is as follows:
test.xhtml:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:j="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</h:head>
<h:body>
<h:messages globalOnly="true"/>
<h:form id="loginform">
<p:commandButton id="testButton" value="Test"
action="#{loginSessionBean.test()}" />
</h:form>
</h:body>
</html>
With The SessionScopedBean:
@ManagedBean
@SessionScoped
public class LoginSessionBean implements Serializable {
private static final long serialVersionUID = 1L;
...
public String test(){
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Test!", null));
return "";
}
You're sending an ajax request with PrimeFaces
<p:commandButton>
. Ajax requests have by default no form of feedback (unless PrimeFaces'autoUpdate="true"
is been used somewhere). You should be explicitly specifying parts of the view which you'd like to update on ajax response.One way is specifying the
update
attribute on<p:commandButton>
to point to the client ID of the<h:messages>
component.Another way is to replace it by PrimeFaces
<p:messages>
which has anautoUpdate
attribute for the purpose of automatic update on ajax response.A completely different alternative is to turn off ajax by adding
ajax="false"
attribute to the button, this way a synchronous postback will be performed which effectively results in a full page update, exactly like as how the standard JSF<h:commandButton>
behaves when used without<f:ajax>
.See also: