2010-05-17 44 views
11

我在JSF 2中創建了一個簡單的菜單複合組件。但是,我無法將字符串屬性傳遞到複合組件中,以便在< h:commandLink >的action屬性中使用。我的部分看起來像:如何將操作字符串傳遞給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> 

我怎樣才能得到一個動作串入< H的action屬性:commandLink >?

回答

23

看起來這吸引了Horstmanns :-)

您必須命名屬性「行動」,並使用重新定位。然後,在一些特殊的處理踢在

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

和ViewDeclarationLanguage.retargetMethodExpressions(沒有的ViewHandler),其鏈接不准我在粘貼的API文檔與細膩清晰(不)來描述。

這是你如何做到的。

<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

這很完美,謝謝Cay - 有一位像你這樣的專家加入了stackoverflow社區真是太棒了! – 2010-06-24 16:31:50

+0

永遠在你的遊戲之上,Cay;)謝謝! – Lincoln 2011-11-11 08:33:46

1

您需要定義屬性的類型是這樣的方法:

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

或者,一些屬性名在JSF特殊處理。所以,如果你的名字你的屬性「行動」也應該沒有方法簽名:

<composite:attribute name="action"/> 

編輯:我可能誤解了這個問題,如果你要鏈接到一個視圖id,而無需調用一個動作你可以使用h:link標籤,而不是h:commandLink

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

這兩個都會在String作爲視圖(或動作)傳遞時給出「ClassCastException:java.lang.String不能轉換爲javax.el.ValueExpression」。 – 2010-05-17 22:58:15

+0

再次感謝,但我的目標是構建一個組合組件,其行爲類似於本地組件,因此它可以採用String或Method作爲action屬性的值。也許這對於複合組件模板來說是不可能的,也許完整的組件API是實現這一點所必需的。 – 2010-05-19 16:33:05

+0

關於第二個想法,你回答了我的問題,關於< h:link >。我將發佈一個關於使組件的行爲與本地組件類似的新問題。 – 2010-05-26 18:51:19

相關問題