Как мне написать и настроить пользовательский фейслет для переопределения h: messages? - PullRequest
3 голосов
/ 09 августа 2011

Я сейчас переписываю сайт, который изначально был написан в Weblogic Beehive для JSF 2.0, и сталкиваюсь с проблемой, когда мне нужно получить сообщения, которые новый сайт генерирует, в формате, Точно соответствует выводу существующего сайта.

Я попытался использовать тег, который хорош, но стиль и логика существующей структуры сообщений не вписываются в этот вывод.

Есть ли в JSF опции, которые позволили бы мнесоздать собственный тег, который будет не только выводить сообщения, но и выполнять для них условную логику?

Например, я создавал FacesMessages со строкой итоговой и подробной информации, но форматом только старого сайта.отображает самое высокое резюме.Например, я добавляю 4 сообщения, каждое из которых имеет одинаковое сводное сообщение и разные детали.Я только хочу отобразить сводку с самой высокой серьезностью.

Кроме того, мне нужны сообщения, отображаемые и оформленные в виде блоков, а не каждое сообщение, а некоторые детали должны иметь условные классы CSS.

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Если вы используете JSF 2.x, вы можете перебрать цикл FacesContext#getMessageList(). Каждый предмет представляет собой FacesMessage, который в свою очередь имеет несколько добытчиков.

<ui:repeat value="#{facesContext.messageList}" var="facesMessage">
    Severity: #{facesMessage.severity}<br />
    Summary: #{facesMessage.summary}<br />
    Detail: #{facesMessage.detail}<br />
    <br />
</ui:repeat>

Это позволяет использовать более тонкую разметку HTML вокруг сообщений.

Если вы все еще используете JSF 1.x, в котором отсутствует этот метод в FacesContext, вам нужно сначала собрать FacesContext#getMessages() в List<FacesMessage> с помощью некоторого служебного компонента или даже EL функция:

List<FacesMessage> messageList = new ArrayList<FacesMessage>();
Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages();

while (messages.hasNext()) {
    messageList.add(messages.next());
}

Затем вы можете выполнить итерацию по этому messageList в своем представлении, используя <ui:repeat> таким же образом.

0 голосов
/ 15 августа 2011

Я закончил с этим на моей странице JSF (xhtml):

            <c:set var="messageList" value="#{facesContext.messageList}" />
            <c:set var="maxSev" value="#{facesContext.maximumSeverity.ordinal}" />
            <ui:repeat value="${messageList}" var="fm" >
                <c:choose>
                     <c:when test="${fm.severity.ordinal eq 0}">
                         <c:set var="summaryStyleClass" value="outcome"/>
                         <c:set var="detailStyleClass" value="outcome_details"/>
                     </c:when>
                     <c:when test="${fm.severity.ordinal eq 1}">
                         <c:set var="summaryStyleClass" value="warning_title"/>
                         <c:set var="detailStyleClass" value="warning"/>
                     </c:when>
                     <c:when test="${fm.severity.ordinal eq 2}">
                         <c:set var="summaryStyleClass" value="error_title"/>
                         <c:set var="detailStyleClass" value="error"/>
                     </c:when>
                     <c:when test="${fm.severity.ordinal eq 3}">
                         <c:set var="summaryStyleClass" value="fatal"/>
                         <c:set var="detailStyleClass" value="fatal_details"/>
                     </c:when>
                </c:choose>
            </ui:repeat>
            <div class="${detailStyleClass}" >
                 <div class="${summaryStyleClass}">
                        <ui:repeat value="${messageList}" var="fm" >
                             <c:choose>
                                 <c:when test="${fm.severity.ordinal eq maxSev}">
                                     ${fm.summary}
                                 </c:when>
                             </c:choose>
                        </ui:repeat>
                 </div>
                  <ul>
                     <ui:repeat value="${messageList}" var="msg">
                         <li><h:outputText value="${msg.detail}"/></li>
                     </ui:repeat>
                </ul>
            </div>

Я уверен, что здесь я нарушаю шаблон, но раздел, кажется, не работает, где он может разрешать переменные summaryStyleClass и detailStyleClass. Я перебираю их, потому что мне нужно стилизовать сообщение в зависимости от того, какое сообщение наивысшего уровня важности для страницы. Это обработанный вывод, который я получаю на странице в браузере:

            <div>
                 <div>Warning:</div>
                 <ul>
                      <li>Warning message.</li>
                </ul>
            </div>

Обратите внимание, нет стилей ...

...