簡體   English   中英

JSF 2.0定制消息

[英]JSF 2.0 custom messages

我正在使用JSF 2.0。 我正在使用

<h:messages>

標簽以呈現錯誤消息。 我可以使用CSS對消息進行一些樣式設置,但是我創建了一個復合組件來呈現可以關閉的消息,並使用一些Jquery向其中添加效果。

我看過有關如何自定義消息的教程,但是其中大多數都依賴於CSS和自定義文本輸出,但是我想做的是生成特定的標記,例如

<myComp:fancyMessage text="etcetcetc error msg" type="error" />

而不是常規的消息標記。 這可能嗎?

編輯:

我不想樣式化jsf消息。 既不添加背景也不更改其樣式,而是創建我自己的消息html標記。 這里:

http://balusc.blogspot.com/2010/07/using-html-in-jsf-messages.html

我已經找到了如何將html添加到您的消息中。 我想要的是將所有html封裝在我的復合組件中,然后以這種方式使用我的復合組件:

<mycomp:messages/>

要么

<mycomp:message for="componentID" />

消息和消息都創建自己的html標記

ui:repeat使用FacesContext#getMessageList() 每個項目都是一個FacesMessage ,其中包含多個getter。

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

這允許在消息周圍進行更細粒度的HTML標記。


而且,還可以借助<h:outputText escape="false">將它們打印為HTML。 我可能遲早需要擴展和修訂我的博客文章:)

回答如何將您的組件設置為消息呈現器:

您的組件需要擴展HtmlBasicRenderer。

然后可以將渲染器添加到faces-config.xml

<render-kit>
    <renderer>
        <component-family>javax.faces.Messages</component-family>
        <renderer-type>javax.faces.Messages</renderer-type>
        <renderer-class>com.mypackage.MessagesRenderer</renderer-class>
    </renderer>
</render-kit>

我知道已經有一段時間了,但是為了其他人的利益,我想分享這個替代解決方案。 對於復合材料,創建一個具有吸氣劑的支撐組件,然后遍歷faces消息並在收集每條消息后調用remove()。 這將使您繞過“已排隊的消息”警告,而無需h:messages駭客。

xhtml:

<composite:interface displayName="Messages Component"
    shortDescription="Messages Component" componentType="com.company.dept.commons.ui.messages.Messages">
    <composite:attribute name="styleClass" default="" type="java.lang.String" shortDescription="CSS style class for the component" />
</composite:interface>

<composite:implementation>
    <div id="messagesComponent" class="#{cc.attrs.styleClass}">
        <ui:repeat value="#{cc.messageList}" var="message">
            #{message.severity} - #{message.detail}<br/>            
        </ui:repeat>
    </div>
</composite:implementation>

支持組件:

@FacesComponent("com.company.dept.commons.ui.messages.Messages")
public class Messages extends UINamingContainer {

    private List<FacesMessage> messages;

    public List<FacesMessage> getMessageList() {
        //preserve messages in case getter is called multiple times
        if (messages == null) {
            messages = new ArrayList<FacesMessage>();
        }

        Iterator<FacesMessage> messageItr = getFacesContext().getMessages();
        while(messageItr.hasNext()) {
            FacesMessage message = messageItr.next();
            messages.add(message);
            messageItr.remove();
        }
        return messages;
    }       
}

請注意,xhtml中的componentType在代碼中設置為FacesComponent值。 另外,對cc.messageList的引用將觸發對getMessageList()的調用。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM