2010-05-17 10 views
11

Ich erstelle eine einfache menuing zusammengesetzte Komponente in JSF 2. Ich bin jedoch nicht in der Lage, ein String-Attribut in die zusammengesetzte Komponente im Action-Attribut der < h: commandLink > zu übergeben. Meine Komponente wie folgt aussieht:Wie Übergeben einer Aktionszeichenfolge in einer JSF 2-Verbundkomponente?

<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> 

Wie kann ich eine Aktion String in das action-Attribut des < h erhalten: command >?

Antwort

23

Sieht aus wie dies die Horstmanns :-)

zieht

Sie müssen das Attribut "action" nennen und Retargeting verwenden. Dann wird einige spezielle Handhabung Kicks, dass mit erlesener Klarheit beschrieben (nicht) bei

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

und der API doc von ViewDeclarationLanguage.retargetMethodExpressions (nicht Viewhandler), deren Verbindung, die ich nicht erlaubt bin in einzufügen.

Hier ist, wie Sie es tun.

<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

Das ist perfekt, danke Cay - Es ist großartig, dass ein Experte wie du der stackoverflow Community beitrittst! –

+0

Immer auf deinem Spiel, Cay;) Danke! – Lincoln

1

Sie müssen den Typ des Attributs definieren eine Methode wie folgt zu sein:

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

Oder alternativ werden einige Attributnamen speziell in JSF behandelt. Also, wenn Sie das Attribut „action“ nennen sollte es auch ohne die Methodensignatur arbeiten:

<composite:attribute name="action"/> 

Edit: ich falsch verstanden wohl die Frage, ob Sie zu einer Ansicht ID verknüpfen möchten, ohne eine Aktion rufen Sie verwenden Sie die h:link-Tag statt h:commandLink kann:

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

dieser Beide geben eine „Classcast: java.lang.String nicht javax.el.ValueExpression gegossen werden kann“, wenn ein String wie die Ansicht übergeben (oder Aktion). –

+0

Nochmals vielen Dank, aber was ich anstrebe, ist eine zusammengesetzte Komponente, die sich wie eine native Komponente verhält, wobei sie entweder einen String oder eine Methode als Wert des action-Attributs annehmen kann. Vielleicht ist dies mit dem Composite Component Templating einfach nicht möglich, und vielleicht ist dazu die vollständige Komponenten-API erforderlich. –

+0

Auf den zweiten Gedanken, beantwortet Sie meine Frage mit dem Bit über < h: link >. Ich werde eine neue Frage zum Erstellen einer Komponente stellen, die sich wie eine native Komponente verhält. –