2010-08-17 62 views
4

我有興趣在JSF中創建動態組件。我的意思是一個組件的外觀和行爲依賴於它傳遞的變量。JSF中的動態組件

讓我們來看一個實際工作的簡單例子。根據數據隱藏/顯示其自身不同部分的複合組件(facelet)。在這種情況下,它需要一個名爲「myBean」的屬性,您可以想象它具有「值」字段和「類型」字段。 「類型」字段確定應該呈現哪個組件。

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:jsp="http://java.sun.com/JSP/Page" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:cc="http://java.sun.com/jsf/composite"> 

    <cc:interface> 
     <cc:attribute name="myBean" /> 
    </cc:interface> 

    <cc:implementation> 

     <!-- Small input field if type is "shorttext" --> 
     <h:inputText value="#{myBean.value}" rendered="#{myBean.type == 'shorttext'}" /> 

     <!-- Text area input field if type is "longtext" --> 
     <h:inputTextArea value="#{myBean.value}" rendered="#{myBean.type == 'longtext'}" /> 

    </cc:implementation> 
</html> 

雖然這個工作,它很快變得笨拙。如果我有二十種不同的類型,我將它們全部在同一份文件中指定,明顯違反了良好的設計。

相反,我希望能夠與像更換執行:

<ui:include value="#{myBean.type}"/> 

我的理解是不可能的,因爲建築組件樹時出現ui:include,而該組件在處理渲染階段。

然而,這一定是一個常見問題。什麼是實現動態組件的最佳方法?我正在使用JSF 2.0,如果這有所作爲。

回答

2

我沒有看到更好的方法。 XML不是OO語言。這是您用XML獲得的最好結果。如果你想以OO的方式來做,那麼你應該用渲染器創建一個真實的組件。

順便說一下,複合組件是在JSF 2.0中引入的,因此在JSF 1.x中不可用。所以它沒有太大的區別;)

+0

你知道,我自己也得出了同樣的結論。看起來,在動態修改組件樹的過程中,這種方法甚至可能會帶來好處:即使組件樹位於ui:repeat(fly-weight模式)中,組件樹也只會是一次。 +1,但現在我將把問題留給公開。 – waxwing 2010-08-17 12:05:09