2011-02-14 19 views
6

JSF 2.0 kullanıyorum. Hata iletilerini görüntülemek içinJSF 2.0 özel mesajlar

etiketini kullanıyorum. Mesajlarımı biraz özellestirmek için css'yi kullanabilirim ancak kapatılabilen ve bazı JQuery'lerle efektler ekleyen mesajları oluşturmak için bir bileşik bileşen oluşturuyorum.

Ben ne yapmak istiyorum, belirli biçimlendirme oluşturmak yerine

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

gibi bir şey iletileri özelleştirmek, fakat bunların çoğu css ve henüz metin çıktısı özelleştirme güvenmek konusunda derslerinin, gördüğüm normal mesaj işaretlemesi. Bu mümkün mü?

DÜZENLEME: jsf iletileri stil istemiyoruz

. Ne arka plan ekleyin ne de stilini değiştirin, ancak kendi mesaj html biçimlendirmemizi oluşturun. İşte:

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

Ben mesajlarınıza html nasıl ekleneceğini buldum.

<mycomp:messages/> 

veya

<mycomp:message for="componentID" /> 

mesaj ve iletileri hem kendi html işaretlemeyi oluşturun: Benim istediğim benim kompozit bileşende tüm html encapsule ve sonra sadece bu şekilde benim kompozit bileşeni kullanmaktır

+0

Sorunuz çok belirsiz. Bazı jQuery ile birleşik bir bileşen oluşturduğunuzu ve sonra özel (bileşik) bir bileşen oluşturmanın mümkün olup olmadığını sorduğunuzu söylemiştiniz. Somut problem/soru nedir? – BalusC

+0

@BalusC Sadece blogunuzu okuyordum ve bunun üzerine tökezledim: http://balusc.blogspot.com/2010/07/using-html-in-jsf-messages.html tam olarak aradığım şey değil. Bu girişi özledim. – arg20

+0

Sorumluluktan dolayı çok belirsiz olduğum için özür dilerim. Mesajları görüntülemek için kompozit bir bileşen oluşturdum. Bu kompozit bileşeni kullanarak mesaj oluşturmak için jsf'ye ihtiyacım var. – arg20

cevap

12

ui:repeat'un içinde FacesContext#getMessageList()'u kullanın. Her öğe, çeşitli alıcılara sahip olan FacesMessage'dur.

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

Bu, iletilerin çevresinde daha ince taneli HTML biçimlendirmesine izin verir.


Ve aynı zamanda <h:outputText escape="false"> yardımıyla HTML olarak bunları yazdırmak sağlar.

Kişisel bileşeni HtmlBasicRenderer uzatmak gerekir: Ben genişletmek ve er ya da geç bloguma maddesini gözden :)

+0

BalusC, yaptım ve bir şey hariç, bir çekicilik gibi çalışıyor. Kendi mesajlar bileşenimi kullandığım için (onu isimlendirdim: ) jsf mesajın etiketini bulamıyor, böylece sayfanın sonundaki mesajı görüntüler. Bu yüzden yarattığım iki mesajla, yarattığım mesajla ve jsf ile bitiyor. Uyarıyı bastırmak veya bileşenimi mesaj oluşturucu olarak kaydetmek için zaten var mı? – arg20

+1

Mesajların sıraya alındığını ve görüntülenmediğini gösteren geliştirme uyarısını kastediyorsanız, şu anda bilmiyorum üzgünüm. Ancak bu, proje aşaması gelişime ayarlanmadığında görünmeyecektir. Bunu '. – BalusC

2

mesaj oluşturucunuz olarak bileşeni nasıl ayarlanacağı cevap olarak gerekebilir.

Sonra ben bir süre oldu biliyorum ama başkalarının yararına bu alternatif çözüm paylaşmak için düşünülen yüzler-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> 
+0

Hey, kompozit bileşenim UIComponent'ten genişlemiyor, bir xhtml dosyasında tanımladım. Özel oluşturucu olarak java sınıfı oluşturmadan bunu yapmanın bir yolu yok mu? – arg20

+1

@ arg20 Şu anda bir alternatif bilmiyorum. Sadece birkaç hafta önce 1.2'den 2.0'a kadar oldukça büyük bir proje geçiren startet. Bu konuda bir şeyler bulabilirsem, bilmene emin olurum. – Chris

1

için oluşturucusunu ekleyebilir. Kompozitler için, bir alıcı ile bir destek bileşeni oluşturun, daha sonra yüzler iletilerini yineleyin ve her bir iletiyi topladıktan sonra kaldır() öğesini çağırın. Bu, h: mesajlar kesilmeden "sıraya alınmış" uyarıları konusunda sizi bilgilendirir.

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> 

Taban bileşeni: XHTML'de componentType kodu FacesComponent değerine ayarlanır

@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; 
    }  
} 

not edin. Ayrıca, cc.messageList referansı, getMessageList() çağrısını tetikleyecektir.

Bu yardımcı olur umarım.