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

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

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

Итак, я попытался добавить сообщения в контекст 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);

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

2 Вопросы:

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

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

Спасибо,

Ответы

Ответ 1

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

<h:messages globalOnly="true" />

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

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

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

.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

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

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

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

Ответ 3

У нас могут быть разные типы 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>