2011-02-14 232 views
6

我正在使用JSF 2.0。我正在使用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代碼添加到您的郵件。我想是encapsule在我的複合組件中的所有HTML,然後就用我的複合成分以這樣的方式

<mycomp:messages/> 

<mycomp:message for="componentID" /> 

哪裏的消息和消息都建立自己的HTML標記

+0

您的問題非常模糊。你說你已經用一些jQuery創建了一個複合組件,然後你問是否可以創建一個自定義(複合)組件。什麼是具體問題/問題? – BalusC 2011-02-18 00:16:48

+0

@BalusC我只是讀你的博客,偶然發現了這個:http://balusc.blogspot.com/2010/07/using-html-in-jsf-messages.html這不是我正在尋找的。我錯過了那個入口。 – arg20 2011-02-18 01:05:11

+0

我很抱歉我的問題太模糊了。我的意思是我創建了一個複合組件來顯示消息。我需要jsf使用該複合組件來呈現消息。 – arg20 2011-02-18 01:06:51

回答

12

使用FacesContext#getMessageList()裏面ui:repeat。每個項目是一個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標記。


它,您還可以將它們打印爲HTML與<h:outputText escape="false">幫助。我可能需要擴大和修改我的博客文章遲早:)

2

在回答如何設置組件的消息渲染:

你的組件需要延長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> 
1

我知道它已經有一段時間,但想分享給別人的利益這個替代的解決方案。對於組合,使用getter創建一個支持組件,然後遍歷faces消息並在收集每條消息後調用remove()。這會讓你圍繞「消息排隊」警告而不使用h:消息破解。

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的組件類型被設置爲在代碼中FacesComponent值。此外,對cc.messageList的引用將觸發對getMessageList()的調用。

希望這會有所幫助。