2010-05-17 13 views
11

Estoy creando un componente compuesto de menú simple en JSF 2. Sin embargo, no puedo pasar un atributo de cadena en el componente compuesto para usar en el atributo de acción del < h: commandLink >. Mi componente se parece a:¿Cómo pasar una cadena de acción a un componente compuesto JSF 2?

<composite:interface> 
    <composite:attribute name="title" required="true" type="java.lang.String"/> 
    <composite:attribute name="view" required="true" /> 
</composite:interface> 

<!--implementation--> 
<composite:implementation> 
    <li><h:commandLink action="#{cc.attrs.view}" value="#{cc.attrs.title}" /></li> 
</composite:implementation> 

¿Cómo puedo obtener una cadena de acción en el atributo de acción de la < h: commandLink >?

Respuesta

23

Parece que esto atrae a los Horstmanns :-)

debe nombrar el atributo de "acción" y utilizar el retargeting. A continuación, algunas patadas de manejo especial en que se describe con claridad exquisita (no) en

http://docs.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/composite/attribute.html

y la documentación del API de ViewDeclarationLanguage.retargetMethodExpressions (no ViewHandler) cuyo vínculo no se me permite pegar en.

Así es como lo haces.

<composite:interface> 
    <composite:attribute name="title" required="true" type="java.lang.String"/> 
    <composite:attribute name="action" targets="view" required="true" /> 
</composite:interface> 

<!--implementation--> 
<composite:implementation> 
    <li><h:commandLink id="view" value="#{cc.attrs.title}" /></li> 
</composite:implementation> 
+3

Eso es perfecto, gracias Cay - ¡Es genial tener un experto como usted para unirse a la comunidad de stackoverflow! –

+0

Siempre en la cima de su juego, Cay;) ¡Gracias! – Lincoln

1

es necesario definir el tipo del atributo a ser un método como este:

<composite:attribute name="view" method-signature="java.lang.String f()"/> 

O, alternativamente, algunos nombres de atributo se manejan especialmente en JSF. Así que si el nombre de su atributo de "acción" también debería funcionar sin el método de firma:

<composite:attribute name="action"/> 

Editar: probablemente no he entendido bien la pregunta, si desea vincular a una vista Identificación sin llamar a una acción que puede utilizar la etiqueta h:link en lugar de h:commandLink:

<h:link outcome="#{cc.attrs.view}" value="#{cc.attrs.title}"/> 
+0

Ambos dar un "ClassCastException: java.lang.String no se puede convertir a javax.el.ValueExpression" cuando una cadena se pasa como la vista (o acción). –

+0

Gracias, una vez más, pero lo que pretendo es construir un componente compuesto que se comporte como un componente nativo, por lo que puede tomar una cadena o un método como el valor del atributo de acción. Tal vez esto simplemente no sea posible con la creación de plantillas de componentes compuestos, y quizás la API de componentes completos sea necesaria para lograr esto. –

+0

Pensándolo bien, respondió mi pregunta con el bit de < h: enlace >. Publicaré una nueva pregunta sobre cómo hacer un componente que se comporte como un componente nativo. –

Cuestiones relacionadas