2010-05-17 11 views
11

Sto creando un semplice componente composito di menu in JSF 2. Tuttavia, non riesco a passare un attributo String nel componente composito da utilizzare nell'attributo action dello < h: commandLink >. La mia componente si presenta come:Come passare una stringa di azioni in un componente composito 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> 

Come posso ottenere una stringa di azione nella attributo action del < h: commandLink >?

risposta

23

appare come questa attrae i Horstmanns :-)

È necessario denominare l ' "azione" attributo e utilizzare il retargeting. Poi alcuni calci speciali movimentazione a che è descritto con chiarezza squisito (non) a

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

e la documentazione delle API di ViewDeclarationLanguage.retargetMethodExpressions (non ViewHandler) il cui legame non mi è permesso per incollare.

Ecco come lo si fa.

<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

Perfetto, grazie Cay. È fantastico avere un esperto come te che entra a far parte della community di stackoverflow! –

+0

Sempre in cima al tuo gioco, Cay;) Grazie! – Lincoln

1

è necessario definire il tipo di attributo di essere un metodo come questo:

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

Oppure, in alternativa, alcuni nomi degli attributi vengono gestiti soprattutto in JSF. Quindi, se il nome del tuo "azione" attributo dovrebbe funzionare anche senza il metodo-signature:

<composite:attribute name="action"/> 

Edit: probabilmente ho frainteso la questione, se si desidera collegare a un id vista senza chiamare un'azione che si può utilizzare il tag h:link invece di h:commandLink:

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

Entrambi questi invia un "ClassCastException: java.lang.String non può essere gettato a javax.el.ValueExpression" quando una stringa viene passato come la vista (o azione). –

+0

Grazie, ancora una volta, ma quello che sto puntando è la costruzione di un componente composito che si comporta come un componente nativo, per cui può prendere una stringa o un metodo come valore dell'attributo di azione. Forse questo non è semplicemente possibile con il modello di componente composito, e forse l'API completa del componente è necessaria per raggiungere questo obiettivo. –

+0

Ripensandoci, hai risposto alla mia domanda con il numero < h: link >. Pubblicherò una nuova domanda sulla creazione di un componente che si comporta come un componente nativo. –