2012-08-17 6 views
8

Tengo un caso de uso en el que tengo que usar el paquete de recursos para mostrar varios textos en la interfaz de usuario. Algunas de estas entradas del paquete de recursos toman parámetros (por ejemplo, {0}), para estos utilizo h: outputFormat, pero a veces eso no es suficiente.Cómo utilizar el Formulario de mensaje parametrizado con atributos sin valor de los componentes JSF

p. Ej.

someMessage=Display this message with param {0} 

en un paquete de recursos.

para mostrarla en XHTML que normalmente hago:

<h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat> 

que funciona bien cuando es un caso simple, pero para los casos de uso más complejos que no es suficiente. Por ejemplo si quiero que el atributo 'title' de un commandLink utilizar la entrada anterior paquete de recursos:

<h:commandLink action="logout" title="#{msg['someMessage']}"> 
     <f:param value="#{someBean.value}" /> 
     <h:graphicImage library="images" name="image.png" /> 
    </h:commandLink> 

que no funciona. También probé:

<h:commandLink action="logout"> 
     <f:attribute name="title"> 
      <h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat> 
     </f:attribute> 
     <h:graphicImage library="images" name="image.png" /> 
    </h:commandLink> 

que también no funciona ya que F: attibute no permite que los niños.

Incluso si hay un truco para eludir esto (por ejemplo, usar el componente de desplazamiento de las superficies de contacto) hay otros campos que pueden requerir un mensaje parametrizado.

¿Alguien sabe de una forma de usar MessageFormat que toma un argumento en un campo sin valor de un componente JSF?

+0

Pregunta similar: http://stackoverflow.com/questions/5697189/pass-parameters-to-messages-from-resource-bundle-to-components-other-thhan-hou – Adam

+0

Esa es una pregunta diferente ya que esa es con respecto al atributo ** value **, que es sencillo de manejar (respondí la pregunta). Una forma de utilizar MessageFormat parametrizado con atributos ** sin valor ** es lo que estoy buscando. – Zak

Respuesta

6

Se puede crear a custom EL function de este con el que puede en última instancia, terminar como:

<h:commandLink ... title="#{my:format(msg['someMessage'], someBean.value)}" /> 

Puede utilizar la API de MessageFormat para realizar el trabajo, tal y como está haciendo <h:outputFormat> bajo las sábanas.

Una alternativa es crear un componente personalizado que haga lo mismo que el buen 'ol <fmt:message> de JSTL que admite un atributo var para exportar el mensaje formateado al ámbito EL.

<my:outputFormat ... var="linkTitle"> 
    ... 
</my:outputFormat> 
<h:commandLink ... title="#{linkTitle}" /> 

actualización: biblioteca de utilidades JSF OmniFaces tiene #{of:formatX()} funciones y un componente <o:outputFormat> para el mismo propósito.

+0

El problema con este enfoque es que requiere un nuevo método si su formato de mensaje toma 2 parámetros, y otro método más para uno que toma 3 parámetros, etc. ¿Hay una manera más elegante de hacer esto? De lo contrario, debería agregarse a versiones futuras de JSF, ya que es algo que debería ser respaldado por defecto. – Zak

+0

No. EL no admite varargs (tampoco nombres de funciones sobrecargados, por lo que realmente necesita 'format1()', 'format2()', 'format3()', etc.). Tenga en cuenta que esto no es una limitación de JSF, sino una limitación de EL. Simplemente cree funciones que toman de 1 a 5 parámetros, o tal vez 10.Personalmente, nunca he creado/visto en el mundo real una entrada de paquete con más de 5 parámetros por cierto. – BalusC

+0

No, lo que creo que se requiere es una forma de usar f: attribute con los niños. De esta forma, puede establecer el nombre de f: atributo en el nombre del atributo para usar messageFormat (por ejemplo, título) y su elemento secundario puede ser h: outputFormat (mi segundo intento anterior es un buen ejemplo de esto). Eso haría que messageFormat se pueda usar en cualquier lugar, siempre y cuando todos los componentes puedan tener un hijo f: attribute. – Zak

Cuestiones relacionadas