2010-11-01 56 views
3

編輯的問題將JSF 2複合組件...在運行時從後臺bean

你好,

我想加載從後臺bean我複合元件的.xhtml文件,並將其添加到動態的頁面。 .xhtml文件的名稱來自一個變量。

例:

public MyBean(){ 

    String componentFile = "myCompositeComponent.xhtml" 

    public String addComponentToPage(){ 

      //how do that?... 

      return null; 
    } 

} 

謝謝!

+2

關鍵是,這個問題並沒有什麼意義。 [複合組件](http://download.oracle.com/javaee/6/tutorial/doc/giqzr.html)僅適用於XHTML,不適用於Java代碼。 「CCPageLoader」的代碼看起來完全不清楚,所以不可能猜測/理解你實際上的含義。在解決術語和/或提供一些代碼以便更好地理解問題之前,這個問題將一直沒有答案。 – BalusC 2010-11-14 13:00:23

+0

嗨BalusC,我想要做的:加載複合組件的xhtml文件,並將其添加到頁面。這需要通過頁面的後臺bean來完成。感謝幫助。 – Fabio 2010-11-15 07:54:34

+0

[如何以編程方式或動態創建JSF 2中的複合組件](http://stackoverflow.com/questions/5370184/how-to-programmatically-or-dynamically-create-a-composite-component-in -jsf-2) – sleske 2013-11-08 15:57:10

回答

5

無法可能。複合組件是基於模板的,只能在視圖中使用。你最好的選擇是準確地重複你最初寫在模型中複合組件中的JSF代碼。更好的辦法是創建一個完整的@FacesComponent類,它延伸UIComponent,完成@FacesRenderer。誠然,這是一件乏味且不透明的工作,但這樣你最終會得到一個組件,它可以通過單一代碼行在視圖和模型中重複使用。

另一種替代方法是將所有可能的組件放置在視圖中並使用rendered屬性。

<my:component1 rendered="#{bean.myComponentType == 'component1'}" /> 
<my:component2 rendered="#{bean.myComponentType == 'component2'}" /> 
<my:component3 rendered="#{bean.myComponentType == 'component3'}" /> 
... 

如果需要,將其包裹在Facelets標記文件中,以便它可以隱藏並在多個位置重用。

+0

非常感謝!所以我可以理解,JSF中的複合組件與其他語言/框架(如.ascx文件(.net)或.mxml(Flex)中的「複合組件」實際上是不同的......我閱讀了文章和文檔,但是這方面還不夠清楚。 – Fabio 2010-11-16 11:53:13

+0

你是否檢查過這個:http://forums.java.net/node/701640用戶'lexi'研究/描述了一些方法。儘管他遇到了困難,但他表示他提出了一個可行的解決方案(請參閱第二篇最後一篇文章),但不幸的是這個解決方案有點神祕。最後的消息描述了Ed Burns也提出的另一個更簡單的選擇。但是,根據相同的帖子,它不起作用。對這些方法有什麼想法? – 2010-11-23 14:53:59

+0

@Tuukka:有趣。但這很糟糕,並且不是由JSF API提供的(因此JSF-impl特定)。 – BalusC 2010-11-23 15:06:51

0

我不明白你爲什麼要添加一個支持bean的複合組件。我想你想在事件發生時動態顯示它,但爲此還有AJAX reRender。

例如,你可以做到以下幾點:

<h:panelGroup id="composite" rendered="#{myBean.renderComponent}"> 
    <my:compositecomponent/> 
</h:panelGroup> 

renderComponent屬性存儲boolean值。您可以將該值和reRender composite切換爲例如Richfaces的<a4j:commandLink>

希望幫助,丹尼爾

+0

對不起,我可以做到這一點,但我不知道組件的名稱,該名稱來自一個字符串變量... – Fabio 2010-11-15 07:53:27

+0

我認爲你想要做的事反對基本的設計概念。我想你應該考慮另一種解決問題的方法。 – 2010-11-15 20:10:12

+2

很容易想出你想要這樣做的情況(從Java代碼中調用複合組件)。例如,考慮一個將構建長/複雜DOM結構的組件。通常情況下,您會將其作爲複合組件實現,但在某些情況下,它們不僅具有足夠的靈活性,而且還可以擴展UIComponent並使用ResponseWriter。但是,在UIComponent中執行復雜的邏輯並調用複合組件(模板)來實際構建(大部分)UI將會更好。當您切換到Java代碼時,您遇到UIComponents:/ – 2010-11-23 14:31:46