h: messages не отображает сообщения при нажатии кнопки p: commandButton


У меня есть проблема с тегом h:messages в JSF, который просто не показывает никаких сообщений. В журнале Glassfish нет ошибок, когда я нажимаю на кнопку. Настройка выглядит следующим образом:

Тест.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>

С Помощью 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 "";
}
1 8

1 ответ:

Вы посылаете запрос ajax с примерами <p:commandButton>. Ajax-запросы по умолчанию не имеют обратной связи (если только где-то не используется PrimeFaces' autoUpdate="true"). Вы должны явно указать части представления,которые вы хотели бы обновить в ответе ajax.

Одним из способов является указание атрибута update на <p:commandButton>, указывающего на идентификатор клиента компонента <h:messages>.

<h:messages id="messages" ... />
<h:form>         
    <p:commandButton ... update=":messages" />
</h:form>

Другой способ-заменить его примитивами <p:messages>, которые имеют атрибут autoUpdate с целью автоматическое обновление ответа ajax.

<p:messages ... autoUpdate="true" />
<h:form>         
    <p:commandButton ... />
</h:form>

Совершенно другой альтернативой является отключение ajax путем добавления атрибута ajax="false" к кнопке, таким образом будет выполняться синхронная обратная передача, которая эффективно приводит к полному обновлению страницы, точно так же, как стандартный JSF <h:commandButton> ведет себя при использовании без <f:ajax>.

<h:messages ... />
<h:form>         
    <p:commandButton ... ajax="false" />
</h:form>

См. также: