Messages components are used to display FacesMessages.
<div class="card">
    <p:tooltip/>
    <h:form>
        <p:messages id="messages" showDetail="true" closable="true" />
        <h5 class="mt-0">Severities</h5>
        <p:commandButton value="Info" action="#{messagesView.info}" styleClass="mr-2" update="@form" />
        <p:commandButton value="Warn" action="#{messagesView.warn}" styleClass="mr-2 ui-button-warning" update="@form" />
        <p:commandButton value="Error" action="#{messagesView.error}" styleClass="mr-2 ui-button-danger" update="@form" />
        <p:commandButton value="Fatal" action="#{messagesView.fatal}" styleClass="mr-2 ui-button-help" update="@form" />
    </h:form>            
</div>
<div class="card">
    <h:form>
        <h5>Validation</h5>
        <h:panelGrid id="grid" columns="3" cellpadding="7">
            <p:outputLabel for="@next" value="Default:"/>
            <p:inputText id="default" required="true"/>
            <p:message for="@previous"/>
            <p:outputLabel for="@next" value="Text:"/>
            <p:inputText id="txt" required="true"/>
            <p:message for="@previous" display="text"/>
            <p:outputLabel for="@next" value="Icon:"/>
            <p:inputText id="icon" required="true"/>
            <p:message for="@previous" display="icon"/>
            <p:outputLabel for="@next" value="Tooltip:"/>
            <p:inputText id="tt" required="true"/>
            <p:message for="@previous" display="tooltip"/>
        </h:panelGrid>
        <p:commandButton id="submitButton" value="Submit" update="grid" styleClass="mt-3" />
    </h:form>
</div>
package org.primefaces.showcase.view.message;
import java.io.Serializable;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
@Named
@ViewScoped
public class MessagesView implements Serializable {
    private boolean closed;
    public void info() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Info", "Message Content"));
    }
    public void warn() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Warning", "Message Content"));
    }
    public void error() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Message Content."));
    }
    public void fatal() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Fatal", "Message Content."));
    }
    public void onClose() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Message is closed", null));
        closed = true;
    }
    public boolean isClosed() {
        return closed;
    }
}