Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как лучше использовать JSF h:messages?

Автор вопроса: gekrishОтветов: 3

Моя цель - использовать h:messages для передачи пользователю сообщений об ошибках и подтверждениях. Стили CSS для отображения этих двух разных сообщений различны. На самом деле я хотел бы использовать изображение рядом с сообщением подтверждения.

e.g. :

<tr>
    <td>
        <img/>
    </td>
    <td>
        <h:msg>
    </td>
</tr>

Поэтому я попытался добавить сообщения в контекст Faces на основе двух разных идентификаторов клиентов.

<tr>
    <td height="5">
        <h:messages style="color:darkred" id="error_message" />
    </td>
</tr>

<tr>
    <td width="89%" class="InfoMsg" align="center">
        <h:messages id="confirm_message" />
    </td>
</tr>

И слой Java:

FacesMessage facesMessage = new FacesMessage(Constants.saveMessageConfirm);

FacesContext.getCurrentInstance().addMessage(Constants.STATIC_CONFIRM_MSG_CLIENT_ID, facesMessage);

Но даже если я добавляю сообщения в clientId confirm_message - и только в confirm_message - а не в error_message - сообщение отображается дважды в двух разных стилях (см. HTML выше).

2 вопроса:

  1. В чем проблема?

  2. Если я хочу показать изображение внутри td во втором tr и условно показать этот второй tr при наличии подтверждающих сообщений - как лучше всего?

Спасибо

jsf

Ответы

Ответ 1 · рейтинг 46 · BalusC

h:messages отображает все сообщения, а также те, которые уже отображаются в h:message на странице. Однако вы можете настроить отображение только сообщений с идентификатором клиента null, используя globalOnly="true".

<h:messages globalOnly="true" />

Вы также можете придать сообщению другой стиль в зависимости от FacesMessage.Severity:

<h:messages infoClass="info" errorClass="error" />

например, с этим CSS, который скрывает INFO сообщения и создает ERROR сообщения красного цвета:

.info {
     display: none;
}
.error {
     color: red;
}

Вы можете использовать redisplay="false", чтобы указать ему не отображать уже отображаемые сообщения через e.e. <h:message>.

<h:messages redisplay="false" />

Вам нужно только убедиться, что он размещен в дереве компонентов после всех остальных компонентов сообщения. При необходимости вы можете использовать CSS, чтобы переместить его куда-нибудь вверх.

Просто чтобы убедиться,

facesContext.addMessage("clientId",  facesMessage);

это прикрепит данное сообщение к <h:message for="clientId">, а не к <h:messages id="clientId">, как вы ожидаете.

Ответ 2 · рейтинг 5 · Alex Larzelere

изменить <h:messages> на <h:message>

<h:messages отображает все сообщения для текущего контекста, <h:message> отображает конкретное сообщение.

и я полагаю, что вы хотите изменить id на for, чтобы дать ему цель, но я могу ошибаться.

Ответ 3 · рейтинг 1 · sree

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

<!--Displays only Error Messages-->
<h:messages styleClass="mystyle" layout="list" id="msg1" infoStyle="display:none"       warnStyle="display:none"></h:messages>

<!--Displays only Warning Messages-->
<h:messages styleClass="messages" layout="list" id="msg2" errorStyle="display:none"     infoStyle="display:none"></h:messages>

<!--Displays only Info Messages-->
<h:messages styleClass="messages" layout="list" id="msg2" errorStyle="display:none"     warnStyle="display:none"></h:messages>

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы