2011-02-14 27 views
6

Estoy usando JSF 2.0. Estoy usando elmensajes personalizados JSF 2.0

<h:messages> 

etiqueta para representar los mensajes de error. Puedo usar css para dar estilo a mis mensajes un poco, pero he creado un componente compuesto para representar mensajes que se pueden cerrar y agregarles efectos con Jquery.

que he visto tutoriales sobre cómo personalizar los mensajes, pero la mayoría de ellos se basan en CSS y personalizar la salida de texto sin embargo, lo que quiero hacer es generar el formato específico, algo así como

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

en lugar de el marcado de mensaje regular. ¿Esto es posible?

EDIT:

no quiero para darle estilo a mensajes de JSF. Ni agregar fondo ni cambiar su estilo, sino crear mi propio marcado html de mensaje. Aquí:

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

que he encontrado cómo agregar html en sus mensajes. Lo que yo quiero es encapsular todo el HTML en mi pieza compuesta, y luego simplemente usar mi pieza compuesta de esta manera:

<mycomp:messages/> 

o

<mycomp:message for="componentID" /> 

donde el mensaje y los mensajes tanto para crear su propia marca HTML

+0

Su pregunta es muy vaga. Dijiste que creaste un componente compuesto con jQuery y luego preguntas si es posible crear un componente personalizado (compuesto). ¿Cuál es el problema/pregunta concreto? – BalusC

+0

@BalusC Estaba leyendo su blog y tropecé con esto: http://balusc.blogspot.com/2010/07/using-html-in-jsf-messages.html que no es exactamente lo que estoy buscando. Me perdí esa entrada. – arg20

+0

Pido disculpas por que mi pregunta sea tan vaga. Quise decir que creé un componente compuesto para mostrar mensajes. Necesito jsf para representar mensajes usando ese componente compuesto. – arg20

Respuesta

12

Utilice FacesContext#getMessageList() dentro de ui:repeat. Cada artículo es un FacesMessage que tiene varios captadores.

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

Esto permite un marcado HTML más fino alrededor de los mensajes.


Y también le permite imprimir como HTML con ayuda de <h:outputText escape="false">. Puede ser que necesite para ampliar y revisar mi artículo de blog, tarde o temprano :)

+0

BalusC, lo hice y funciona como un amuleto, excepto por una cosa. Como uso mi propio componente de mensajes (lo llamé: ) jsf no puedo encontrar la etiqueta de los mensajes, por lo que muestra el mensaje al final de la página. Así que termino con dos mensajes renderizados, el que creé y el de jsf. ¿Hay alguna forma de suprimir la advertencia o registrar mi componente como un procesador de mensajes? – arg20

+1

Si se refiere a la advertencia de desarrollo de que los mensajes están en cola y no se muestran, entonces lo siento, no lo sé en este momento. Sin embargo, esto no aparecerá cuando la etapa del proyecto no esté configurada para desarrollo. Es posible que desee hackear esto con un ' '. – BalusC

2

En respuesta a cómo configurar el componente como mensaje de procesador:

Su componente necesita para extender HtmlBasicRenderer.

A continuación, puede añadir su procesador para 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> 
+0

Oye, mi componente compuesto no se extiende desde UIComponent, lo he definido en un archivo xhtml. ¿No hay forma de hacerlo sin crear una clase Java como un renderizador personalizado? – arg20

+1

@ arg20 Por el momento no sé una alternativa. Solo empecé a migrar un proyecto bastante grande de 1.2 a 2.0 hace algunas semanas. Si puedo encontrar algo sobre este tema, seguramente se lo haré saber. – Chris

1

Sé que ha pasado un tiempo, pero pensé que compartir esta solución alternativa para el beneficio de otros. Para compuestos, cree un componente de respaldo con un getter, luego repita los mensajes de caras y llame a remove() después de recopilar cada mensaje. Esto lo guiará en la advertencia de "mensajes en cola" sin el hack de 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> 

componente de soporte:

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

Nota del componentType en el XHTML se establece en el valor FacesComponent en el código. Además, la referencia a cc.messageList activará la llamada a getMessageList().

Espero que esto ayude.

Cuestiones relacionadas