[英]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.